JPA로 INSERT할때 MySQL 테이블 DEFAULT 값 넣기
임의로 생성한 테이블은 다음과 같다.
CREATE TABLE inquiry (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
title VARCHAR(255),
content VARCHAR(255),
reg_date DATETIME DEFAULT NOW()
)
앞전에 게시판 만들때는 서버(자바)에서 현재 시간을 MVC패턴의 서비스단에서 다음의 코드로 갱신을 시켜줬었다.
poster.setRegdate(LocalDateTime.now());
이번에는 reg_date 컬럼의 값은 DEFAULT로 DB에서 현재 시간을 넣어주는 방식을 생각했다.
아래의 JSON 데이터를 전송하여 서버에서 JPA를 사용하여 저장할 것이다.
{"title": "title!", "name":"name!", "content":"content!"}
의도와 달리 reg_date에 NULL이 들어간다.
날라가는 INSERT 쿼리에 reg_date가 포함되어 있으며 NULL 값이 들어간다.
이는 JPA 구현체인 Hibernate가 엔티티를 등록하거나 수정할때 모든 필드를 업데이트하는 방식이기 때문이다.
필드 값이 없거나 업데이트 되지 않았어도 null 값을 넣는다...
수정된 값이 아니더라도 말이다.
불필요하게 모든 필드를 업데이트함으로써 데이터 전송량이 증가하지만 얻는 장점은 다음과 같다.
- 모든 필드를 사용하면 등록, 수정 쿼리가 항상 같다. -> 쿼리 생성후 재 사용 가능.
- DB에 동일한 쿼리 전송시 이전에 파싱된 쿼리 재사용 가능하다.
이 방법을 @DynamicInsert와 @DynamicUpdate로 변경이 가능하다.
실제 등록, 수정되는 컬럼에 대한 쿼리만 날리는 것이다.
엔티티에 @DynamicInsert를 붙여주자.
이제 입력한 필드에 대해서만 INSERT문이 날라간다.
이 방법 외에도 필드 기본값 설정에 다양한 방법들이 있지만 한가지 더 추가하자면
@CreationTimestamp : INSERT 쿼리 발생시 현재 시간 값을 넣어줌
@UpdateTimestamp : Update 쿼리가 발생시 현재 시간 값을 넣어줌
reg_date에 현재 시간이 들어가 INSERT가 날라간다.
처음엔 다음의 코드로 해결할 수 있을 것 같았다. DB에 생성을 위임하는 줄 알았다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
동작하지는 않았고 보니깐 주로 키 또는 AUTO_INCREMENT에 사용한다고 한다.