-
JPA 연관 관계 매핑 - startSpring/JPA 2024. 1. 14. 21:38728x90반응형
JPA에서 연관 관계 매핑에 대해 쉬운 이해를 하기 위해서는 객체와 테이블의 연관 관계의 차이를 이해해야한다.
객체를 테이블에 맞추어 그대로 모델링 한다면 객체 간 협력 관계를 만들 수 없게 된다.
테이블은 외래키(FK)로 조인하여 연관 된 테이블을 찾을 수 있지만 객체는 참조를 통해 연관된 객체를 찾을 수 있게 된다.
아래는 Member 테이블과 Team 테이블이 N:1관계일때 Entity를 어떻게 만들어야 하는지에 대해 작성하였다.- Member 테이블은 Team 테이블의 Id값을 외래키(FK)로 가지고 있다.
// 객체를 테이블에 맞추어 데이터 중심으로 모델링 한 경우 @Entity public class Team{ @Id @Column(name = "TEAM_ID") private Long id; private String teamName; } @Entity public class Member{ @Id @Column(name = "MEMBER_ID") private Long id; private Long teamId; private String userName; } // 객체 지향 모델링 (단방향) @Entity public class Team{ @Id @Column(name = "TEAM_ID") private Long id; private String teamName; } @Entity public class Member{ @Id @Column(name = "MEMBER_ID") private Long id; @ManyToOne @JoinColumn(name = "TEAM_ID")` private Team team; private String userName; } //양방향 매핑 @Entity public class Team{ @Id @Column(name = "TEAM_ID") private Long id; private String teamName; @OneToMany(mappedBy = "team") List<Member> members = new ArrayList<>(); } @Entity public class Member{ @Id @Column(name = "MEMBER_ID") private Long id; @ManyToOne @JoinColumn(name = "TEAM_ID")` private Team team; private String userName; }
양방향 연관관계의 주인과 mappedBy
객체의 두 관계 중 하나를 연관관계의 주인으로 지정하는 것이다.
이때 지정된 주인은 등록 및 수정이 가능하지만 주인이 아닌쪽은 읽기만 가능하다.
주인이 아닌 곳에서 mappedBy속성으로 주인을 지정해 줄 수 있다.
그럼 누구를 주인으로 해야할까?
아직 정확한 이유는 알 수 없지만 테이블 구조 상 외래키가 있는 곳을 주인으로 지정하면 여러가지 문제를 해결할 수 있다.
그리고 만약 주인이 아닌 곳에서 아무리 등록 및 수정을 하여도 실제 DB에서는 아무런 일이 생기지는 않는다.
하지만 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하는것이 좋다.
실무에서 항상 기억해야 하는 점
처음부터 양방향 연관관계를 맺으려고 하지말고 우선 단방향 매핑으로 연관관계를 완성시켜야 한다.
객체가 양방향으로 연결되어 있다는 말은 객체의 입장에서 좋지 못한 소리이기 때문이다.
그러므로 우선 단방향 매핑을 완벽하게 한 후 추후 양방향 연관관계는 필요할 경우 추가해서 사용해도 늦지 않다.
이는 자바 코드 몇줄이면 가능하며 테이블에 아무런 영향을 주지 않기 때문이다.
728x90반응형'Spring > JPA' 카테고리의 다른 글
org.hibernate.loader.MultipleBagFetchException 원인 및 해결 (0) 2024.02.15 [JPA] LazyInitializationException 발생! (0) 2024.02.14 JPA 기본키 매핑 (1) 2024.01.12 JPA 엔티티 매핑 (0) 2024.01.02 JPA에서 batch_size를 지정하는 이유는? (0) 2024.01.02