Spring/JPA

태태개발일지 - JPA 연관관계

태태코 2024. 11. 14. 13:49
반응형

OneToMany

 

JPA강의를 듣다 보니 ManyToOne을 반대쪽으로 설정하면 OneToMany다라고 생각했는데 One인 곳이 연관관계의 주인이 되는 OneToMany가 있다는 것을 인지한 후 글로 정리한다.

 

@Entity
public class Member{
	@ID
	private Long id
	
}

 

@Entity
public class Team{
	
    @Id
    private Long id;
	
}

 

다음과 같이 엔티티를 보았을 때 Member와 Team은 N:1 관계이다.

DB에는 Member에 Team의 외래키가 들어있는 상황.

 

Member를 연관관계의 주인으로 보았을 땐 Member에 JoinColum을 두고 관계를 맺으면 깔끔하다.

근데 Member에서는 Team에 대한 데이터를 다루고 싶지 않을 때 우리는 Team을 연관관계의 주인으로 두고 관계를 맺을 수 있다.

 

@Entity
public class Team{
	
    @Id
    private Long id;
    
    @OneToMany
    @JoinColumn(name = "TEAM_ID")
    private List<Member> members;
	
}

 

다음과 같이 @JoinColumn 을 1인 곳에 넣게되면 연관관계의 주인이 되고.

members.add(member); 를 하게되면, 팀과 맴버 모두 생성되게 된다.

 

단점:

Team을 통해서 Member에 값을 넣게되면, 우선 Team에 데이터를 넣는 Query문 하나가 생성되고, Member에 있는 PK에 값을 넣어주는 Query가 한번 생성이 되기때문에 두번의 쿼리가 생성된다.

 

 

또한, 이렇게되면 Member class에서 Team에 대한 조회를 하는 것이 불가능해 진다.

 

해결 방법은

@Entity
public class Member{
	@ID
	private Long id
    
    @JoinColumn(name = "TEAM_ID" , insertable=false, updatable=false)
    private Team team;
	
}

 

이렇게 하면 Member에서 Team을 단순조회용으로 사용할 수 있다.

 

하지만 결론은 OneToMany를 연관관계의 주인으로 쓰고싶다면, 그냥 ManyToOne을 연관관계의 주인으로 쓰고 OneToMany와 함께  단방향으로 서로 연결해주는게 옳은 방법이다.

 

 

반응형