객체와 관계형 데이터베이스 매핑하기

justindevcode·2022년 10월 7일

스프링 JPA

목록 보기
2/3
post-thumbnail

객체와 관계형 데이터베이스 매핑하기


JPA에 가장 중요한 2가지는 영속성 컨텍스트와 객체와 관계형 데이터 베이스 매핑하기 라고 한다.
이 JPA가 어떤방식으로 객체와 DB를 연결해주는지 이해야지 복잡한 관계나 작업중 실수를 줄일 수 있다.


객체와 테이블 연관관계의 차이


위 사진의 테이블은 아주 일반적인 관계형 DB의 테이블 연관관계이다.

DB는 외래키로 join을 통해 MEMBER에서 TEAM을 찾을수도 있고 TEAM에서 MEMBER를 찾을 수도 있다.

객체를 데이블에 속성 그대로 클레스를 만들게되면

Member에 연결된 Team찾기 = member.getTeam()
Team에 연결된 Member 찾기 = ???

객체는 양쪽에 상대의 정보가 없으면 양방향이 불가능하다.

그래서 객체는 양쪽에 상대의 정보를 추가해준다.


차이로 생기는 문제 2가지

1. 연관관계 주인선택

테이블처럼 객체 만들다 객체에는 관계 변수가 각각 생겼는데 누구 기준으로 DB의 데이터를 처리할지 설정해줘야한다.

이때 외래키가 있는곳의 객체 관계변수를 기준으로 잡는것을 추천한다

만약 Team쪽에서 기준을잡고 List members에 member1,meber2를 추가 한다하면
나는 Team객체에서 데이터를 변경했는데 쿼리가 MEMBER의 member1,member2를 수정하는것으로 나가서 나중에 쿼리를 직접 볼때 헷갈릴 수 있다.

그래서 연관관계의 주인을 설정한다면 주인만 외래키를 관리하고 주인 아닌쪽은 읽기만 가능하다.

2. 쓰기지연으로 인한 역방향 참조 바로불가

JPA는 쓰기지연방식을 사용해 DB에 날라갈 쿼리들을 모아뒀다가 트랜잭션이 끝난후 commit이 되면 실제로 DB에 반영이 된다.
문제는 이 쿼리가 날라가기전에 역참조를 해야 할때이다.

Team team = new Team();
 team.setName("TeamA");
 em.persist(team);
 Member member = new Member();
 member.setName("member1");
 //연관관계의 주인에 값 설정
 member.setTeam(team); //**
 em.persist(member);
 
 team.getMembers(); // 못찾음

위 상황에서는 아직 트랜잭션이 끝나기전이라 1차캐시에 각 객체가 있는상태이다. 그래서 team.getMembers();으로 꺼내려하면 1차캐시에 java객체 그대로 꺼내기에 아무것도 없는상태이다.

그래서 주인쪽에 등록할때 반대쪽에도 그냥 객체에 넣어주는 set함수를 만들어 사용하는것을 권장한다.

public void addOrderItem(OrderItem orderItem) {
  orderItem.add(orderItem);
  orderItem.setOrder(this);
}

profile
("Hello World!");

0개의 댓글