[Spring] @Convert

박준형·2023년 9월 17일
0

Spring

목록 보기
3/17
post-thumbnail

프로젝트를 진행하면서 List 형식을 컬럼 하나에 저장하고 싶은데 마땅한 방법이 없어서 찾다가 @Convert 라는 방식을 알게 되었다.
이 방식은 List 로 저장 시켜준다기 보단 내가 원하는 형식으로 변환하여 저장 해준다는 표현이 적절하다.

먼저, 나는 List 타입을 저장 시키고 싶어서 List 타입 변수에 @Convert를 써주었다. 이후에 내가 원하는 타입을 구현하여 convert = 구현클래스.class 로 지정해주면 된다.

@Convert(converter = StringListConverter.class)
    private List<String> styles = new ArrayList<>();

이후에 StringListConvert 클래스 파일을 만들고 내가 원하는 작업을 오버 라이드해서 구현하면 된다.

@Slf4j
public class StringListConverter implements AttributeConverter<List<String>, String> {

    private static final ObjectMapper mapper = new ObjectMapper()
            .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
            .configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);

    @Override
    public String convertToDatabaseColumn(List<String> attribute) {
        try {
            return mapper.writeValueAsString(attribute);
        } catch (JsonProcessingException e) {
            throw new IllegalArgumentException();
        }
    }

    @Override
    public List<String> convertToEntityAttribute(String dbData) {
        TypeReference<List<String>> typeReference = new TypeReference<List<String>>() {};
        try {
            return mapper.readValue(dbData, typeReference);
        } catch (IOException e) {
            throw new IllegalArgumentException();
        }
    }
}

convertToDatabaseColumn 메서드는 프론트에서 넘어오는 List 타입의 데이터를 DB에 저장할 때 문자열로 직렬화 해준다.
그리고 convertToEntityAttribute 메서드는 문자열로 저장 된 데이터를 역직렬화 해줘서 다시 List 타입으로 변환 해준다.
이렇게 하면 일일이 콤마로 나눠주고 꺼내와서 다시 파싱하고 List에 담아주는 작업을 하지 않아도 된다.

즉, DB에 List 를 저장 시키는 것이 아닌 List를 내가 구현 한 메서드에서 문자열로 변환하는 과정을 거친 후 DB에 저장되고 이후에 내가 조회를 해서 사용 할 때 DB에 있는 문자열을 List 타입으로 변형시켜서 반환해준다.

profile
으쌰 으쌰

0개의 댓글

관련 채용 정보