들어가며
다른 수강생분 덕에 계속 머리싸매던 부분을 속시원하게 해결했다!
적용해보고 싶은게 많았지만 전부다 해보기는 수정해야할 부분이 너무 많아서 하나씩 적용할 수 있는 부분들만 하기로 했다.
따라서 오늘의 TIL은 과제 [나만의 블로그 만들기]에 적용한 예외처리 방법을 간단하게 소개하고 삽질로그를 올려보고자 한다
유효성검증 - @Valid
@Valid는 JSR-303 표준 스펙으로써 제약 조건이 부여된 객체에 대해 빈 검증기(Bean Validator)를 이용해서 검증하도록 지시하는 어노테이션이다
출처 - 망나니 개발자님의 블로그
이 빈 검증기를 이용해서 RestController로 들어오는 값들을 편리하게 검증할 수 있다.
정말 편리하게도 DTO에 원하는 검증 어노테이션을 붙여주고 Controller단에 @Valid
어노테이션만 붙여주면 알아서 검증을 해준다.
그럼 @Valid
를 사용해보자!
1. 의존성 추가
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-validation'
2. 검증할 객체에 어노테이션 추가
사용할 수 있는 모든 어노테이션 목록은 여기를 참고하자.
대표적인 어노테이션들 몇가지를 나열해보자면 다음과 같다.
어노테이션 | 설명 |
@NotNull | 해당 값이 null이 아닌지 검증함 |
@NotEmpty | 해당 값이 null이 아니고, 빈 스트링("") 아닌지 검증함. (" "은 허용됨) |
@NotBlank | 해당 값이 null이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증함 |
@AssertTrue | 해당 값이 true인지 검증함 |
@Size | 해당 값이 주어진 값 사이에 해당하는지 검증함 (String, Collection, Map, Array에도 적용 가능) |
@Min | 해당 값이 주어진 값보다 작지 않은지 검증함 |
@Max | 해당 값이 주어진 값보다 크지 않은지 검증함 |
나는 Comment에 빈 스트링("")이 들어왔을 때, 유효성 검사를 하고 싶었기에 다음과 같이 해주었다.
참고로 어노테이션에 message를 붙여주면 에러 메세지를 원하는 대로 커스텀할 수도 있다.
CommentDto.java
@Getter @Setter
public class CommentDto {
private String nickname;
@NotEmpty(message = "댓글 내용을 작성해주세요.")
private String comment;
}
3. Controller에서 파라미터로 받는 DTO 앞에 @Valid
어노테이션 붙여주기
CommentRestController.java
@PostMapping("/{postId}/newcomment")
public Map<String, Object> addComment(
@PathVariable Long postId,
@RequestBody @Valid CommentDto commentDto) {
return commentService.addComment(postId, commentDto);
}
결과 - 400 Bad Request
Resolved [org.springframework.web.bind.MethodArgumentNotValidException:
Validation failed for argument [1] in public java.util.Map<java.lang.String, java.lang.Object> com.homework.homework.restController.CommentRestController.addComment(java.lang.Long,com.homework.homework.dto.CommentDto):
[Field error in object 'commentDto' on field 'comment':
rejected value []; codes [NotEmpty.commentDto.comment,NotEmpty.comment,NotEmpty.java.lang.String,NotEmpty];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [commentDto.comment,comment]; arguments []; default message [comment]]; default message [댓글 내용을 작성해주세요.]] ]
간단하게 유효성 검사를 해보았다. 다음에는 전역 예외 처리로 @RestControllerAdvice
를 사용해보기로!
JPA Hibernate DDL 초기화 전략
JPA HIbernate를 사용하는데 일일히 DDL 쿼리를 날릴 바에는 간단한 설정을 통해 자동으로 Spring Application이 실행될 때, DB를 자동으로 초기화 혹은 그 외의 기능을 수행해보자
ddl-auto
ddl-auto를 사용하기 위해 application.yml에 아래 코드를 추가해주자.
jpa:
generate-ddl: true
hibernate:
ddl-auto: create
generate-ddl은 ddl-auto를 사용하기 위한 설정이고, ddl-auto가 우리가 찾던 바로 그 기능이다.
ddl-auto의 옵션은 다음과 같다.
옵션 | 설명 |
create | 기존테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 같으나 종료시점에 테이블 DROP |
update | 변경분만 반영(운영DB에서는 사용하면 안됨) |
validate | 엔티티와 테이블이 정상 매핑되었는지만 확인 |
none | 사용하지 않음(사실상 없는 값이지만 관례상 none이라고 한다.) |
이 기능은 로컬환경에서 테스트를 하면서 진행하기에는 좋은 기능이지만 실무에서는 사용했다가 머리를 싸매는 일이 생길 수 있기 때문에 주의를 하는게 좋다고 한다.
주의점을 간략하게 정리할테니 절대 잊지 말자!!! 실무에서 테이블 다 날려먹으면 대참사니까...!
- 운영 장비에서는 절대 crate, create-drop, update 사용하면 안된다.
- 개발 초기 단계는 create 또는 update
- 테스트 서버는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
어떤 대참사가 일어나는지 알고싶다면 이 유튜브로 알아보자. 실무에서 회사 결제시스템 DB를 날려버린 썰인데 보기만해도 아찔하다.
삽질로그
[삽질로그] JPA 지연로딩
문제상황 지난 삽질로그에서 계속 고민하던 문제인 '왜 지연로딩을 설정했는데도 참조하고 있는 객체를 통째로 들고다니지?' 라는 물음에 대한 이유를 어느정도 파악한 것 같다. PostRestController.j
annajin.tistory.com
마치며
내일은 벌써 주특기 1주차가 끝나는 날이다. 역시 직접 코드를 치다보니 시간이 빨리 간다... 내일은 각잡고 정리하고자했던 부분 정리해야겠다.
출처 및 참고
[Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)
'Study > TIL' 카테고리의 다른 글
[TIL] 06/10 항해99 33일차 - 프록시, 즉시 로딩 / 지연 로딩 (0) | 2022.06.11 |
---|---|
[TIL] 06/09 항해99 32일차 - 스프링 프레임워크(Spring Framework (0) | 2022.06.09 |
[TIL] 06/07 항해99 30일차 - JPA sort, 삽질로그 (0) | 2022.06.08 |
[TIL] 06/06 항해99 29일차 - 과제 [나만의 블로그 만들기] (0) | 2022.06.07 |
[TIL] 06/04 항해99 27일차 - 과제 [나만의 블로그 만들기] (0) | 2022.06.05 |