일대다[1:N]

PPakSSam·2022년 1월 6일
0
post-thumbnail

단방향

[Member]

@Entity
public class Member {
	
    @Id @GeneratedValue
    @Column(name="MEMBER_ID")
    private Long id;
    
    @Column(name="USERNAME")
    private String username;
    
    // getter, setter...
}

[Team]

@Entity
public class Team {

    @Id @GeneratedValue
    @Column(name="TEAM_ID")
    private Long id;
    
    @Column(name="NAME")
    private String name;
    
    @OneToMany
    @JoinColumn(name="TEAM_ID")
    private List<Member> members = new ArrayList<>();
    
    // getter, setter..
}

[JpaMain]

Member member = new Member();
member.setUsername("member1");
em.persist(member);

Team team = new Team();
team.setName("teamA");
team.getMembers().add(member);
em.persist(team);

[JpaMain 실행시 나가는 쿼리]

INSERT INTO MEMBER (USERNAME, MEMBER_ID) VALUES ('member1', 1);
INSERT INTO TEAM (NAME, TEAM_ID) VALUES ('teamA', 1);
UPDATE MEMBER SET TEAM_ID = 1 WEHRE MEMBER_ID = 1;

정리

  • 일대다 단방향은 일대다(1:N)에서 일(1)이 연관관계의 주인이다.
  • 테이블의 일대다 관계는 항상 다(N)쪽에 외래키가 있다.
  • 객체와 테이블의 차이 때문에 엔티티가 반대편 테이블의 외래키를 관리하는 특이한 구조이다.
  • @JoinColumn을 꼭 사용해야 한다. 그렇지 않으면 조인테이블을 만들어 사용하는 방식을 취한다.

단점

  • 엔티티가 관리하는 외래키가 다른 테이블에 있다.
  • 연관관계 관리를 위해 추가로 UPDATE SQL을 실행한다.
일대다 단방향 매핑보다는 다대일 양방향 매핑을 사용하자!! (훨씬 직관적이다)

참고

JPA 관련 강의도 그렇고 관련 글을 보면 양방향 연관관계보다 단방향 연관관계를 권장하고 있다. 그런데 이는 반은 맞고 반은 틀린 주장이다.
정확히는 다대일(N:1)의 단방향 연관관계를 권장하고 있는 것이다.
이는 양방향보다 단방향이 좋다?편에서 확인할 수 있다.

profile
성장에 대한 경험을 공유하고픈 자발적 경험주의자

0개의 댓글