[TIL] 06/08 항해99 31일차 - 유효성검증, 삽질로그

2022. 6. 9. 00:21· Study/TIL
목차
  1. 유효성검증 - @Valid
  2. JPA Hibernate DDL 초기화 전략
  3. 삽질로그

 

들어가며

다른 수강생분 덕에 계속 머리싸매던 부분을 속시원하게 해결했다!

적용해보고 싶은게 많았지만 전부다 해보기는 수정해야할 부분이 너무 많아서 하나씩 적용할 수 있는 부분들만 하기로 했다.

 

따라서 오늘의 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 지연로딩

 

[삽질로그] JPA 지연로딩

문제상황 지난 삽질로그에서 계속 고민하던 문제인 '왜 지연로딩을 설정했는데도 참조하고 있는 객체를 통째로 들고다니지?' 라는 물음에 대한 이유를 어느정도 파악한 것 같다. PostRestController.j

annajin.tistory.com

 


마치며

내일은 벌써 주특기 1주차가 끝나는 날이다. 역시 직접 코드를 치다보니 시간이 빨리 간다... 내일은 각잡고 정리하고자했던 부분 정리해야겠다.

 

 


출처 및 참고

 

[Spring] @Valid와 @Validated를 이용한 유효성 검증의 동작 원리 및 사용법 예시 - (1/2)

 

ddl-auto 옵션 관련 주의할 점!!!!!!!!!

저작자표시 비영리 (새창열림)

'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
  1. 유효성검증 - @Valid
  2. JPA Hibernate DDL 초기화 전략
  3. 삽질로그
'Study/TIL' 카테고리의 다른 글
  • [TIL] 06/10 항해99 33일차 - 프록시, 즉시 로딩 / 지연 로딩
  • [TIL] 06/09 항해99 32일차 - 스프링 프레임워크(Spring Framework
  • [TIL] 06/07 항해99 30일차 - JPA sort, 삽질로그
  • [TIL] 06/06 항해99 29일차 - 과제 [나만의 블로그 만들기]
Anna-Jin
Anna-Jin
내일 한걸음 더Anna-Jin 님의 블로그입니다.
Anna-Jin
내일 한걸음 더
Anna-Jin
TOTAL
TODAY
YDAY
  • CATEGORY (212)
    • Project (0)
      • Zero2One.Dev (0)
    • Algorithm (40)
      • Leetcode (20)
      • Programmers (1)
      • CODETREE (0)
      • Baekjoon (7)
      • etc (12)
    • JAVA (42)
      • JAVA (20)
      • 점프투자바 (16)
      • 이것이 자바다 (6)
    • Spring boot (20)
    • Database (9)
    • CS (11)
    • Study (80)
      • Trouble Shooting (11)
      • TIL (50)
      • WIL (11)
      • Etc (8)
    • Review (10)
    • Projects (0)
      • Blog (0)

BLOG MENU

  • GITHUB
  • RESUME

공지사항

POPULAR POSTS

태그

  • JPA
  • 항해99
  • MySQL
  • 알고리즘
  • 확인문제
  • 자바
  • spring boot
  • 코테
  • 트러블슈팅
  • 코딩테스트
  • 이것이 자바다
  • Algorithm
  • 자료구조
  • 리트코드
  • leetcode
  • Wil
  • 삽질로그
  • til
  • Java
  • 회고록

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
Anna-Jin
[TIL] 06/08 항해99 31일차 - 유효성검증, 삽질로그
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.