스프링은 DI, AOP이 핵심이다.
이중 AOP 관점지향프로그래밍이란 무엇일까?
보통 프로그래밍을 할 때 흐름은 기능의 처리 순서이다.
HTTP 요청을 서블릿이 받아 url 리퀘스트 매핑을 통해 적절한 컨트롤러로 연결해주면
컨트롤러에서 비지니스로직을 호출하고 결과를 반환해 화면으로 돌려준다.
그런데 때때로 이 처리 순서의 흐름이 아니라 어떤 특정 시점에서 공통된 처리를 해주고 싶을 때가 있다.
나 같은 경우 로그나 시간을 측정할 때 사용해봤다.
포인트컷을 지정하면 실행 전후의 로그를 남길 수 있는데
여기서 시작시간과 처리종료시간을 계산하면 처리시간을 구할 수 있다.
각 처리에 하나하나 로그와 시간을 계산하지 않아도 된다.
우리에겐 스프링 AOP가 있으니까
스프링 AOP는 스프링 빈을 등록할 때 프록시를 등록해준다.
포인트 컷으로 AOP대상을 지정해준 AOP클래스를 만들면
대상 빈을 등록할 때 Aspect로 정의해놓은 프록시를 등록해준다.
핵심기능이라는 알맹이에 부가기능을 위한 껍데기를 씌워주는 것이다.
이처럼 AOP는 각 순서가 있는 기능이 수직으로 흐를 때 어떤 부분에서 일괄적으로 처리할 수 있다
각 핵심로직을 변경하지 않고도
@Aspect를 정의하는 것만으로 특정 대상의 특정시점의 원하는 기능을 넣을 수 있으니
편리한 기능이다.
대표적으로 스프링의 트랜젝션이 있다.
이 트랜젝션은 보통 서비스에 달아두는데
비지니스 처리도중 예외가 발생하거나 처리가 불필요할 시
여러개의 테이블의 변경이 일어나도 해당 트랜젝션에 있는 모든 테이블 변경을 롤백해준다.
이 트랜젝션에 대한 내용은 애노테이션으로 달아두기만해도
스프링이 정해둔 롤백 커밋등에 대한 트랜젝션 Aspect가 이미 정의되어 있기에
개발자가 해당 내용을 신경쓰지 않아도 알아서 처리한다.
이처럼 어떤 단계에서 중복된 처리를 적용하고 싶을 때 그 때 AOP를 쓴다.
'프로그래밍 > java' 카테고리의 다른 글
[spring] 스프링부트의 로그 시스템 (0) | 2023.05.02 |
---|---|
[스프링] 스프링 빈으로 등록된 컴포넌트의 동시성문제 (쓰레드로컬) (0) | 2023.04.27 |
[spring AOP] 어드바이스의 종류 (0) | 2023.01.31 |
[spring] spring AOP (0) | 2023.01.19 |
[spring] spring data rest (0) | 2022.10.25 |