기존의 프로젝트는 json 형식의 데이터를 MySQL의 한 컬럼으로 저장하기 위해 List<Map<String,String>> 형태의 input data를 생성하고, ObjectMapper를 사용해 json 형식의 String을 writeValueAsString으로 생성 후 varchar 타입 컬럼에 insert 하는 과정을 거치고 있었다.
매번 ObjectMapper로 해당 데이터들을 파싱하는 작업은 번거롭기 때문에 해당 라이브러리를 사용하자.
GitHub - vladmihalcea/hypersistence-utils: The Hypersistence Utils library (previously known as Hibernate Types) gives you Sprin
The Hypersistence Utils library (previously known as Hibernate Types) gives you Spring and Hibernate utilities that can help you get the most out of your data access layer. - vladmihalcea/hypersist...
github.com
build.gradle
먼저 주입할 라이브러리 버전 설정을 위해 현재 사용하고 있는 hibernate 버전을 확인한다.
좌측 Project 탭에서 External Libraries 클릭 후 hibernate를 검색하면 현재 사용하고 있는 버전 확인이 가능하다.
github README에 명시된 버전에 맞춰 사용하면 된다.
나는 hypersistence-utils-hiberante-60:3.3.1 버전을 implementation 했다.
implementation 'io.hypersistence:hypersistence-utils-hibernate-60:3.3.1'
JSON 파싱용 라이브러리 (jackson) 주입 받기
JSON 타입을 제대로 parsing 하기 위해 추가적인 parsing용 라이브러리를 주입 받는다.
hibernate 6.0, 6.1, 6.2 기준 유효한 버전은 다음과 같다.
// gradle
implementation 'com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations'
연습해보기
해당 라이브러리를 사용하기 위해 기본적인 JPA와 데이터베이스 설정은 준비된 상태라고 가정한다.
Entity 생성
@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String subject;
@Type(JsonType.class)
@Column(name = "CONTENT", columnDefinition = "longtext")
private Map<String, Object> content;
}
간단하게 id, subject(제목), content(json 타입) 컬럼만 생성했다.
현재 필자는 hibernate 6를 사용중이므로 hypersistence-utils 설명에 명시된 바와 같이 @Type(JsonType.class) 만 해당 컬럼에 명시해주면 hypersistence-utils가 인식해서 작동한다.
@Column어노테이션을 사용하여 name을 명시해주지 않는다면 에러가 발생한다. 필히 명시하자.
Repository 생성
public interface PostRepository extends JpaRepository<Post, Long> {
}
내용을 입력받을 Form 생성
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ContentForm {
private Map<String, Object> content;
}
Controller 생성
@RestController
@RequiredArgsConstructor
public class PostController {
private final PostRepository postRepository;
@PostMapping("/post")
public ResponseEntity<Post> saveTestCases(@RequestBody ContentForm contentForm) {
Post post = Post.builder()
.subject("첫번째 테스트용")
.content(contentForm.getContent())
.build();
return ResponseEntity.ok(postRepository.save(post));
}
}
데이터 저장 확인
필자는 Postman을 사용하였다.
수정 사항이 상당히 많지만 어떻게 동작하는지 어떻게 데이터를 저장해야 하는지에 대해 간단히 알아보았다.
'SpringBoot' 카테고리의 다른 글
SSE (Server-Sent Event) 구현 (0) | 2024.04.10 |
---|---|
Spring Security + JWT 토큰을 사용한 로그인 (0) | 2024.04.02 |
JWT (0) | 2024.03.30 |
회원가입 시 입력받은 이메일로 인증링크 전송 (0) | 2024.03.27 |
JPA 외래키를 기본키로 사용하기 (0) | 2024.03.27 |