ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 연관 관계 매핑 - start
    Spring/JPA 2024. 1. 14. 21:38
    728x90
    반응형

    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
    반응형
Designed by Tistory.