Server/Spring Boot

spring boot // validation을 AOP로 사용하기

Jaybon 2020. 8. 11. 16:29

 

springboot 21강 - ResponseEntity와 @Valid와 @BindResult 사용하기

https://blog.naver.com/getinthere/221795214908

 

springboot 21강 - ResponseEntity와 @Valid와 @BindResult 사용하기

간단한 테스트를 위해 아래와 같은 의존성 사용모든 Controller는 결과값을 return한다. 이 때 Get 요청...

blog.naver.com

--

 

참고 리파지토리

https://github.com/codingspecialist/Springboot-Jpa-AOP-Valid-RestDoc

 

codingspecialist/Springboot-Jpa-AOP-Valid-RestDoc

Contribute to codingspecialist/Springboot-Jpa-AOP-Valid-RestDoc development by creating an account on GitHub.

github.com

 

현재 프로젝트 (아래 코드 설명과 같이 보려면 이곳을 확인)

https://github.com/jaybon1/springwork/tree/master/validEx01

 

jaybon1/springwork

Contribute to jaybon1/springwork development by creating an account on GitHub.

github.com

 

 

프로젝트 생성

 

 

밸리데이션 추가(위에서 추가해도되고 따로 이렇게 추가해도됨)

		<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 하이버네이트가 작동하지 않고 요청실패 객체를 리턴했다는 것을 알 수 있다