Dev/Spring

연관관계 매핑(단방향)

oxdjww 2023. 11. 21. 01:47
728x90
반응형

✅ 연관관계 매핑의 필요성

  • 모델링의 두 방식의 차이점을 비교하며 연관관계의 필요성을 알아보자.

✅ 테이블 중심 모델링

![Untitled]

  • 테이블 연관관계에 맞추어 객체를 모델링 해보자

🌱 엔티티 매핑

  • 참조 대신에 외래키를 그대로 사용하여 다음과 같이 MemberTeam 을 작성할 수 있다.

      @Entity
      public class Member {
          @Id @GeneratedValue
          private Long id;
    
          @Column(name = "USERNAME")
          private Long teamId;
          ...
      }
      @Entity
      public class Team {
          @Id @GeneratedValue
          private Long id;
          private String name;
          ...
      }

🌱 엔티티 다루기

  • 위와 같이 작성하게 되면, 실제로 엔티티를 다룰 때 아래와 같이 다루게 된다.

      // 팀 저장
      Team team = new Team();
      team.setName("TeamA");
      em.persist(team);
    
      //회원 저장
      Member member = new Member();
      member.setName("member1");
      member.setTeamId(team.getId());
      em.persist(member);
    
      //조회
      Member findMember = em.find(Member.class, member.getId());
    
      //연관관계가 없음
      Team findTeam = em.find(Team.class, team.getId());
  • 저장한 MemberTeam 에 대해 연관관계가 존재하지 않는다.

  • 그러므로 findMemberteam을 찾을 방법이 없다.

  • 그저 이전에 생성한 team 객체의 team.getId()를 통해 식별자로 다시 조회한다.

  • 객체지향적인 방법이 아니다. 객체간의 관계를 코드로 풀어낼 수 없기 때문이다.

    • 객체가 행동을 하지 않고, getter를 사용한 식별자로 엔티티를 조회한다.

🌱 테이블 중심 모델링의 한계

  • 테이블의 컬럼을 중심으로 객체를 모델링하게 되면, 협력 관계를 만들 수 없다.
  • 테이블 : 외래 키로 조인을 사용하여 연관된 테이블을 찾는다.
  • 객체 : 참조를 이용하여 연관된 객체를 찾는다.
  • 이런 간극을 극복해낼 방법 → 연관 관계

✅ 객체 지향 모델링

  • 객체의 연관관계를 바탕으로 모델링해보자.
  • 테이블 중심 모델링과 다른 점은, teamIdTeam team

🌱 엔티티 매핑

  • 기존에 썼던 teamId를 주석 처리하고, Team 컬럼을 삽입하자.

      @Entity
    
      public class Member {
          @Id @GeneratedValue
          private Long id;
    
          @Column(name = "USERNAME")
          private String name;
          private int age;
    
          // @Column(name = "TEAM_ID")
          // private Long teamId;
    
          @ManyToOne
          @JoinColumn(name = "TEAM_ID")
          private Team team;
          ...
      }

🌱 엔티티 다루기

//팀 저장
Team team = new Team();

team.setName("TeamA");
em.persist(team);

//회원 저장
Member member = new Member();
member.setName("member1");

member.setTeam(team); //단방향 연관관계 설정, 참조 저장

em.persist(member);
  • 팀을 생성하고 영속성 컨텍스트에 저장한다.

  • 그리고 회원을 저장할 때, setter를 이용하여 team을 설정한다.

    • 이 때, 식별자를 저장하지 않고 객체 자체를 통해 set하는 모습이 차이점이다.
  • 저장한 엔티티를 조회하자

      //조회
      Member findMember = em.find(Member.class, member.getId());
    
      //참조를 사용해서 연관관계 조회
      Team findTeam = findMember.getTeam();
  • 여기서 확연한 차이를 볼 수 있다.

  • 기존에는 findMember에서 조회하지 않고 다시 영속성 컨텍스트 내부를 찾아보아야 했다.

    • em.find(Team.class, …)
  • 하지만 객체간의 연관관계를 구성해놨기에, 조회한 findMember에서 손 쉽게 team을 꺼낼 수 있다.

  • 이렇게 객체의 참조적 연관성을 설정해주는 것을 단방향 연관관계라 한다.

Ref

김영한 강사님, JPA 프로그래밍 - 기본편


감사합니다.

728x90
반응형

'Dev > Spring' 카테고리의 다른 글

연관관계 매핑(양방향)  (0) 2023.11.21
변경 감지(Dirty Checking)  (0) 2023.11.20
JPA를 왜 쓸까?  (0) 2023.11.20
영속성 컨텍스트란  (0) 2023.11.20
준영속과 변경감지  (0) 2023.10.25