들어가며
지금까지 짧게 잤던 날들의 후폭풍을 맞는 중이다. 자도자도 졸리고 피곤하네,,, 자꾸 늦게 자고 제때 못일어나서 CS스터디에 참여하지 못한다. 오늘 뭘 했든 못했든 일찍 자서 패턴을 되돌려야겠다.
라고 생각하며 오늘의 TIL은 주특기 첫번째 주차 과제인 [나만의 블로그 만들기]를 개발하면서 겪은 트러블 슈팅을 하고자 한다.
트러블 슈팅
문제 - PropertValueException 에러
너무 간단한 실수라 트러블 슈팅을 할까 말까 고민했는데 나중에 같은 실수하는 걸 방지하기 위해서 작성한다.
전체 에러 코드는 다음과 같았다
org.hibernate.PropertyValueException:
not-null property references a null or transient value : com.homework.homework.domain.Post.nickname
api 테스트로 데이터를 post했는데 값이 null로 받아진다는 에러였는데, 알고보니 별거아닌 문제였다.
초반 기획에서 살짝 바뀌는 부분이 있어서 컬럼을 하나 더 추가해야했는데, entity나 service에서는 제대로 추가했지만 컨트롤러에서 데이터를 받아오는 DTO에는 필드를 추가하지 않아서 아예 데이터가 넘어가지 않고 있었다. 새로 추가한 컬럼이 nullable했다면 나중이나 되어서야 발견했을 실수였는데 다행히 not null인 컬럼이여서 발견했다!
기획이 중간에 바뀐다면 코드를 꼼꼼히 살펴보자!
문제 - InvalidDefinitionException 에러
DTO에 builder를 사용해보려다가 실수한 부분이로 인해 나타난 에러였다.
전체코드는 다음과 같다.
com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of com.homework.homework.dto.PostDto (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
에러코드를 읽어보면 DTO에 생성자가 없다고 말해주고 있다.
DTO에 @Setter
어노테이션이 있는데 왜 생성자가...? 라고 생각하는 찰나 @Builder
어노테이션을 이용하기 위해서는 모든 인자를 가진 생성자가 필요하다는 사실이 떠올랐다. 나는 그냥 @Builder
어노테이션만 붙여놓고 사용하려고 했으니 에러가 나는 것이었다.
결국에는 DTO에는 빌더 패턴을 적용하지 않으려고 @Builder 어노테이션을 제거해줌으로써 해결했다.
문제 - DB에서 createdAt과 modifiedAt이 null로 저장되는 문제
강의에서는 JPA를 이용할 때, 생성일자와 수정일자를 별도의 구현체인 Timestamped로 분리해서 Entity에 상속시켜주라고 설명하고 있다.
이런 식으로 말이다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
@CreatedDate
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime modifiedAt;
}
이 추상 클래스를 구현해 준다음 entity에 extends해주었는데 왜인지 자꾸 테이블에는 null로 저장되고 있었다.
이유는 중요한 한가지 어노테이션을 빠뜨렸기 때문이었는데, Spring을 실행하는 {프로젝트명}Application 클래스에 @EnableJpaAuditing
어노테이션을 작성하지 않았기 때문에 JPA에서 timestamp를 감지하지 못하고 아무것도 넘기고 있지 못했던 것이다.
참고로 @EnableJpaAuditing
는 Spring Data JPA에서 반복적으로 등장하는 컬럼들을 자동으로 넣어주는 기능을 하고 있다.
마치며
처음 spring을 배울 때로 돌아간 기분... 여태껏 혼자 프론트와 백을 다 해와서 한번에 한 페이지씩 view와 api를 만들었었는데, 이번에는 백만 만드려고 하니 어떻게 해야할 지 많이 생각하고 진행해야했다. 데이터를 넘길 때 어떻게 넘겨줄 지를 잘 생각해야했기에 시간이 많이 들 것 같다.
오늘의 한마디 by 현우님 - 멍멍
'Study > TIL' 카테고리의 다른 글
[TIL] 06/07 항해99 30일차 - JPA sort, 삽질로그 (0) | 2022.06.08 |
---|---|
[TIL] 06/06 항해99 29일차 - 과제 [나만의 블로그 만들기] (0) | 2022.06.07 |
[TIL] 06/03 항해99 26일차 - domain & DTO (0) | 2022.06.04 |
[TIL] 06/02 항해99 25일차 - 트러블 슈팅 (1) | 2022.06.03 |
[TIL] 06/01 항해99 24일차 - JPA를 사용하는 이유?, JPA 초기 세팅 (0) | 2022.06.01 |