JPA 엔티티 매니저와 영속성 컨텍스트의 관계

1️⃣ 엔티티 매니저(EntityManager)란?

2️⃣ 영속성 컨텍스트(Persistence Context)란?

3️⃣ 트랜잭션 관리

4️⃣ N+1 문제

N+1 문제 정의

한 번의 조회로 주 엔티티 “N개”를 가져왔을 때, 각각의 연관 엔티티를 다시 조회하는 쿼리가 “N번” 추가 실행되어 총 (1 + N)번의 쿼리가 발생하는 현상

public void printTeamMembers(EntityManager em) {
    List<Team> teams = em.createQuery("SELECT t FROM Team t", Team.class)
                          .getResultList(); // 1️⃣ 1번 쿼리 (Team 전체 조회)

    for (Team team : teams) {
        System.out.println("Team: " + team.getName()); // 2️⃣ N(팀수)번 쿼리 발생
        for (Member member : team.getMembers()) {
            System.out.println("   Member: " + member.getUsername());
        }
    }
}

⬇️

for (Member member : team.getMembers()) {
    System.out.println("   Member: " + member.getUsername());
}
// 여기서 다음과 같은 쿼리 발생 SELECT * FROM member WHERE team_id = ?

👉 여기서 무슨 일이 벌어지냐면?

  1. SELECT * FROM team → 팀 전체 조회 (1번)
  2. 각 팀마다 SELECT * FROM member WHERE team_id = ? 쿼리 발생 (팀 수 만큼 N번)

N+1 문제 발생 원인