ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 단방향 양방향 연관관계의 이해
    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