AOP ( Aspect Oriented Programming)
관점지향 프로그램
스프링 어플리케이션은 대부분 특별한 경우를 제외 하고는 MVC 웹 어플리케이션에서는 Web Layer, Business Layer, Data Layer로 정의한다.
- Web Layer : REST API를 제공하며, Client 중심의 로직 적용
- Business Layer : 내부 정책에 따른 logic를 개발하며, 주로 해당 부분을 개발
- Data Layer : 데이터 베이스 및 외부와의 연동을 처리
주요 Annotation
Annotation |
의미 |
@Aspect | 자바에서 널리 사용하는 AOP프레임워크에 포함되며, AOP를 정의하는 Class에 할당 |
@Pointcut | 기능을 어디에 적용시킬지, 메소드? Annotation? 등 AOP를 적용 시킬 지점을 설정 |
@Before | 메소드 실행하기 이전 |
@After | 메소드가 성공적으로 실행 후, 예외가 발생 되더라도 실행 |
@AfterReturing | 메소드 호출 성공 실행 시 (Not Throws) |
@AfterThrowing | 메소드 호출 실패 예외 발생 (Throws) |
@Around | Before / after 모두 제어 |
이어서 AOP의 실무 사례에 대해 실습을 진행해보겠다. 지금까지 해왔던 GET방식과 POST방식을 먼저 작성한 후
AOP에 대해서 실습을 해볼 예정이다. 우선 AOP를 사용하기 위해 인텔리제이에 build.gradle파일에 들어간 후
implementation 'org.springframework.boot:spring-boot-starter-aop'
dependencies { }안에 추가를 하고 새로고침을 한번 실행해 주면 AOP를 사용할 수 있는 준비가 된것이다.
우선 controller 패키지를 생성한 후 RestApiController.java파일을 생성하고 코드를 작성해준다.
RestApiController.java
package com.example.aop.controller;
import com.example.aop.dto.User;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class RestApiController {
@GetMapping("/get/{id}")
public void get(@PathVariable Long id, @RequestParam String name) {
System.out.println("get method");
System.out.println("get method : " + id);
System.out.println("get method : " + name);
}
@PostMapping("/post")
public void post(@RequestBody User user) {
System.out.println("post method : " + user);
}
}
이어서 dto 패키지를 생성해 주고 User.java파일을 생성해 코드를 다음과 같이 작성해준다.
User.java
package com.example.aop.dto;
public class User {
private String id;
private String pw;
private String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", pw='" + pw + '\'' +
", email='" + email + '\'' +
'}';
}
}
이어서 코드 테스트 프로그램인 Talend API Tester 확장 프로그램을 열고 GET방식 데이터 전송 결과를 확인하겠다.


다음은 POST방식의 데이터 전송 결과이다.


이러한 방식으로 원하는 데이터를 출력할 수 있지만 실제로 API가 한두개가 아닌 여러개이고 많으면 20개도 되는데
그럴 때 20개 전부 log를 찍기 힘들것이므로 각 메소드마다 log를 찍는 부분을 한곳으로 모을 수 있다.
지금부터 AOP 실습을 진행해보겠다.
우선 aop패키지를 생성한 후 ParameterAop.java파일을 생성해 준다. 그리고 다음과 같이 코드를 작성해 준다.
ParameterAop.java
package com.example.aop.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class ParameterAop {
@Pointcut("execution(* com.example.aop.controller..*.*(..))")
private void cut() {}
@Before("cut()")
public void before(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
for(Object obj : args) {
System.out.println("type : " + obj.getClass().getSimpleName());
System.out.println("value : " + obj);
}
}
@AfterReturning(value = "cut()", returning = "returnObj")
public void afterReturn(JoinPoint joinPoint, Object returnObj) {
System.out.println("return obj");
System.out.println(returnObj);
}
}
이어서 RestApiController.java파일의 코드를 다음과 같이 변경해 준다.
RestApiController.java
package com.example.aop.controller;
import com.example.aop.dto.User;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class RestApiController {
@GetMapping("/get/{id}")
public String get(@PathVariable Long id, @RequestParam String name) {
System.out.println("get method");
System.out.println("get method : " + id);
System.out.println("get method : " + name);
return id + " " + name;
}
@PostMapping("/post")
public User post(@RequestBody User user) {
System.out.println("post method : " + user);
return user;
}
}


그러면 다음과 같이 데이터를 에코 형태로 출력되는걸 볼 수 있고 다음은 GET 방식의 결과를 출력해보겠다.
코드는 위의 코드들과 동일하고 결과만 출력해보겠다.


이상으로 AOP실무 사례에 대해 살짝 알아봤는데 다음시간에도 이어서 AOP의 실무 사례에 대해 마저 알아보겠다.
그럼 다음시간에 AOP실무 사례 두번째 사례로 돌아오겠다.

'Spring Boot > AOP' 카테고리의 다른 글
SpringBoot - AOP (2) (0) | 2023.05.01 |
---|