24. 12. 16 기록
Spring Data JPA Auditing 활성화를 잊지 말자
[문제 상황]
회원 가입 API를 만들고 postman을 실행했는데, 자동으로 생성되어야하는 "createdDate"값이 null로 나왔다.
[해결 시도]
먼저 오타나 누락한 어노테이션은 없는지 살펴보았다.
하지만 필요한 어노테이션도 다 달았고, Member 클래스에 상속도 잘 되어있다.
Controller, Service, Repository 모두 살펴 보았지만 로직 문제는 아니었다.
[해결]
검색을 통해 내가 Spring Data JPA의 Auditing 기능 활성화 단계를 거치지 않았다는 것을 알게 되었다. 😶
이에 @EnableJpaAuditing 어노테이션을 @SpringBootApplication이 선언된 클래스에 추가하였다.
수정 후 "createdDate"에 시간이 정상적으로 입력된 것을 확인 할 수 있었다.
JSON 직렬화 동작을 이해하자
[문제 상황]
'회원 가입' 후 Response Body에 "id", "name", "email", "createdDate" 정보가 모두 출력되어야하는데,
"createdDate"만 출력되는 문제가 생겼다.
[해결 시도]
DB에는 정보가 모두 제대로 저장되어있었기에 ResponseDto 출력 과정에서 문제가 있을 것으로 추측했다.
먼저, Service에서 구현한 signUp( )메서드를 살펴보았다.
혹시라도 return 과정에서 필요한 값을 누락시키지는 않았는지 살펴보았지만 문제가 없었다.
이어서 Controller도 확인해보았지만 별다른 문제는 없었다.
[해결]
GPT에게 문제 상황을 공유하니 가능성 있는 몇 가지 원인을 제시해주었다.
그 중에서도 'JSON 직렬화 설정'이 문제의 원인으로 가장 유력해보였다.
1. 기본적으로 모든 public 필드를 직렬화한다.
2. 필드의 접근제어자가 private일 경우 Getter가 있는 필드만 직렬화한다.
그렇다! JSON을 직렬화하려면 필드가 public이 아닌이상 Getter가 필요하다! 😮
Dto를 작성하면서 'ResponseDto는 값을 담아주기만 하면 되니까 Getter는 필요 없겠지?'라는 생각으로 @Getter를 생략했던게 문제가 된 것이다.
이후 모든 ResponseDto에 @Getter 어노테이션을 추가했고 Response Body도 정상 출력되는 것을 확인할 수 있었다.
24. 12. 17 기록
Http status '204 No Content' 잘 알고 사용하자
[문제 상황]
'전체 회원 조회' API를 구현 하면서 요청은 정상적으로 받았으나 반환할 회원 정보가 없을 경우 204 No Content 와 함께 "No Content exists" 메세지를 출력하려고 하였다.
근데 body가 출력되지 않는다.. 🙄❔
[해결]
찾아보니 204 상태 코드는 body를 가지지 않는다고 한다. 🔗
물론 억지로 body를 포함하도록 할 수는 있지만, 잘못된 사용법이기도 하고, 브라우저별로 204 상태 코드를 처리하는 방식이 다르기 때문에 body를 포함시키는 것은 권장되지 않는다.
또, 204 상태 코드는 클라이언트가 응답 본문을 필요로하지 않을 때 사용하는 것이 좋다고 한다. 🔗
나는 출력할 회원 정보가 없을 때 body에 "No Content exists" 메세지를 담아 응답하려고 했기 때문에,
204 상태 코드는 요구사항에 맞지 않는 상태 코드라고 판단했다.
404 Not Found를 사용할까도 했지만, 출력할 회원정보가 없는게 클라이언트 문제는 아니기 때문에 옳지 않은 선택이라고 생각했다.
메세지를 포함할 body도 필요하고, 응답 요청 및 처리 과정에서도 문제는 없었으니 상태 코드 200 OK를 사용하기로했다.
그래서 따로 Exception 타입을 정의하고 GlobalExceptionHandler 클래스를 통해 처리해주는 방식을 택했다. 🔗
덕분에 반환할 정보가 없을 때, 클라이언트에게 좀 더 구체적인 정보를 전달할 수 있게 되었다! 😄
'프로젝트 > 일정 관리 앱 만들기(개인)' 카테고리의 다른 글
[Trouble shooting] 일정 관리 앱 만들기 - 트러블 슈팅 (0) | 2024.12.10 |
---|