들어가며
다른 수강생분 덕에 계속 머리싸매던 부분을 속시원하게 해결했다!
적용해보고 싶은게 많았지만 전부다 해보기는 수정해야할 부분이 너무 많아서 하나씩 적용할 수 있는 부분들만 하기로 했다.
따라서 오늘의 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를 날려버린 썰인데 보기만해도 아찔하다.
삽질로그
마치며
내일은 벌써 주특기 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 |