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);
}
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] QueryDSL의 DSL이 궁금하다! (0) | 2023.03.03 |
---|---|
[JPA] JPA 복합키 매핑 정리 (0) | 2022.08.09 |
[JPA] JPA로 다른 스키마에 있는 테이블에 쿼리 날리기(with mysql) (0) | 2022.07.25 |
[JPA] Spring Data JPA를 이용한 JPA Auditing 날짜 자동 생성, 저장(Auditing in JPA ). (0) | 2022.07.25 |