본문 바로가기
프로그래밍/JPA

[JPA] 연관관계 매핑[실무]

by 노잼인간이라불립니다 2022. 7. 26.

JPA를 사용하는 프로젝트에서 연관관계 매핑을 해야하는 일이 생겼다. JPA강의를 들을 때만해도 굉장히 쉬웠고, 포트폴리오를 작성할 때도 간단하게 넘어갔던 부분이었는데, 그새 다 까먹은건지 실무에 와서 조금 삽질을 한 것 같아 나중을 위해 적어두고 계속해서 수정해나가고자 한다.

 

1. 연관관계 매핑 1:N 

  이번 프로젝트에서 1:N 관계로 진행되는 경우가 많았고, 또 양방향으로 할지 단방향으로 할지 굉장히 혼란스러웠다. 삽질없이 단순 심플하게 진행하고 싶다면 단방향 관계로 진행할 것을 추천한다. 단방향관계는  굉장히 쉽다. FK를 가지고 있는 연관관계의 주인 필드에 @ManyToOne과 @JoinColumn을 설정해주면 된다.

 

 양방향 관계는 별로 추천하지 않는다. 그래도 굳이 넣어야한다고 한다면 컬렉션내부에는 DTO가 아닌 ENTITY를 넣어서 진행하는 것이 속 편하다. 컬렉션 안에 DTO를 넣게 된다면 엔티티에 SETTER가 세팅되어 있지 않다고 한다면 무한참조가 일어나 스택오버플로우가 일어날 가능성이 상당히 높다.

 ModelMapper를 쓰는 것도 대안이다. 그러나 ModelMapper는 setter를 이용해 작동하므로 엔티티에 @Setter를 필수적으로 선언 해 주어야 한다. 안그러면 null값이 매핑된다.

 

양방향 연관관계 시 팁: changexxx 메소드를 만들어 파라미터로 연관관계를 맺어줄 엔티티를 받아 그와 동시에 로직에는 List에 추가하는 로직 까지 추가하는 것이다.

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "컬럼명")

public void changeTeam(Team team){
    this.team = team;
    team.members.add(this);
}