[DataBase] JPA 관련질문 (꼬꼬무 대비 정리)
1. JPA란 무엇인가요?
JPA는 자바 진영의 ORM 기술 표준으로 사용되는 인터페이스 모음입니다
DB와 객체지향 개발을 연결해주어
두 분야의 개발이 독립적으로 이루어 질 수 있게
해주는 역할을 하며 쿼리를 직접 작성하지 않아도 되어
유지보수와 생산성을 높일 수 있습니다
따라서 객체 중심적인 개발을 할때 사용합니다
2. ORM이란 무엇인가요?
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말합니다
이를 이용해 패러다임 불일치를 개발자 대신 해결해줍니다
3. JPA의 장점과 단점을 설명해주세요
객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중이 가능합니다
쿼리를 직접 작성하지 않아서 생산성과 유지보수성이 올라가고
특정 데이터베이스에 종속되지 않다는 장점이 있습니다
단점으로는 개발자가 의도하지 않은 자동으로 생성된 쿼리로 인해
성능이 저하될 수 있고 복잡한 상황에서는 직접 쿼리를 쓰는게
나을 수 있는것이 단점이라고 볼 수 있습니다
4. JPA N + 1 문제와 발생하는 이유 그리고 해결하는 방법을 설명해주세요
N+1이란 1번의 쿼리를 날렸을 때 의도하지 않은 N번의 쿼리가 추가적으로 실행되는 것을 의미합니다
해결 방법에는 여러 방법이 있지만 가장 많이 사용되는 방법은 Fetch Join을 사용해 해결하는 방법입니다
N+1 문제가 발생하는 이유는 연관관계를 가진 엔티티를 조회할 때 한 쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문인데,
Fetch Join을 사용하면 미리 두 테이블을 Join하여 한 번에 모든 데이터를 가져오기 때문에 N+1문제를 애초에 막을 수 있습니다
5. JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?
일단 JPA 자체는 정적인 상황에서 사용하는걸 권장하기 때문에
복잡한 쿼리와 동적인 쿼리에 대한 문제가 발생할 때는 JPQL과 Querydsl을 사용할 것을 권장하고 있습니다
6. JPA의 더티채킹은 무엇인가요?
jpa에서 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를
DB에 자동 반영시켜주는것을 말합니다
이는 jpa에서 엔티티를 최초로 조회한 상태를 스냅샷으로 만들어두고
트랜잭션이 끝나는 시점에 스냅샷과 비교해서 다른점이 있으면
update query를 DB로 전달합니다 이는 영속성 컨텍스트가
관리하는 엔티티에만 적용된다는 점도 유의해야합니다
7. 영속성 컨텍스트란 무엇인가요?
엔티티를 영구 저장하는 환경이라는 뜻입니다
애플리케이션과 데이터베이스 사이에서
객체를 보관하는 가상의 데이터베이스 같은 역할을 합니다
엔티티 매니저를 통해 엔티티를 저장하거나 조회하면
엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리합니다
8. 플러시는 무엇인가요?
영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는것 입니다
영속성 컨텍스트의 엔티티를 지우는 것이 아니라
변경 내용을 데이터베이스에 동기화 하는 것입니다
9. Hibernate는 무엇인가요?
JPA 구현체의 한 종류입니다
JPA가 DB와 자바 객체를 매핑하기 위한 인터페이스이고
Hibernate는 이를 구현한 라이브러리입니다
10. Spring Data JPA는 무엇인가요?
JPA를 편하게 쓰기 위한 모듈입니다
엔티티매니저가 아닌 레포지토리를 정의하여 사용합니다
물론 레포지토리 내부적으로는 엔티티매니저를 사용합니다