[Spring] 프로젝트 도중 마주친 에러 (1)

이수민·2023년 2월 26일
0

spring

목록 보기
10/12

사이드 프로젝트를 진행하며 여러 에러를 마주치게 되었는데 그 중 몇가지를 소개해보려 한다. 이번에 마주친 에러는 제약조건 에러LocalDateTime 배열 문제였다.

1. 제약조건 에러

문제 발생

다른 서버 팀원의 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를 이용해 정상적인 매핑 관계만 확인해야 한다.

update로 설정되어 있어 제약조건 변경은 적용이 되지 않은 것이다. 임시로 ddl-auto 값을 create로 바꾸고 작동시키니 정상적으로 작동했다. 그 후 다시 update로 설정해놓았다.

-> DB 수정이 크게 이뤄진 경우 : pull 받고 처음 실행시킬 때 잠시 create로 설정해서 실행시키기. (DB 업데이트)



2. JSON에서 LocalDateTime 값이 배열로 출력되는 문제

문제 발생

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;


레퍼런스

데이터베이스 초기화 전략 - DDL AUTO 옵션
LocalDateTime 배열로 나오는 문제

profile
BE 개발자를 꿈꾸는 학생입니다🐣

0개의 댓글