spring boot/snippets

jpa에서 json column 사용하기

lingi04 2021. 12. 22. 23:14

list형 json

  1. custom converter 사용

    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.databind.DeserializationFeature;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import javax.persistence.AttributeConverter;  
    import java.io.IOException;  
    import java.util.List;
    
    public class StringListConverter implements AttributeConverter<List, 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) {
            try {
                return mapper.readValue(dbData, List.class);
            } catch (IOException e) {
                throw new IllegalArgumentException();
            }
        }
    }
  1. 엔티티에 json column 정의하기

     @Getter
     @Entity
     @Table(name = "favorites")
     @Builder
     @AllArgsConstructor(access = AccessLevel.PROTECTED)
     @NoArgsConstructor(access = AccessLevel.PROTECTED)
     public class Favorites {
         @Id
         @GeneratedValue(strategy = GenerationType.IDENTITY)
         private long id;
    
         @Convert(converter = StringListConverter.class)
         @Column(columnDefinition = "json")
         private List<String> tickerList;
     }