Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
SERVER PR
🙏 깃이 한번 꼬였어서 다시 제출하는 점 양해 부탁드립니다
💫 Related Issue
🐕 과제 구현 명세
✅ 기본 과제
세미나 시간에 배운 코드 작성 완료 했습니다 !
패키지 구조
domain
: Entity 등 도메인과 관련된 파일infrastructure
: repository 파일✅ 심화 과제
Post_Comment
테이블을 추가했습니다 !User - Post
: 일대다 (One-to-Many) 관계Post - Comment
: 일대다 (One-to-Many) 관계Comment - User
: 다대일 (Many-to-One) 관계📌 API 명세서
✅ 생각 과제
https://yesuri-masuri.notion.site/3-63b35bd64979489d8c5a555c1bba5a7f
🐥 이런 점이 새로웠어요 / 어려웠어요
@NotNull
,@NotEmpty
,@NotBlank
의 차이가 헷갈렸는데 아래에 정리해두었습니다!@Valid
은 정확히 무엇을 검증하는 것일까 ?@ResponseStatus
어노테이션으로 각각 상태 코드에 맞춰 해당하는 response를 보내주는 것은 모두 성공에 대한 케이스만 작성해준다.@RestControllerAdvice
어노테이션을 사용해서 Advice 파일에서 처리를 해주도록 작성한다.@ResponseStatus
의 상태 코드마다 분기 처리를 해주어야 하면 api 들 사이에서도 중복되는 코드가 많아서 동적으로 바인딩 해주어야 간편한게 아닌가라고 생각했지만, 에러 처리를 모두 Advice에서 해주므로 이 문제가 해결 된다는 것을 처음에 생각을 못했다. 기억하자!FieldError fieldError = Objects.requireNonNull(e.getFieldError());
Objects.requireNonNull()
은 Java 8에서 추가된 메서드로서, 지정된 객체가 null이 아닌지 확인하는 데 사용됩니다. 만약 객체가 null이라면NullPointerException
을 발생시킵니다.e.getFieldError()
는 스프링의 예외 처리에서 발생한 예외 객체(e
)에서 필드 에러 정보(FieldError
)를 가져오는 메서드입니다.FieldError
는 사용자가 제출한 폼 데이터나 요청 매개변수와 관련하여 발생한 검증 오류 정보를 나타냅니다. 폼 데이터의 유효성 검사를 수행하는 동안 에러가 발생하면, 이 객체를 통해 에러에 대한 자세한 정보를 얻을 수 있습니다.Objects.requireNonNull()
을 사용하여e.getFieldError()
의 결과가 null인지 확인한 뒤,fieldError
변수에 할당합니다. 만약e.getFieldError()
가 null이라면NullPointerException
이 발생합니다.fieldError
변수에 할당된 후에는fieldError
객체를 통해 필드 에러와 관련된 정보를 활용할 수 있습니다. 예를 들어, 에러 메시지를 가져오거나 에러가 발생한 필드의 이름을 확인하는 등의 작업을 수행할 수 있습니다.☑️ 심화 과제: 연관 관계 매핑도 그렇고, 예외처리 로직도 그렇고 뭔가 둥둥 떠다니는 개념을 잡아가며 하느라 오래 걸린 것 같습니다 ! 이해하고 짜는 습관 아자아자🔥
@MappedSuperclass
: 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할@EntityListeners(AuditingEntityListener.class)
: Auditing을 적용할 엔티티에 해당 어노테이션을 붙여주면 된다.AuditingEntityListener.class
라는 이벤트 리스너를 넣어줌으로서, Spring Data JPA에서 제공하는 이벤트 리스너로 엔티티의 영속, 수정 이벤트를 감지하는 역할을 한다.ErrorStatus
CustomException
ResponseEntity
ResponseEntity
객체를 생성해서 내려주도록 구현한다.@ResponseStatus
로도 해결 가능 ! 이 어노테이션을 통해 HttpStatus 코드 값을 바꿀 수 있다.ResponseEntity
클래스를 사용해서 controller에서 response 객체를 내려줄 수도 있고, 우리가 하는 것처럼ApiResponse
클래스를 따로 구현해서 커스텀할 수도 있는 것이다 !ControllerExceptionAdvice
@ControllerAdvice
를 사용하는데, 현재 우리는 View를 사용하지 않고 단순히 Rest API 만을 사용하므로@RestControllerAdvice
를 에러를 처리해주는 ControllerExceptionAdvice 클래스에 붙여준다.@ExceptionHandler
를 붙여준다.ApiResponse
클래스에@Getter
를 붙이지 않으면HttpMediaTypeNotAcceptableException
: 에외가 터진다… 왜 그런지를 고민해보고 공부해봤다.ApiResponse
라는 클래스를 만들어 일정한 response body를 내려주고 있다. 이 때 Jackson 라이브러리를 통해서 객체 형태를 json 타입으로 바꿔준다.@JsonProperty
,@JsonAutoDetect
를 사용해 멤버 변수를 프로퍼티로 지정할 수 있다고 한다.