OOP(Object Oriented Progamming)
객체지향 프로그래밍은 애플리케이션을 설계할 때 책임과 관심사에 따라 클래스를 분리한다. 클래스가 단일 책임을 가지도록 분리함으로써 각 모듈의 응집도는 높아지고 결합도는 낮아진다. 클래스를 변경하는 이유는 오직 한 가지이며, 애플리케이션의 한 부분에서 변경이 발생했을 때 그 파급효과가 시스템의 전체로 퍼져나가는 정도가 낮아진다.
이것이 OOP의 단점이다.
객체지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(Object)를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)를 통해 모델링하려는 프로그래밍 패러다임을 말한다. 다시 말해, 우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
객체지향 프로그래밍은 함수들의 집합 혹은 단순한 컴퓨터의 명령어들의 목록이라는 전통적인 절차지향 프로그래밍과는 다른, 관계성 있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인으로 볼 수 있다.
각 객체는 메시지를 받을 수도 있고, 데이터를 처리할 수도 있으며, 또다른 객체에게 메시지를 전달할 수도 있다. 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계 또는 부품으로 볼 수 있다.
객체지향 프로그래밍은 보다 유연하고 유지보수하기 쉬우며 확장성 측면에 서서도 유리한 프로그래밍을 하도록 의도되었고, 대규모 소프트웨어 개발에 널리 사용되고 있다.
AOP(Aspect-Oriented Progeamming)
관점 지향 프로그래밍이란 OOP로 독립적으로 분리하기 어려운 부가 기능을 모듈화 하는 방식이다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것이다 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다.
위와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지 이다.
AOP의 주요 개념
- Aspect: 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화 함.
- Target: Aspect를 적용하는 곳(클래스, 메서드...)
- Advice: 실질적으로 어떤 일을 해야 할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- Joint Point: Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
- Point Cut: JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있다.
- Proxy: 클라이언트와 타깃 사이에 투명하게 존재하며 부가기능을 제공하는 오브젝트. DI를 통해 타겟 대신 클라이언트에게 주입되며 클라이언트의 메서드 호출을 대신 받아서 타깃에 위임하며 이 과정에서 부가기능을 부여한다.
AOP의 특징
- 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서이다.
- 스프링 빈에서만 AOP 적용 가능
- 모든 AOP 기능을 제공하는 것이 아닌 스프링IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복 코드, 객체들 간 관계 복잡도 증가...)에 대한 해결책을 지원하는 것이 목적이다.
메서드
- @Around(메서드 실행 전후): 어드바이스가 타겟 메서드를 감싸서 타겟 메서드 호출전과 후에 어드바이스 기능을 수행
- @Before(이전): 어드바이스 타겟 메서드가 호출 되기 전에 어드바이스 기능을 수행
- @After(이후): 타겟 메서드의 결과에 관계없이 (즉 성공, 예외 관계없이) 타겟 메서드가 완료 되면 어드바이스 기능을 수행
- @AfterReturning(정상적 반환 이후): 타겟 메서드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
- @AfterThrowing(예외 발생 이후): 타겟 메서드가 수행 중 예외를 던지게 되면 어드바이스 기능을 수행
결국 AOP는 Aspect를 분리하여 핵심기능을 설계 및 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것이다.
'Spring' 카테고리의 다른 글
TDD 란? (0) | 2023.02.23 |
---|---|
[Spring] ORM 과 JPA (0) | 2023.01.02 |
동기와 비동기 방식 (0) | 2022.11.28 |
Ajax (0) | 2022.11.28 |
[Spring] 스프링에서 자주 사용하는 Annotation (0) | 2022.11.24 |