JPA 면접 질문 모음

참고

백엔드개발 spring 스프링 기술면접)IT 서비스 탑티어 회사 신입개발자 spring 단골 질문

Backend-Interview-Question

[기술 면접 준비 - 2일차] Spring Framework && Database

[실무 면접 준비 - 8] Spring Framework



📌 ORM

❓ ORM; Object-Relational-Mapping 객체-관계-매핑이란?

image

❓ Persistence Context 영속성 컨텍스트란?

❓ JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.

영속성 컨텍스트를 쓰는 이유는 1차 캐시, 동일성 보장, 쓰기 지연, 변경감지(Dirty checking), 지연로딩이 있습니다.

1차 캐시

동일성 보장

쓰기 지연

변경 감지(Dirty checking)

지연 로딩

cf) 참고: 즉시로딩(Eager Loading) / 지연로딩(Lazy Loading)

❓ JPA의 특징에 대해 설명해주세요.

❓ JPA를 쓴다면 그 이유에 대해서 설명해주세요.

❓ JPA의 한계점에 대해 설명해주세요. (Mybatis와 연관)

❓ JPA Propagation 전파단계를 설명해주세요.

❓ N + 1 문제는 무엇이고 이것이 발생하는 이유와 이를 해결하는 방법을 설명해주세요.

해결 방법

❓ Fetch Join, EntityGraph를 사용할 때 주의할 점은 무엇인가요?

FetchJoin과 EntityGraph는 공통적으로 카테시안 곱(Cartesian Product)이 발생 하여 중복이 생길 수 있습니다.

※ 카테시안 곱 : 두 테이블 사이에 유효 join 조건을 적지 않았을 때 해당 테이블에 대한 모든 데이터를 전부 결합하여 테이블에 존재하는 행 갯수를 곱한만큼의 결과 값이 반환되는 것

카테시안 곱(Cartesian Product)을 일이키는 Cross Join 카테시안 곱이 일어나는 Cross Join은 JPA 기능 때문이 아니라, 쿼리의 표현에서 발생하는 문제이다.

Cross Join이 일어나는 조건 Join 명령을 했을 때 명확한 Join 규칙이 주어지지 않았을 때, join 이후 on 절이 없을 때, db는 두 테이블의 결합한 결과는 내보내야겠고, 조건이 없으니 M * N으로 모든 경우의 수를 출력하는 것이다.

JPA는 사용자가 보내준 코드를 해석해서 최적의 sql 문장을 조립하는데, 이 때 코드가 얼마나 연관관계를 명확히 드러냈냐에 따라 발생 할 수도 안 할 수도 있다.

Fetch Join과 @EntityGraph의 기능은 ‘Cross Join을 만들어라’ 나 ‘Inner Join을 만들어라’ 가 아니고,

‘연관관계 데이터를 미리(EAGER) 함께 가져와라’ 인 만큼 중복을 제거해야 합니다.

=> 이런 중복 발생 문제를 해결하기 위해서 DISTINCT 또는 Set 자료구조를 사용하면 됩니다.

  1. JPQL에 DISTINCT 를 추가하여 중복 제거 @Query(“select DISTINCT o from Owner o join fetch o.pets”) List findAllJoinFetch(); @EntityGraph(attributePaths = {"pets"}) @Query("select DISTINCT o from Owner o") List findAllEntityGraph();
  2. OneToMany 필드 타입을 Set으로 선언하여 중복 제거 @OneToMany(mappedBy = “owner”, fetch = FetchType.EAGER) private Set pets = new LinkedHashSet<>(); (Set은 순서가 보장되지 않는 특징이 있지만, 순서 보장이 필요한 경우 LinkedHashSet을 사용하자.)