본문 바로가기

게으른개발자/공부

JPA 를 사용하여 JSON 문자열을 객체에 매핑하기

Json 문자열 형태를 저장하는 Column 을 가진 Table 을 JPA를 통해 Entity 를 구현할때 

단순히 String 형태의 자료형을 사용할 수 있다.

 

그러나 로직에서 JsonObject를 통해 파싱해야하는 번거로움이 있다.

 

DB에서 해당 데이터를 읽어올때 부터 특정 객체에 매핑을 해서 가져온다면 로직 구현이 용이해 진다.

 

 

 

Member  테이블에  information 이라는 Json형태의 문자열을 저장하는 Column 이 있다고 가정한다.

 

 

해당 테이블에는 아래와 같이 information Column에 Json 문자열이 들어가게 사용되고 있다고 가정한다.

- 예제 문자열: { "name":"Goslim", "age":31, "city":"Seoul" }

 

information Column에 저장되는 Json 문자열 데이터는 name, age, city  키값을 가진 Json 문자열이 이기 때문에 

해당 문자열을 매핑시킬 Class 또한, 아래의 예제 코드와 같이 해당 키값(name, age, city)의 데이터를 수용할 property를 선언한다.

public class Information {
  private String name;
  private String city;
  private int age;
}

 

 

이제, 데이터를 받을 class 를 선언했으니 converter 역할을 해줄 클래스를 선언해야 한다.

 

JPA가 지원하지 않는 타입을 매핑을 매핑할때 사용하는 AttributeConverter interface 를 이용해서 converter 를 구현한다.

public class InformationJsonConverter implements AttributeConverter<Information, String> {

  private final ObjectMapper objectMapper = new ObjectMapper();

  @Override
  public String convertToDatabaseColumn(Information information) {
    //Information 객체 -> Json 문자열로 변환
    try {
      return objectMapper.writeValueAsString(information);
    } catch (Exception e) {
      return null;
    }
  }

  @Override
  public Information convertToEntityAttribute(String jsonString) {
    //Json 문자열 Information 객체로 변환
    try {
      return objectMapper.readValue(jsonString, Information.class);
    } catch (Exception e) {
      return null;
    }
  }
}

 

 

위와 같이 converter 역할을 해줄 클래스(InformationJsonConverter)와 Json 문자열을 받을 클래스(Information)를 만들었다면, 

@Convert 어노테이션을 이용해 Entity 인 Member 클래스에 아래와 같이 반영 하면 된다.

@Entity
public class Member {

  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(columnDefinition = "varchar(255)")
  @Convert(converter = InformationJsonConverter.class)
  private Information information;
}

 

 

 

- 참고: https://stackoverflow.com/questions/25738569/how-to-map-a-map-json-column-to-java-object-with-jpa