사이드 프로젝트를 진행하며 여러 에러를 마주치게 되었는데 그 중 몇가지를 소개해보려 한다. 이번에 마주친 에러는 제약조건 에러
와 LocalDateTime 배열 문제
였다.
다른 서버 팀원의 PR을 merge하고 로컬로 받아와 코드를 실행했을 때 오류가 발생했다.
위처럼 제약조건 관련 에러가 발생한 것이다. 스프링 개발은 처음이라 JPA 데이터베이스의 수정이 반영되는 조건에 대해 몰랐었다. 팀원분께 해당 에러에 대해 여쭤보고 해결법을 배웠다.
기존에 JPA 관련 설정은 application.yml
에 작성했다. 기존 코드는 이렇다.
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/doyouhave
username: ${datasource.username}
password: ${datasource.password}
jpa:
hibernate:
ddl-auto: update
show-sql: true
database: postgresql
database-platform: org.hibernate.dialect.PostgreSQLDialect
open-in-view: false
generate-ddl: true
이때 ddl-auto: update
부분이 문제였다. ddl-auto는 애플리케이션 구동 시 JPA의 데이터베이스 초기화 전략이다. 선택지는 아래와 같다.
ddl-auto
none : 사용하지 않음
create : 기존 테이블 삭제 후 테이블 생성 (기존 데이터 삭제)
create-drop : 기존 테이블 삭제 후 테이블 생성, 종료 시점에 테이블 삭제
update : 변경된 스키마 적용 (컬럼 추가만)
validate : 엔티티와 테이블 정상 매핑 확인
- 스테이징, 운영환경에서는 절대로 create, create-drop, update를 사용하면 안된다. 테이블 생성 및 컬럼 추가, 삭제, 변경은 데이터베이스에서 직접하며, none을 사용하거나 validate를 이용해 정상적인 매핑 관계만 확인해야 한다.
-> DB 수정이 크게 이뤄진 경우 : pull 받고 처음 실행시킬 때 잠시 create로 설정해서 실행시키기. (DB 업데이트)
DB(postgresql)에는 timestamp type으로 저장되는 컬럼 값을 코드 DTO로 가져올 때 LocalDateTime type으로 가져왔다.
// DTO
private LocalDateTime createdDate;
그런데 해당 데이터를 JSON으로 반환하니 LocalDateTime 값이 배열로 찍혀 출력되었다.
아마 Jackson으로 LocalDateTime을 직렬화할 때 문제가 있는 것 같다. 해당 이슈는 유명.. 다음에 Jackson 공부를 하고 포스팅을 할 때 한번 더 다뤄보려 한다.
@JsonFormat
을 엔티티나, Response객체에 LocalDateTime 필드에 넣어주면 된다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime createdDate;