spring boot // validation을 AOP로 사용하기
springboot 21강 - ResponseEntity와 @Valid와 @BindResult 사용하기
https://blog.naver.com/getinthere/221795214908
--
참고 리파지토리
https://github.com/codingspecialist/Springboot-Jpa-AOP-Valid-RestDoc
현재 프로젝트 (아래 코드 설명과 같이 보려면 이곳을 확인)
https://github.com/jaybon1/springwork/tree/master/validEx01
프로젝트 생성
밸리데이션 추가(위에서 추가해도되고 따로 이렇게 추가해도됨)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Spring boot DevTools -> 코드변경시 바로 리로드 및 캐시 사용안하는 등 편리하다
구조
---
application.yml
--
ProjectTask.java
의존성에 추가한 validation을 이용한다
@NotBlank - 널값이나 빈값으로 올경우 잡아낸다
@Size - 내용의 길이를 확인하여 맞지 않는 경우 잡아낸다
@Email - 이메일 형식에 맞지 않으면 잡아낸다
이외에도 다양한 어노테이션이 있으니 확인
----
StatusCode.java
상태값을 설정한다 (기존의 상태값을 이용하려면 HTTP상태코드 검색)
--
ProjectTaskRepository.java
Jpa리파지토리를 상속
---
RespDto.java
안드로이드나 리액트 등 데이터를 리턴받는 뷰 쪽에서 요청이 올 경우 돌려보낼 데이터
제네릭을 이용하여 데이터를 변화시켜 보내준다
--
BindingAdvice.java
AOP로 등록하기 위해 @Aspect 를 붙여준다
IOC를 위해 @Component를 붙여준다
---
팁
JoinPoint는 핵심로직이다 (즉 Controller의 실행될 메서드)
PointCut은 공통기능의 위치를 말한다
Weaving은 공통기능을 배치하는 것을 말한다
Advice는 공통기능을 말한다
@Before는 핵심로직전 @After는 핵심로직후 @Around (Before After 바깥)
@Before @After 는 request를 못들고 온다
@Around는 JoinPoint 메서드의 컨텍스트를 들고 올 수 있다(request 등)
excution within 등 확인
---
execution 내용 설명
*은 메서드명
(..) 매개변수 0개이상 (*) 매개변수 1개 -> *(..) = 모든 메서드, 모든 매개변수 개수
주소의 *는 모든 값 -> com.jaybon.validEx01.test.* = test하위의 모든 기능
.*Controller 모든 하위 Controller -> com.jaybon.validEx01..*Controller.*(..) = validEx01의모든 하위컨트롤러의 모든메서드
--
1. proceedingJoinPoint는 실행할 Controller 메서드의 정보이다.
2. proceedingJoinPoint의 매개변수들을 가져온다
3. 매개변수 중 BindingResult가 있고 에러가 났다면 요청실패 객체를 리턴한다
4. 에러가 나지 않았다면 그대로 메서드를 진행한다
---
BindControllerTest.java
AOP테스트를 위한 컨트롤러
--
테스트 결과
--
ProjectTaskController.java
@Autowired는 IOC 된 클래스에서만 작동한다(즉 @Component 및 관련 어노테이션을 붙이지 않은 클래스에서는 작동하지 않음)
AOP로 validation을 하기 위해서는 체크할 매개변수 입력데이터 앞에 @Valid를 붙여주고
BindingResult를 매개변수 마지막에 넣어주도록 하자
ResponseEntity<?>로 상태 값 및 데이터 리턴
--
JPA의 save 는 리턴값이 엔티티다 (넣은 값을 바로 찾을 수 있다는 것)
다만 위 코드는 연습용으로, 보통은 저장한 값을 클라이언트에게 리턴하지 않는다
repuestProjectTask 는 유저가 입력한 값
entityProjectTask 는 데이터베이스에서 가져온 값
구분해야됨
--
포스트맨으로 요청 및 결과
콘솔창 확인
---
잘못된 형식으로보낼 경우
JPA 하이버네이트가 작동하지 않고 요청실패 객체를 리턴했다는 것을 알 수 있다