미운 오리 새끼의 우아한 개발자되기

[JPA] 다양한 연관관계 매핑 (1) 다대일 본문

Spring & Spring Boot/Spring

[JPA] 다양한 연관관계 매핑 (1) 다대일

Serina_Heo 2023. 4. 11. 21:12

엔티티의 연관관계를 매핑할 때 주의할 사항 3가지

  • 다중성 - 다대일, 일대다, 일대일, 다대다
  • 단방향, 양방향
  • 연관관계의 주인

1. 다대일

다대일 관계의 반대방향은 항상 일대다 관계다. DB 테이블의 일(1) 대 다(N) 관계에서 외래 키는 항상 다(N) 쪽에 있다. 따라서 객체 양방향 관계에서 연관관계의 주인은 항상 다(N) 쪽이다.

1. 1. 다대일 단방향[N:1]

@Entity
public class Member {
	
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private String id;
    
    private String username;
    
    // 연관관계 매핑
    @ManyToOne // 다(Member)대일(Team)
    @JoinColumn(name = "TEAM_ID") // 외래키를 매핑할 때 쓰는 annotation. 매핑할 외래키 이름을 씀
    private Team team;
    
    // Getter, Setter...

}
@Entity
public class Team {
	
    @Id @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String name;
        
    // Getter, Setter...

}

다(N) 인 회원은 Member.team 으로 팀 Entity를 조회할 수 있음. 일(1)인 팀은 회원 Entity 조회 불가.

 

1. 2. 다대일 양방향[N:1, 1:N] 

@Entity
public class Member {
	
    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    
    private String username;
    
    // 연관관계 매핑
    @ManyToOne // 다(Member)대일(Team)
    @JoinColumn(name = "TEAM_ID") // 외래키를 매핑할 때 쓰는 annotation. 매핑할 외래키 이름을 씀
    private Team team;
    
    // 연관관계 설정
    public void setTeam(Team team) {
    	this.team = team;
        
        // 무한루프에 빠지지 않도록
        if(!team.getMembers().contains(this)) {
        	team.getMembers().add(this);
        }
    }
    
    // Getter, Setter...

}
@Entity
public class Team {
	
    @Id @GeneratedValue
    @Column(name = "TEAM_ID")
    private Long id;
    
    private String name;
        
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<Member>();
    
    public void addMember(Member member) {
    	this.members.add(member);
        
        if(member.getTeam() != this) { // 무한루프에 빠지지 않도록 체크
        	member.setTeam(this);
        }
     }
     
    // Getter, Setter...

}
  • 양방향은 외래키가 있는 쪽인 연관관계의 주인이다.
  • 양방향 연관관계는 항상 서로를 참조해야한다.
    • 연관관계 편의 메서드는 양쪽 다 작성하면 무한루프에 빠지므로 주의할 것.

 

Reference : 자바 ORM 표준 JPA 프로그래밍 (김영한 저)