공hannah부
자바 ORM 표준 JPA 프로그래밍 CH05 (연관관계 매핑 기초) 본문
목표
- 객체의 참조와 테이블의 외래 키를 매핑하는 것!
핵심 키워드
- 방향: 단방향, 양방향이 있다
- 다중성: 다대일(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
'공부 > 백엔드' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 CH07 (고급매핑) (0) | 2023.07.10 |
---|---|
자바 ORM 표준 JPA 프로그래밍 CH06 (다양한 연관관계 매핑) (0) | 2023.07.03 |
자바 ORM 표준 JPA 프로그래밍 CH04 (엔티티 매핑) (0) | 2023.06.26 |
자바 ORM 표준 JPA 프로그래밍 CH03 (영속성 관리) (0) | 2023.06.26 |
CI & CD (0) | 2023.06.02 |