객체지향 프로그래밍은 모든 데이터를 현실에 빗대어 객체로 다루는 프로그래밍 기법
관점 지향 프로그래밍은 OOP를 더욱 발전 시키기 위한 개념이다. 하나의 소프트웨어가 거대한 OOP로써 설계, 프로그래밍 되었다면, AOP는 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.
백엔드 애플리케이션은 갖춰야 할 요구 사항이 많이 있습니다. 여기서 요구 사항이라 함은 서비스가 제공하는 핵심 기능을 해결하기 위한 사용자의 요구 사항뿐만 아니라 유효성 검사, 로깅, 보안, 트랜잭션과 같이 애플리케이션 전반에 걸쳐 제공해야 하는 공통 요소를 포함합니다. 이를 횡단 관심사(cross-cutting concern) 라고 불립니다.
소스 코드에 ccc를 따로 분리하여 구현하지 않으면 우리가 작성하는 애플리케이션의 코드는 횡단 관심사 코드와 뒤죽박죽이 되고 맙니다. 코드는 읽고 이해하기 어렵게 되고 모듈로서의 응집도가 떨어질 뿐 아니라 유지 보수가 어렵게 됩니다.
AOP(Aspect-oriented programming) 패러다임은 이런 어려움을 해결하기 위해 발전해왔고, 여러 프레임워크의 기능으로 흡수되었습니다.
nest에서는 횡단 관심사를 비지니스 로직과 쉽게 분리할 수 있습니다. 대표적인 컴포넌트로 인터셉터가 있습니다. 인터셉터는 서버로 들어오는 요청과 서버에서 나가는 응답 객체럴 가로채서 변경할 수 있습니다. 예를 들어 들어오는 요청과 서버에서 나가는 응답 객체럴 가로채서 변경할 수 있습니다.
예를 들어 들어 들어오는 요청 객체에 포함된 정보들을 이용하여 로깅 기능을 구성하거나, snake_case로 작성된 응답 객체의 키를 camelCase로 바꿀 수 있습니다. 또 예외 필터를 이용하여 어느 코드에서든 발생하는 에러를 잡아서 일관적인 예외 처리 로직으로 동작 할 수 있습니다.
결국 AOP의 핵심은 공통 모듈을 분리시켜 해당 소스코드가 외부의 다른 클래스에서 존재하는 것이다.