본문 바로가기

[스프링부트/업무일지 만들기] JPA로 DB에 리스트 넣는 방법- 직렬화, 역직렬화

ironwhale 2024. 6. 5.

이번에는 List<String> tag를 어떻게 JPA로 DB에 넣고 불러오는지에 대해 알아보겠습니다. 아마도 검색해보니 두가지 정도 방법이 있는거 같습니다. 저는 리스트 자료형을 스트링으로 바꿔서 저장하고 불러오는 방법에 대해 소개보겠습니다. 

 

전체적은 순서는 컨버터 만들기, 엔티티 클래스에 컨버터 적용하기 이렇게 두단계로 나누어 집니다. 


Converter 만들기

위에는 스트링이라고 표현했지만 더 정확한 표현은 Json 문자열로 변환했다라는 것이 더 정확한 표현인거 같습니다. 한줄 한줄씩 설명하면서 각부분이 왜 필요한지에 대해 설명드리겠습니다. 

@Converter

이 클래스가 JPA 변환기를 나타내는 애너테이션입니다. 

ObjectMapper

변환을 위해 ObjectMapper를 인스턴스화 합니다. 

리스트를 문자열로 변환하기 

mapper.writeValueAsString(strings); 이 코드를 통해 리스트를 Json 문자열로 직렬화 합니다. 

Json 문자열을 리스트로 바꾸기

mapper.readValue(s, List.class) 이코드는 Json 문자열을 List로 역직렬화합니다. 

 

 

이 기능을 활용하면 다른 API에서 Json 데이터를 받아와 데이터를 객체로 변화하는데도 활용할 수도 있을거 같습니다.  

전체코드

@Converter
public class StringListConvert implements AttributeConverter<List<String>, String> {

    final ObjectMapper mapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(List<String> strings) {

        try {
            return mapper.writeValueAsString(strings);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }


    @Override
    public List<String> convertToEntityAttribute(String s) {
        try {
            return mapper.readValue(s, List.class);
        }catch (JsonProcessingException e){
            throw new RuntimeException(e);
        }
    }
}

엔티티 클래스에 컨버터 입력하기

다음단계를 위에서 만든 컨버터를 엔티티 클래스에 입력을 해주겠습니다. 

단순하게 @Convert 애너테이션을 사용하면 끝입니다. 

    @Convert(converter = StringListConvert.class)
    private List<String> tags;

다음에는 ChatGPT가 알려준 스프링 전역 예외 처리에 대해 소개하도록 하겠습니다. 

 

 

댓글