본문 바로가기

Development/DB, JPA

NULL 제약 조건과 조인 전략

JPA는 매핑관계의 필수 여부에 따라 실제 데이타베이스로 보내는 SQL 구문이 달라진다

선택적 관계

  @Entity
  public class Member {
    //...
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "teamId")
    private Team team;
    //...
  }

@ManyToOneoptional 속성이 true (default) 이거나 @JoinColumnnullable 속성이 true(default) 인 경우에는 Team이 없는 Member도 조회될 것을 보장해야 하기 때문에 Outer Join 을 수행한다.

  SELECT *
  FROM Member m left outer join Team t
  ON m.teamId = t.teamId

필수 관계

  @Entity
  public class Member {
    //...
    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "teamId")
    private Team team;
  
    /** 또는
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "teamId", nullable = false)
    private Team team;
    */
    //...
  }

@ManyToOneoptional 속성 또는 @JoinColumnnullable 속성이 false 인 경우라면, Team이 없는 Member는 없다는 제약조건이 생기므로 Inner Join을 수행할 수 있다. 따라서 Inner Join을 수행한다.

  SELECT *
  FROM Member m join Team t
  ON m.teamId = t.teamId

일반적으로 Outer Join 보다 Inner Join이 성능과 최적화에서 더 유리하기 때문에 관계 설정 시 잘 고려해야한다.