-
단방향 양방향 연관관계의 이해JPA 2024. 7. 8. 00:31
양방향은 지양!
그냥 단방향으로 해도 되는 경우가 99%이다
그리고 양방향쓰면 골치아파지는 경우가 많다고 함
연관관계 편의 메서드?
즉 연관관계의 주인과 연관관계의 노예 둘에게 모두 적용하는 코드를 작성해야함
public void add(Book book){ book.setBookStore(this); // owner getBooks().add(Book); // slave }
이런거까지 다 신경써줘야되서 코드량도 늘어나고
이런 양방향 관계가 얽히고 섥히면 굉장히 유지보수하고 힘들다고...
쨌든 그냥 우리 딴에서는 단방향만 써도 다 돌아간다는 의미
[미리 요약을 하자면]
단방향 = @JoinColumn으로 연관지을 엔티티에 대한 참조변수
양방향 = @mappedBy로 List 형 추가
[다대일 단방향]
만약 Member만 Team을 참조해야하는 단방향적인 상황이면
Member에 Team을 참조할 Team team 참조변수를 넣어주면 된다
@Entity public class Member { @Id @GeneratedValue private Long id; @Column(name="username") private String name; @ManyToOne // DB 관점에서 관계가 어떻게 되나 @JoinColumn(name="teamId") // 조인해야되는 칼럼이 무엇이냐? -> Team Entity의 team_id private Team team; }
@Entity public class Team { @Id @GeneratedValue private Long teamId; private String name; }
그럼 JPA가 명시된 어노테이션을 통해
연관관계 매핑을 해석해서
아래와 같이 TEAM_ID를 외래키로 갖는 테이블을 만들어준다
단방향 연관관계일때는 특정 Member에 Team을 지정해주기 위해서
다음과 같이 참조를 저장해주면 된다
// 팀 저장 Team team = new Team(); team.setName("TeamA"); em.persist(team); // 회원 저장 Member member = new Member(); member.setName("member1"); // 단방향 연관관계 설정, 참조 저장 member.setTeam(team); em.persist(member);
[다대일 양방향]
근데 위의 단방향과 다르게
Team 도 Member 들을 참조할 수 있게 하고 싶으면
이때는 양방향 관계로 만들어줘야한다
그래서 Team 객체 쪽에 List<Member> members 변수를 넣어준 것이다
즉, Team 에다가 List members 라고 넣어줘야 양쪽으로 갈 수가 있게 된다
이러면 실제 주인은 @JoinColumn이 적힌 Member 쪽이지만
Team 쪽에서 List<Member> members를 @mappedBy로 선언해줌으로써
Read-Only로 member를 참조할 수 있게 된다
따라서 다음 그림과 같이 Entity가 만들어진다
특정 Team에 Member를 저장하고 싶으면
해당 행위의 주체가 Team처럼 보이고 Team의 List<Member> memberList에 새로운 Member를 추가하고 싶어도
여기서 이 둘의 관계의 주인은 Member이므로!
Member.setTeam(teamA) 이렇게 해야지 제대로 반영된다!!
반드시 알아야할게
양방향 연관관계일때 새로운 상황을 적용하고 싶으면 항상 주인쪽에 적용!!
@mappedBy로 선언된 노예쪽은 READONLY만 가능하다!!
하지만!
JPA를 통해 연관관계 매핑을 해석해서
다시 테이블을 만들더라도
단방향일때와 같은 테이블이 나온다!
즉 단방향 만들고 양방향으로 만들려고
반대쪽 사이드에 상대 참조변수를 추가해도
테이블에는 영향을 미치지 않는다!!
왜냐하면 DB의 테이블은 외래키 하나만 있으면
서로 JOIN만 하면 되서 양방향이 이미 보장되어있기 때문이다!
'JPA' 카테고리의 다른 글
[JPA] JPA의 이해 (0) 2024.07.28 연관관계 편의 메서드 (0) 2024.07.08 @mappedBy의 이해 (0) 2024.07.08 영속성 컨텍스트의 이해 (0) 2024.07.08 ORM과 JPA의 이해 (0) 2024.03.01