개인프로젝트로 쇼핑몰을 제작하면서 상품에 대한 옵션을 계획했으며 구현을 진행했다.
네이버스마트 스토어처럼 한 상품에 여러 옵션을 가지고 있을 수 있어야 했는데, 제약조건이 있었다.
1. 옵션은 없을 수도 있지만 N 개가 될 수 있다.
2. 옵션의 명칭은 자유롭게 작성가능하다.
EX ) 색상 : 검정 // 컬러 : 검정 // 색깔 : 검정 처럼 사용자 마음대로 가능하다.
옵션값을 JSON 형태로 나타내야 했는데 spring jpa convert 를 사용했다.
언제 사용할까?
JPA 가 지원하지 않는 타입을 매핑할때
두 개 이상의 속상을 갖는 밸류 타입을 한 개 칼럼에 매핑할 때
@Converter를 사용하기 위해서는 AttributeConverter 인터페이스를 구현해야 한다.
클래스를 따로 만들어야 하며 @Converter 애노테이션을 붙여준다.
제네릭 타입으로는 T 타입과 String 타입을 넣어주었다.
처음에는 옵션값을 List 형태로 추가시켜주어야 하나? 라는 생각에 List<addOption> 를 사용했는데, 잘못된 방법이었다.
@Slf4j
@Converter
public class GenericJsonConverter<T> implements AttributeConverter<T, String> {
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override // client -> db
public String convertToDatabaseColumn(T attribute) {
try {
return objectMapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
log.error("fail to serialize as object into Json : {}", attribute, e);
throw new RuntimeException(e);
}
}
@Override // db -> client
public T convertToEntityAttribute(String dbData) {
try {
return objectMapper.readValue(dbData, new TypeReference<T>() {});
} catch (IOException e) {
log.error("fail to deserialize as Json into Object : {}", dbData, e);
throw new RuntimeException(e);
}
}
}
GenericJsonConverter를 상속받는 클래스를 만들어준다.
만들어준 이유는 GenericJsonConverter 를 Option클래스에 직접 적용했을 때 에러가 발생했다.
public class OptionConverter extends GenericJsonConverter{
}
Option 클래스에 해당 컨버터를 적용하는 과정이다.
@Convert를 사용하며 어떤 컨버터 클래스를 적용해야할지 적어준다.
// 옵션값
@Convert(converter = OptionConverter.class)
private List<OptionCreate> optionValue;
타입은 List<OptionCreate> 타입을 사용했다.
OptionCreate 는 아래와 같다. key , value 값을 가지고 있도록 작성했다.
public class OptionCreate {
private String key;
private String value;
}
POSTMAN 을 이용해서 상품의 옵션을 넣어보자.
GoodsCreateRequest 는 아래와같이 되어있다.
POSTMAN 에서 optionCreateRequest 의 구조는 아래와같다.
List 로 받기 때문에, 옵션은 원하는 만큼 , 로 구분해서 추가할 수 있으며,
한개의 옵션에는 1개이상이 가능하다.
'Spring > JPA' 카테고리의 다른 글
List 타입을 Page 타입으로 리팩토링 (0) | 2023.01.28 |
---|---|
JPA N+1 문제 알아보기 (0) | 2023.01.25 |
JpaRepository 와 CrudRepository 의 차이점 (0) | 2022.12.04 |
JPA 순환 참조 해결해보기 (0) | 2022.11.30 |
data.sql 적용하기 (스프링부트 버전 2.7.x 이상 ) (0) | 2022.11.10 |
댓글