Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

자바 ORM 표준 JPA 프로그래밍 CH05 (연관관계 매핑 기초) 본문

공부/백엔드

자바 ORM 표준 JPA 프로그래밍 CH05 (연관관계 매핑 기초)

Hannah0226 2023. 6. 26. 22:21

 

목표

  • 객체의 참조와 테이블의 외래 키를 매핑하는 것!

 

핵심 키워드

  • 방향: 단방향, 양방향이 있다
  • 다중성: 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)가 있다.
  • 연관관계의 주인: 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야한다.

 

객체 연관관계 vs 테이블 연관관계

  • 객체는 참조(주소)로 연관관계를 맺는다
  • 테이블은 외래 키로 연관관계를 맺는다

단방향 연관관계

다대일(N:1) 단방향 관계

  • 상황
    • 회원과 팀이 있다
    • 회원은 하나의 팀에만 소속될 수 있다
    • 회원과 팀은 다대일 관계다

 

  • 객체 연관관계
    • 객체는 참조를 통해 연관관계를 탐색하는데 이를 객체 그래프 탐색이라고 한다.
Member member1 = new Member("memeber1","회원1");
Team team1 = new Team("team1","팀1");

member1.setTeam(team1);

Team findTeam = member1.getTeam();
  • 테이블 연관관계
    • 데이터베이스는 외래키를 사용해 연관관계를 탐색하는데 이를 조인이라고 한다.

 

  • 객체 관계 매핑
    • JPA를 사용해 객체를 사용한 연관관계와 테이블을 사용한 연관관계를 매핑
    • @ManyToOne: 다대일(N:1)관계라는 매핑 정보
    • @JoinColumn(name="{매핑 할 외래 키 이름}"): 외래키를 매핑할 때 사용. name 속성에는 매핑할 외래 키 이름을 지정. (어노테이션 생략가능)

연관관계 사용

엔티티 저장

  • JPA에서 엔티티를 저장할 때 관련된 모든 엔티티는 영속상태여야 한다.
  • member1.setTeam(team1); //회원→ 팀 참조
  • em.persist(member1); //저장
  • 회원 엔티티가 팀 엔티티를 참조한 후 저장

 

엔티티 조회

  • 객체 그래프 탐색(객체 연관관계를 사용한 조회)
    • member1.getTeam()을 사용해 member와 연관된 team엔티티 조회 가능

 

  • 객체지향 쿼리 사용
    • 회원이 팀과 관계를 가지고 있는 필드를 통해 Member와 Team을 조인

 

연관관계 수정

  • 수정은 em.update() 같은 메소드가 없다. → 참조하는 대상만 변경하면 나머지는 JPA가 자동으로 처리

 

연관관계 제거

  • member1.setTeam(null); 과 같이 연관관계를 null로 설정

 

연관된 엔티티 삭제

  • 연관된 엔티티를 삭제하려면 기존에 있던 연관관계를 먼저 제거하고 삭제해야 함
  • member1.setTeam(null); //회원1 연관관계 제거 후
  • em.remove(team); //팀 삭제

양방향 연관관계

  • 회원에서 팀으로 접근 반대 방향인 팀에서 회원으로 접근하는 관계를 추가 해 양방향 연관관계 구현
  • 객체 연관관계
    • 회원→팀(Member.team)
    • 팀→회원(Team.members)

 

  • 데이터베이스 테이블은 외래 키 하나로 양방향으로 조회 가능

 

양방향 연관관계 매핑

  • 팀과 회원은 일대다 엔티티 관계
    • 팀 엔티티 컬렌셕인 List<Member>members 추가 
    • @OneToMany(mappedBy = team)   //mappedBy 속성은 양방향 매핑일 때 사용하는데 반대쪽 매핑의 필드 이름값을 주면 됨

 

일대다 컬렉션 조회

  • member.username=회원1

연관관계의 주인

  • 객체에는 양방향 연관관계라는 것이 없다. 서로 다른 단방향 연관관계 2개를 묶어 양방향인 것처럼 보이게 할 뿐이다.
  • 반면 데이터베이스는 외래키 하나로 양족이 서로 조인할 수 있다.
  • 엔티티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래키는 하나다. → 둘 사이에 차이 발생
  • 이에 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야하는데 이를 연관관계의 주인이라고 한다.

 

양방향 매핑의 규칙: 연관관계의 주인

  • 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리(등록,수정,삭제)할 수 있다.
  • 주인이 아닌 쪽은 읽기만 가능
  • mappedBy속성으로 주인 설정 → 주인이 아닌 쪽에 mappedBy를 사용해 속성 값으로 연관관계 주인 설정
  • 연관관계의 주인은 외래키가 있는 곳으로 한다

양방향 연관관계 저장

  • 주인이 아닌 방향은 값을 설정하지 않아도 데이터베이스에 외래 키 값이 정상 입력됨
  • 주인이 아닌 곳에 입력된 값은 외래키에 영향을 주지 않음

양방향 연관관계의 주의점

가장 흔한 실수

  • 주인에는 값을 입력하지 않고, 주인이 아닌 곳에만 값을 입력

 

순수한 객체끼리 고려한 양방향 연관관계

  • 객체 관점에서 양쪽 방향 모두 값을 임력해주는 것이 가장 안전
  • 양쪽 방향 모두 값을 입력하지 않으면 JPA를 사용하지 않는 순순한 객체 상태에서 심각한 문제 발생

 

연관관계 편의 메소드

  • 양방향 연관관계에서 member.setTeam(team); team.getMembers().add(member);는 하나인 것처럼 사용하는 것이 안전
  • 주의사항: 연관관계를 변경할 때는 기존 팀이 있으면 기존 팀과 회원의 연관관계를 삭제해는 코드를 추가해야 한다.

 

자바 ORM 표준 JPA 프로그래밍 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com