#3_객체 지향 프로그래밍(OOP),관점 지향 프로그래밍(AOP)

유상우·2023년 4월 8일
0

Nest.js

목록 보기
4/6

1. 객체 지향 프로그래밍

객체지향 프로그래밍은 모든 데이터를 현실에 빗대어 객체로 다루는 프로그래밍 기법

객체 지향 프로그래밍 특징

1. 캡슐화(encapsulation) - 데이터와 함수를 하나로 묶는다.

  • 데이터의 세부 내용이 객체 은닉된다. 즉, 데이터 변경으로 인한 에러가 줄어들고, 객체들간에 데이터를 자세히 알 필요가 없으므로 코드가 단순해진다.

2. 정보 은닉(information hiding) - private로 선언한 데이터는 자기 자신을 통해서만(setter,getter) 접근 가능하다.

  • 각 객체간의 수정이 다른 객체에 미치는 영향을 최소화 한다.
  • 외부 객체의 직접 접근을 막아 프로젝트 확장 시 오류를 최소화 한다.

3. 추상화(abstraction) - 불필요한 부분은 생략하고 중요한 것에만 초점을 맞춰 모델로 만든다.

  • 복잡한 모델을 중요한 것만 추려 추상화 함으로써 시스템 구조를 시각적으로 표현할 수 있다.
  • 완전한 시스템이 구축되지 않더라도 개략적으로 모델을 만들어 테스트 하고 살을 붙여 나갈 수 있다.

4. 상속성(ingeritance) - 부모클래스에 정의된 모든 것을 자식 클래스가 물려 받는다.

  • 재정의 할 필요가 없어 코드 작성이 간결해진다.
  • 상속으로 인한 최소한의 규칙을 통해 프로젝트의 확장 시 오류를 최소화 한다.
  • 자식 클래스에서 새로운 함수를 추가하거나 부모 클래스의 함수를 재정의 해 사용할 수 있다.
  • 클래스의 재사용이 쉽다.

5. 다형성(polymorphism) - 호출하는 객체에 따라 다른 동작을 한다.

  • 하나의 클래스에서 같은 이름의 함수를 어러개 가질 수 있다.(overriding) 호출하는 객체가 어떤 input parameter를 사용해 호출하냐에 따라 각자 다른 함수가 호출되게 한다. 즉, 비슷한 기능을 하는 함수를 만들 때 불필요하게 너무 많은 함수명을 만들어 가독성이 떨어지는 문제를 해결 할 수 있다.

2. 관점 지향 프로그래밍

관점 지향 프로그래밍은 OOP를 더욱 발전 시키기 위한 개념이다. 하나의 소프트웨어가 거대한 OOP로써 설계, 프로그래밍 되었다면, AOP는 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

백엔드 애플리케이션은 갖춰야 할 요구 사항이 많이 있습니다. 여기서 요구 사항이라 함은 서비스가 제공하는 핵심 기능을 해결하기 위한 사용자의 요구 사항뿐만 아니라 유효성 검사, 로깅, 보안, 트랜잭션과 같이 애플리케이션 전반에 걸쳐 제공해야 하는 공통 요소를 포함합니다. 이를 횡단 관심사(cross-cutting concern) 라고 불립니다.

소스 코드에 ccc를 따로 분리하여 구현하지 않으면 우리가 작성하는 애플리케이션의 코드는 횡단 관심사 코드와 뒤죽박죽이 되고 맙니다. 코드는 읽고 이해하기 어렵게 되고 모듈로서의 응집도가 떨어질 뿐 아니라 유지 보수가 어렵게 됩니다.

AOP(Aspect-oriented programming) 패러다임은 이런 어려움을 해결하기 위해 발전해왔고, 여러 프레임워크의 기능으로 흡수되었습니다.

nest에서는 횡단 관심사를 비지니스 로직과 쉽게 분리할 수 있습니다. 대표적인 컴포넌트로 인터셉터가 있습니다. 인터셉터는 서버로 들어오는 요청과 서버에서 나가는 응답 객체럴 가로채서 변경할 수 있습니다. 예를 들어 들어오는 요청과 서버에서 나가는 응답 객체럴 가로채서 변경할 수 있습니다.

예를 들어 들어 들어오는 요청 객체에 포함된 정보들을 이용하여 로깅 기능을 구성하거나, snake_case로 작성된 응답 객체의 키를 camelCase로 바꿀 수 있습니다. 또 예외 필터를 이용하여 어느 코드에서든 발생하는 에러를 잡아서 일관적인 예외 처리 로직으로 동작 할 수 있습니다.

핵심 관심(core concern)

  • 각 서비스의 핵심 비지니스 로직 ex) 계좌이체, 입출금, 이자계산

횡단 관심(crosscut concern)

  • 공통 모듈 ex) 로깅, 보안, 트랜잭션

결국 AOP의 핵심은 공통 모듈을 분리시켜 해당 소스코드가 외부의 다른 클래스에서 존재하는 것이다.

profile
Potentialist

0개의 댓글