본문 바로가기
Spring/JPA

@Convert - T타입 + Map 사용하기

by YoonJong 2023. 1. 14.
728x90

개인프로젝트로 쇼핑몰을 제작하면서 상품에 대한 옵션을 계획했으며 구현을 진행했다.

네이버스마트 스토어처럼 한 상품에 여러 옵션을 가지고 있을 수 있어야 했는데, 제약조건이 있었다.

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개이상이 가능하다.

728x90

댓글