백엔드/SpringBoot

JPA 엔티티 참조

YUEIC 2025. 7. 17. 17:00

백엔드를 구성할 때 JPA를 사용하는 경우, 엔티티끼리의 참조에 관해 설계하게 된다.

 

이 때, 하나의 컬럼을 '키'로 정하는 경우가 일반적인 경우라고 알고 있었다. 그러나 JPA의 Entity 객체를 통째로 참조할 수 있다는걸 알았다.

 

예를 들어 먼저 '상품'이 존재하고 이를 구매하는 '구매자'가 있으며 구매자가 남긴 '리뷰'까지 세 개의 Entity가 있다고 가정한다.

 

'리뷰'는 해당 상품의 페이지에만 존재해야 하므로 '상품'을 참조해야하며 작성자를 특정하기위해 '구매자'를 참조해야 한다.

 

JPA를 쓰지 않고 애플리케이션을 구성할 때는 

'리뷰'객체는 '상품의 id', '구매자의 id' 를 참조하도록 했었다.

 

하지만 JPA를 사용할 때는

'리뷰'객채는 '상품객체', '구매자의 객체'를 참조할 수 있다.

코드로 나타내면 아래와 같다.

@Entity
public class Review {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    //유저 특정, 유저 객체를 참조한다.
    @ManyToOne(fetch = FetchType.LAZY)
    private User user;

    //상품 특정, 상품 객체를 참조한다.
    @ManyToOne(fetch = FetchType.LAZY)
    private Product product;

    //리뷰 내용
    @Column(nullable = false, length = 1000)
    private String content;

    //평점
    @Column(nullable = false)
    private int rating;

    //작성시간 및 수정 시간
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

 

이렇게 Entity 객체를 참조하면 장점이 있다.

 

1. 객체 탐색이 직관적이다.

예를 들어 유저 id를 참조한다고 가정하면 

페이지에 리뷰를 노출할 때 리뷰 내용 옆에 보통 구매자의 '닉네임'도 같이 노출된다. 이때 id만을 참조하고 있다면 리뷰에 관한 내용을 DB에서 가져올 때 유저id를 통해 해당 유저의 '닉네임'도 따로 불러와야 한다.

 하지만 객체를 직접 참조하고 있다면

review.getuser().getNickname();

과 같이 Java 객체에서 불러올 수 있게 된다.

 

 

2.객체 중심의 설계

객체지향의 관점에서 보면 Review는 user와 product(상품)에 속해 있는 개념이다.

따라서 각각의 id만을 참조하는 것 보다 객체를 가지고 있는 것이 자연스러운 구조이다.

 

3. JPA 연관관계 맵핑의 이점

JPA는 내부적으로 user의 id를 외래키로 갖고 있지만, 사용하는 쪽에서는 User 객체를 통해 더 많은 정보와 연관관계 처리(ex. cascade, orphanRemoval 등) 이 가능하다.

 

물론 id 만을 참조하고 있을 때의 장점도 있다. 대량의 데이터를 처리할 때 속도면에 있어 유리하긴 하지만 JPA에서 제공하는 객체를 참조 할 때의 이점에 비하면 목적성이 명확하기 때문에 이후 확장성의 면에서는 불리하다.