티스토리 뷰

SpringBoot

AOP 실무 사례 알아보기

nswon 2022. 7. 9. 16:08

1. 프로젝트 생성

먼저 프로젝트를 생성해보자. 해당 사이트 으로 들어가서 아래와 같이 작성해주자.

 

그리고 intellij로 프로젝트를 실행하고 build.gradle파일을 찾아 dependencies에 아래코드를 복사해 붙여준다.

implementation 'org.springframework.boot:spring-boot-starter-aop'

 

그럼 준비는 다 끝났다.

 

2. AOP 적용할 예제 작성

controller 패키지를 만들어주고 RestApiController 클래스를 생성하고 아래 코드를 작성하자.

아래코드는 간단한 get, post 매핑을 하여 로그가 찍히는지 확인하는 로직이다.

 

 

User에 빨간줄이 뜨는 것을 알 수 있다. 그럼 User 객체를 만들어보자.

dto라는 클래스를 만들고, User 클래스를 생성한다.

 

 

이제 Postman으로 로그가 잘 찍히는지 확인할 차례다.

 

3. 로그 확인

먼저 프로젝트를 실행한 후 Postman에 켜 아래 url을 작성해주자. 

http://localhost:8080/api/get/100?name=namseng

 

100은 우리가 PathVariable로 파라미터를 변수로 받은 id값이고, name=namseng은 파라미터 값이다.

그리고 Send를 누르면 사진 밑 쪽에 200OK와 로그가 잘 찍히는 것을 볼 수 있다.

 

200OK
아까 작성한 로그

 

이번에는 포스트매핑으로 로그가 잘 찍히는 지 확인해보자.

url을 아래코드를 복사해 넣어주자.

localhost:8080/api/post

 

그리고 밑에 Body -> raw -> TEXT를 JSON으로 바꿔준 뒤 아래와 같이 작성한다.

{
    "id" : 1,
    "pw" : "namseng",
    "email" : "test@gmail.com"
}

 

전체 사진으로 보면 이러하다. GET을 POST로 바꿔주는 거 잊지 말자.

 

 

그리고 Send를 누르면 마찬가지로 200OK 가 잘 뜨고 로그도 잘 남겨진 것을 볼 수 있다.

 

200OK
로그

4. 위 작업의 문제점

지금 위 과정을 보면 메소드마다 로그작업을 하였다. 하지만 만약 메소드가 2개가 아니라면 ? 20개라면 ?

20개 마다 일일히 작성하기에는 귀찮을 것이다. 이렇게 반복적인 부분(로그 남김)을 횡단 관심이고, 반복적인 부분을 한곳에 모아놓은 것이 AOP라고 보면 된다. 그럼 로그를 남기고 싶을 때마다 쉽게 작성해 귀찮은 작업을 줄일 수 있다.

 

5. AOP를 활용한 문제점 해결

그럼 AOP를 만들어보자.

aop 패키지를 만들고 ParameterAop 이름의 클래스를 생성하자.

aop

그럼 controller 메서드의 리턴 값이 있어야 하니까 바꿔주자.

 

 

전체적인 흐름은 다음과 같다.

controller 하위에 있는 메서드를 찾기 전에 before가 실행되고, controller 메서드가 정상적인 리턴까지 완료했다면 리턴값을 afterReturn의 returnObj에서 확인이 가능하다.

 

정리하자면 

1. controller 메서드인 get(), post()가 실행하기 전에 before 메서드가 실행됨

2. controller get(), post() 메서드가 정상적으로 리턴함

3. 리턴한 값이 afterReturn에 returnObj에 들어가서 실행함

 

그럼 한번 돌려보자.

postman에 다시 Send를 하게 되면 post메서드에서 user을 반환했기 때문에 요청한 JSON값이 그대로 리턴되어있고,

로그도 잘 찍힌다.

 

postman
로그

5. AOP의 흐름

한번 로그의 흐름을 알아보자.

 

1. type : 과 value : 는 controller에 get() 을 실행하기 전에 aop 의 before가 먼저 실행되면서 출력한다.

2. post method : 는 aop의 before가 실행되고 controller의 post() 가 실행되면서 출력한다.

3. return obj 는 controller의 post() 가 정상적으로 user를 리턴을 했기 때문에 aop의 afterReturn이 실행하면서 출력한 것이다.

4. User(...)은 리턴한 값을 Object에 담아서 출력했다.

 

이 예제는 HTTP method를 통해서 어떤 값이 출력되었고 리턴값은 뭔지 출력하는 aop 활용 예제였다.

AOP는 컨트롤러나 서비스 같은 곳에서 어떤 값이 들어갔고, 어떤 값이 리턴했는지 메서드마다 하나하나 작성을 해주지 않아도 반복적인 작업을 한 곳에 모아놓고 사용할 수 있다. 거대한 프로젝트를 만들 때 굉장히 편리할 것 같다. 

 

전체코드 링크 : https://github.com/nswon/study-online-lecture

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday