본문 바로가기
Data Base/JPA

[JPA] : 양방향 연관관계, 연관관계 주인(Owner)

by 오주현 2022. 4. 8.
반응형
  • 양방향 매핑
    • 지금까지 코딩한 부분은 Member에서 Team으로는 갈 수 있지만 반대로 Team에서 Member로는 갈 수 없다.
    • 근데 사실, 양 쪽은 왔다갔다 할 수 있어야 한다. 그렇게 만들면 양방향 연관관계라고 한다.
    • 테이블의 연관관계는 외래키 하나로 양방향이 다 있는 것이다. 사실, 테이블의 연관관계는 방향이랄 게 없다. 외래키를 넣으면 된다.
    • 문제는 객체이다.
    • Team에서 Member로 갈 수 없는 문제가 있다.
      • 어떻게 해결하나?
        • Team에 List members를 넣어주면 된다.
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<Member>();
    
    • @OneToMany일대다
    • mappedBy = "team"나는 team으로 매핑이 되어있다.
    @ManyToOne //다대일
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    • team은 다대일로 되어있다.
    List<Member> members = findMember.getTeam().getMembers();
        for (Member m : members) {
            System.out.println("m.getUsername() = " + m.getUsername());
        }
    
    • 이제 출력을 하면 m.getUsername() = member1 가 나온다.
    • 양방향이 좋나?
      • 객체는 단방향이 좋다.
      • 양방향은 신경쓸 게 많아진다.
  • Team findTeam = findMember.getTeam();
  • (mappedBy) 가 중요하다.
    • 객체와 테이블간에 연관관계를 맺는 차이를 이해하자.
    • 회원 > 팀, 팀 > 회원 이렇게 두 개의 연관관계가 있다. (단방향 연관관계가 두 개가 있다고 볼 수 있다.)
      • 테이블 관점에서 보면 외래키를 통해 양방향 연관관계를 유지할 수 있다.
      • 객체 관점에서 보면 연관되는 참조값이 양쪽에 다 있어야 한다. 즉, 단방향이 두 개가 있는 것이다.
      • 객체의 양방향은 진짜 양방향이 아니라 단방향이 두 개인 것 뿐이다.
    • 문제가 생기는 부분?
      • 테이블에 걸려있는 FK(외래키)와 참조하기 만든 객체 둘 중 어느 것으로 외래키를 관리해야 하는지에 대한 문제가 생긴다.
        • 즉, item 연관관계 매핑 vs members 연관관계 매핑에 대한 문제.
    • 둘 중 하나로 외래키를 관리하긴 해야 한다.
      • 이때 사용되는 게 연관관계 주인(Owner)이다.
  • 연관관계의 주인(Owner)
    • 양방향 매핑 규칙
      • 객체의 두 관게 중 하나를 연관관계의 주인으로 지정한다.
      • Owner만이 외래키를 관리한다.
        • 등록 및 수정
      • Owner가 아니라면 읽기만 가능하다.
      • Owner는 mappedBy 속성을 사용하지 않는다.
        • mappedBy 자체가 내가 ~에 대해 매핑 되었어.라는 뜻이라 주인이 안 된다.
      • Owner가 아니면 mappedBy 속성으로 주인을 지정해 줘야한다.
    • 누구를 주인으로 해야 하나?
      • 외래키가 있는 곳을 주인으로 해야 한다.
      • DB 입장에서 보면 외래키가 있는 곳(Owner)이 무조건 다(ManyToOne), 없는 곳이 일(OneToMany)로 다대일이 된다.
    • 연관관계 주인은 비즈니스적으로 중요하지는 않다.
    • 이해가 잘 안 되는 부분이 있어 질문을 남겼다.
    Team 테이블에서 @GeneratedValue 를 통해 pk를 설정하고, 
    Member 테이블에서 mappedBy로 Team team에 fk를 준 뒤 
    Team에서도 단방향으로 연관관계를 맺을 수 있게 
    List members를 생성해서 양방향 연관관계를 형성했고, 
    그 중심은 mappedBy로 fk를 설정해 준 Team team이다.
    
반응형

댓글