미니 프로젝트 - Entity Reference

Zyoon·2025년 6월 21일

미니프로젝트

목록 보기
19/36
post-thumbnail

📖EntityManager.getReference() 활용하여 Entity 참조


Entity 참조

  • API나 서비스 로직을 구현하다 보면, 연관된 엔티티(User 등)의 id 값만 가지고 있고, 실제 데이터를 조회할 필요는 없을 때가 있다.
  • 예를 들어, Log라는 엔티티를 저장해야 하는데, User와의 연관관계를 맺기 위해 필요한 건 userId 하나뿐이고, 굳이 DB에서 User 전체 정보를 조회할 필요가 없는 상황이 생긴다.

상황 예시

  • Log 엔티티는 User와 연관관계를 가지고 있다 (예: @ManyToOne)
  • logSaveDto는 프론트에서 넘어온 요청이고, userId만 담겨 있다
  • User 전체 데이터를 조회할 필요 없이 userId 정보만으로 Log를 저장하고 싶다

코드 예시

// userId만 가지고 있기 때문에, 전체 User를 조회하지 않고 reference만 가져온다
User userRef = entityManager.getReference(User.class, dto.getUserId());

// DTO -> Entity 변환 시, user를 참조만 연결
Log log = logSaveDto.toEntity(userRef);

// 이후 log 저장
logRepository.save(log);

find() 와의 차이점

방식설명
find()실제 DB 조회가 일어나고, 해당 데이터를 메모리에 로딩함
getReference()실제 조회 없이 프록시 객체를 반환함 (실제 데이터는 사용될 때 로딩됨)
  • 즉, getReference()데이터가 필요 없고, 단순히 관계만 맺을 때 효율적인 방법이다.
  • 특히 save()연관관계 연결에만 필요할 경우 매우 유용하다.

주의사항

getReference(Class<T>, Object primaryKey)
  • id만 알고 있고, DB 조회는 원하지 않을 때 쓰기 때문에 id(PK) 값은 반드시 필요
  • PK가 없으면 누구를 참조할지도 모르기 때문에 프록시 생성 자체가 불가능
  • 만약 getReference()로 받은 프록시 객체를 실제로 사용하려고 하면 LazyInitializationException이 날 수 있음

정리

  • 엔티티의 id만으로 연관관계를 연결해야 할 때는 getReference()가 깔끔하고 효율적이다.
  • 불필요한 DB 조회를 막고 성능을 높일 수 있다.
  • 하지만 데이터 접근이 필요한 상황이라면 반드시 find()를 써야 한다.
profile
기어 올라가는 백엔드 개발

0개의 댓글