week5

아야하면우유·2025년 5월 9일

HSL

목록 보기
3/6

개체 간 연관관계


 개체는 데이터베이스의 테이블이라고 보아도 무방하다. 데이터베이스에선 외래키가 존재하듯, 개체들이 서로 공유하는 필드를 Spring에선 JoinColumn이라고 본다.

  • 단방향 연관관계 : 역방향에서 참조될 일이 없을 때 사용한다.
  • 양방향 연관관계 : 상호간 참조가 필요할 때 사용한다.

관계형 데이터 모델이 제시하는 개체 간 연관관계는 1:1, 1:M, N:M등이 있는데, 여기서 다대다 연관관계는 비즈니스 로직상 구현이 어렵다. 그렇기에 중간에 거쳐가는 개체를 하나 만들어서 일대다 일대다인 관계 2개로 나누어 로직을 구성한다
양방향 연관관계는 연관관계의 주인이 필요하다.

Member <- ManyToOne -> Team

위와 같은 관계에서는 Member가 연관관계의 주인 annotation을 달게된다.

상속관계 매핑


 공통 필드를 가지는 개체들이 있을 수 있다.

Book(id, name, price, ...)
Albom(id, name, price, ...)

 id, name, price필드가 중복되며, 이 필드들은 새로운 Product라는 부모 개체로 선언하는 것이 타당하겠다.
 이 상속관계를 매핑하는 법도 여러가지 있는데, Join전략을 추천한다. Join 전략이 쿼리가 다소 느릴지언정 무결성 보장이 쉽기 때문이
다.

프록시


 위에서 사용했던 Member와 Team 개체를 예시로 들어보겠다.
select member_id from member; 이 SQL은 Team을 조회하지 않지만, em.find와 같은 명령으로 SQL을 보내면 N+1문제를 일으킨다. 말 그대로 1개의 SQL을 보내려고 했지만, N개의 SQL이 함께 딸려서 전송되는 것이다. 이 때 사용되는 것이 지연 로딩과 프록시 객체 타입이다. 지연 로딩을 사용함으로서 실제로 조회되지 않는 개체의 클래스 타입을 프록시 타입으로 반환시켜 SQL의 효율을 높인 것이다.


  • 영속성 전이 : 모 개체를 영속성 컨테이너에 올릴 때, 같이 올려야 할 개체가 있다면 영속성 전이를 이용할 수 있다.
  • 고아 객체 : 부모를 잃은 개체로서, 부모가 사라지면 같이 사라지게 할 수 있다. (게시글 삭제 시, 댓글 등을 같이 삭제하는 로직 정도?)
  • 불변 객체 : 필드값 초기화만 이루어지고, 이후 수정이 불가. (집 주소를 1개만 설정할 때?)
  • 값 타입 컬렉션 : 집 주소를 여러개 가져야 하는 등의 상황이 발생했을 때 사용. List<> new ArrayList~~
profile
우유가 넘어지면 아야

0개의 댓글