강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

권오영님의 프로필 이미지
권오영

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

강의 수강 후 개인공부 진행하면서 궁금한 점 질문드립니다.

작성

·

189

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(http://bit.ly/3fX6ygx)을 먼저 확인해주세요.
3. 질문 잘하기 메뉴얼(http://bit.ly/2UfeqCG)을 먼저 읽어주세요.

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

안녕하세요 영한님, JPA 강의를 모두 수강 후 개인적으로 토이 프로젝트를 진행해보면서 궁금한 점이 있어서 질문드립니다.
가정)
Entity에서 값타입인 필드가 존재하는데, 값타입이 List나 Set 형식으로 존재합니다.
아래와 예시와 같이 Store(Entity)는 여러 Category(Value)를 가질 수 있도록 구성했습니다.
위 예시에서 특정 카테고리에 해당하는 Store Entity를 조회하고 싶은데 JPA로는 구현이 힘들어 보입니다.
또한, QueryDSL을 쓰려고 했는데 Category가 Entity 타입이 아니다 보니 Category 테이블과 Join을 할 수 없더라구요.
제가 생각한 방식은 Store를 findByAll을 해서 Category를 찾는거였는데 이렇게 할 경우 리소스 낭비가 심하다고 생각됩니다.
또 다른 방식은 Category를 하나의 Entity로 보고 Store-Category를 1:N 관계로 가져가는 방법을 생각해봤는데,
Category가 지속적으로 수정이 필요하지도 않고 별도의 Entity로 가져가기엔 DDD 방법론에 맞지 않는다는 생각이 듭니다.
이런 경우에는 어떤 방식으로 구현을 해야 할까요? 조언 부탁드립니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 권오영님

다음 코드를 참고해주세요.

package com.example.querydslvalue.entity;

import javax.persistence.Embeddable;

@Embeddable
public class Category {

private String type;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}
}

package com.example.querydslvalue.entity;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
@ToString
public class Store {

@Id
@GeneratedValue
private Long id;

private String name;

@ElementCollection
private List<Category> categories = new ArrayList<>();
}

package com.example.querydslvalue;

import com.example.querydslvalue.entity.Category;
import com.example.querydslvalue.entity.Store;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import javax.persistence.EntityManager;

import java.util.List;

import static com.example.querydslvalue.entity.QCategory.*;
import static com.example.querydslvalue.entity.QStore.*;

@DataJpaTest
public class CollectionValueQuery {

@Autowired
EntityManager em;

@Test
void valueQuery() {
Category newCategory = new Category();
newCategory.setType("TYPE_A");

Store newStore = new Store();
newStore.setName("storeA");
newStore.getCategories().add(newCategory);
em.persist(newStore);
em.flush();
em.clear();

JPAQueryFactory query = new JPAQueryFactory(em);

List<Store> result = query.select(store)
.from(store)
.join(store.categories, category)
.where(category.type.eq("TYPE_A"))
.fetch();

for (Store store : result) {
System.out.println("store = " + store);
}

}
}

감사합니다.

권오영님의 프로필 이미지
권오영

작성한 질문수

질문하기