오늘 학원에서 수업중 AOP라는 내용에 대해 공부하게 되었다.
Spring에서 CRUD게시판을 만드는데 있어서 로그인과 회원정보수정, 회원가입 등에서 비밀번호를 암호화(SHA)시켜서 데이터베이스에 저장시키는 과정이 공통적으로 들어가게 되었다.
예를 들면 아래와 같은 코드이다.
String hashPw = HashPw.getHash(user.getUserpw());
user.setUserpw(hashPw);
이런식의 공통적으로 들어가게 되는 코드를 줄이고자 AOP라는 것을 사용한다고 하였다.
자, 여기서 우선 AOP란 무엇인가? - 나도 잘모르니 같이 공부하는 셈치고 AI에게 물어보자.
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 소프트웨어 개발에서 공통 관심사(cross-cutting concerns)를 애플리케이션의 주요 비즈니스 로직으로부터 분리하여 모듈화하는 프로그래밍 패러다임입니다. 이를 통해 코드의 재사용성을 높이고, 유지보수성을 향상시키며, 애플리케이션의 모듈성을 증가시킬 수 있습니다.
AOP의 주요 개념
Aspect: 공통 관심사를 모듈화한 것으로, 예를 들어 로깅, 보안, 트랜잭션 관리 등이 있습니다. Aspect는 애플리케이션의 여러 부분에서 사용되는 공통 기능을 정의합니다.
Join Point: 애플리케이션 실행 중에 Aspect가 적용될 수 있는 지점입니다. 예를 들어, 메소드 호출이나 예외 발생 등이 있습니다.
Advice: 특정 Join Point에서 Aspect에 의해 취해지는 액션입니다. Advice는 '언제'와 '무엇을' 할 것인지를 정의합니다. 예를 들어, 메소드 실행 전에 로깅을 수행하거나, 메소드 실행 후에 트랜잭션을 커밋하는 것 등이 있습니다.Pointcut: Join Point의 부분 집합으로, Advice가 적용될 위치를 정의합니다. Pointcut을 통해 특정 메소드나 타입의 조건에 맞는 Join Point를 선택할 수 있습니다.
Target: Advice가 적용되는 대상 객체입니다.Weaving: Aspect를 대상 객체에 적용하는 과정입니다. 컴파일 타임, 로드 타임, 런타임 등 다양한 시점에서 Weaving이 이루어질 수 있습니다.
AOP의 장점
코드의 분리: 공통 관심사를 비즈니스 로직으로부터 분리함으로써, 각각의 코드가 더 단일 책임 원칙(Single Responsibility Principle)을 따르게 됩니다.
유지보수성 향상: 공통 기능을 중앙에서 관리함으로써 코드 변경 시에 해당 기능을 사용하는 모든 부분에 자동으로 반영되어 유지보수성이 향상됩니다.
재사용성 증가: 공통 관심사를 Aspect로 모듈화함으로써, 다른 애플리케이션에서도 쉽게 재사용할 수 있습니다.
응집도 강화: 비즈니스 로직과 공통 관심사가 분리되어 있어, 각각의 모듈이 더 응집력 있게 됩니다.
AOP는 스프링 프레임워크에서 주로 사용되며, 스프링 AOP는 프록시 기반의 AOP 지원을 통해 개발자가 쉽게 관점 지향 프로그래밍을 적용할 수 있게 해줍니다.
이 AOP라는 녀석을 사용하면서 전에 배웠던 Filter와는 도대체 뭐가 다른거지?
무언가 실행하기 전에 자동으로 먼저 실행시켜주는 메서드인 것임에는 차이점이 없어보이는데…
강사님께 그 자리에서 필터와는 어떻게 다른지 여쭤보았지만 작동하는 구간과 상황에 따라 조금씩 다르게 쓰인다고 간단하게 답변을 받았다. 또, 비슷한 기능을하는 녀석으로는 인터셉터라는 것이 있다는 답변을 받았다.
아마도 자세하게 설명하려면 이야기가 길어지기도하고 이해하기도 힘들것이라고 판단했으리라… 궁금한거 못참는 나는 귀가 후 즉시 찾아보고 블로그 포스팅으로 기록을 남겨두기로 한다.
AOP, Filter, Interceptor 의 공통점은?
AOP(Aspect-Oriented Programming), Filter, 그리고 Interceptor는 모두 다른 방식과 목적으로 사용되지만, 몇 가지 중요한 공통점을 가지고 있다. 이들의 주요 공통점은 다음과 같다:
- 요청 처리의 가로채기(Interception): 이 세 기술 모두 애플리케이션의 정상적인 흐름을 가로채는 기능을 제공한다. 즉, 클라이언트로부터 오는 요청이 최종 목적지(일반적으로는 메서드나 서블릿)에 도달하기 전이나, 처리가 완료된 후에 추가적인 작업을 수행할 수 있게 해준다.
- 공통 관심사(Cross-cutting Concerns)의 분리와 재사용: AOP, Filter, 그리고 Interceptor는 각각 다른 방식으로, 애플리케이션 전반에 걸쳐 반복적으로 발생하는 공통 관심사를 처리한다. 이를 통해 로깅, 인증, 보안, 트랜잭션 관리 등과 같은 기능을 중앙집중화하여 코드의 중복을 줄이고, 관리를 용이하게 한다.
- 프로그램의 모듈성 향상: 이 기술들을 사용함으로써 애플리케이션의 핵심 비즈니스 로직에서 공통 관심사를 분리할 수 있다. 이는 코드의 모듈성을 향상시키고, 유지보수를 용이하게 하며, 애플리케이션의 가독성을 높인다.
- 동적인 프로그램 행동의 추가: AOP, Filter, 그리고 Interceptor를 사용하면 컴파일 타임 또는 런타임에서 동적으로 특정 행동을 애플리케이션에 추가할 수 있다. 이를 통해 애플리케이션의 기능을 확장하거나 변경하는 것이 더욱 유연해진다.
이 공통점들을 통해 AOP, Filter, 그리고 Interceptor는 애플리케이션의 구조를 개선하고, 코드의 재사용성을 높이며, 개발 프로세스를 효율화하는 데 중요한 역할을 한다. 각각의 기술은 특정 상황과 요구사항에 맞춰 선택하여 사용될 수 있다.
각각의 특징
Filter
Filter는 서블릿 필터로, 서블릿 스펙에 정의되어 있다. 이는 클라이언트로부터 오는 요청을 서블릿이 처리하기 전이나, 서블릿이 응답을 클라이언트에게 보내기 전에 특정 작업을 수행할 수 있게 해준다. 예를 들어, 인코딩 설정, 로그인 여부 검사, 요청 데이터의 로깅 등의 작업을 할 때 사용할 수 있다. Filter는 주로 요청과 응답에 대해 전처리와 후처리를 할 때 사용된다.
Interceptor
Interceptor는 스프링의 일부로, MVC 패턴의 컨트롤러가 처리되기 전후로 추가적인 작업을 할 수 있도록 해준다. Filter와 비슷해보이지만, Spring의 컨텍스트 내부에서 동작하기 때문에 Spring 빈에 접근할 수 있고, 따라서 더 많은 기능을 사용할 수 있다. 예를 들어, 사용자 인증 체크, 로그인 사용자의 권한 확인, 로그 기록 등의 작업에 사용된다. Interceptor는 주로 Spring MVC의 컨트롤러의 실행 전후 및 완료 후에 특정 작업을 수행하는 데 사용된다.
AOP (Aspect-Oriented Programming)
AOP는 관점 지향 프로그래밍으로, 애플리케이션의 공통 관심사(cross-cutting concerns)를 모듈화하는 프로그래밍 패러다임이다. AOP는 특정 로직을 핵심 비즈니스 로직에서 분리하여 재사용할 수 있게 해준다. 예를 들어, 로깅, 트랜잭션 관리, 보안 등이 이에 해당된다. Spring에서는 AOP를 이용해 메소드 실행 전후, 예외 발생 시 등의 다양한 시점에 특정 작업을 수행할 수 있다.
차이점 및 사용 상황
Filter는 Java EE의 일부로, 웹 애플리케이션 전반에 걸쳐 요청과 응답을 가로채는 데 사용된다. 주로 보안, 로깅, 인코딩 설정 등에 사용된다.
Interceptor는 Spring 컨텍스트 내에서 동작하며, Spring MVC의 컨트롤러를 실행하기 전후의 처리를 담당한다. 인증 요구 사항이나 컨트롤러의 로깅 같은 작업에 유용하다.
AOP는 애플리케이션의 전반적인 관점에서 공통의 관심사를 처리한다. 로깅, 트랜잭션 관리, 보안 검사 등 애플리케이션의 여러 영역에 걸쳐 사용될 수 있다.
이렇게 Filter, Interceptor, AOP는 각각의 역할과 차이점을 지니고 있다.
마무리
이렇게 열심히 알아보고 정리하고 포스팅을 하면서도 정확하게 어떤 상황에서 어떤 것을 사용해야하는지 파악하지 못하고 있다..
계속적으로 직접 사용해보다 보면 언젠가 확실한 차이점과 적확한 사용상황 및 사용법을 알 수 있게 되리라 생각한다.
그렇다고 내가 힘들게 이렇게 정리한 것이 아무 소용 없었느냐? 그것도 아니라고 생각한다. 이론적인 부분을 알고 사용하는 것과 모르고 사용하는 것의 차이는 크다고 생각한다. 한번 블로그 글로써 정리를 해본 내가 사용하면서 익히는 것은 조금 더 나에게 와닿게 도움을 줄 수 있으리라.
'Framework&Tools > Spring' 카테고리의 다른 글
JPA를 활용한 성능 개선 경험 회고 (0) | 2024.07.01 |
---|---|
Spring에서 MyBatis 사용하기: 세팅부터 기본 문법까지 (0) | 2024.04.13 |