클린코드 chap 11. 관심사 분리 패턴들

최준영·2021년 10월 8일
0

클린한 코드

목록 보기
12/16

1. 관심사 분리


  • contruction(생성)과 use(사용)은 아주 다르다.
  • 소프트웨어 시스템은 (어플리케이션 객체를 제작하고 의존성을 서로 '연결'하는) 준비 과정과 (준비 과정 이후에 이어지는) 런타임 로직을 분리해야 한다.
  • 객체의 생성과 객체를 사용하는 부분을 분리한다.

1) 시작에 대한 관심사 분리

  • 객체의 생성은 시작 단계에서, 비즈니스 로직은 객체를 사용하는데 집중한다.
  • 시작 단계는 모든 어플리케이션이 풀어야할 관심사이다.
  • main 함수에서 시스템에 필요한 객체를 생성한 후 어플리케이션에 넘긴다.
  • 어플리케이션은 그저 만들어진 객체를 사용한다.
  • 모든 객체가 잘 생성되었다고 가정하고, 객체를 이용한 개발에 집중할 수 있다.

2) 요청에 대한 관심사 분리

  • Spring 프레임워크를 통해 요청에 대한 관심사를 분리해 요청 처리에 대한 비즈니스 로직에 집중할 수 있다.

    Filter, Intercepter, AOP
  • 서블릿 필터는 Dispatcher Servlet 이전에 실행이 되는데, 요청 내용을 변경하거나 요청을 처리하기 전에 작업을 수행할 수 있다.
  • Filter와 Interceptor는 Servlet 단위에서 실행된다. 반면 AOP 는 메소드 앞에서 Proxy 패턴으로 실행된다.
  • 인터셉터는 여러 개를 사용할 수 있고 로그인 처리, 권한 체크, 프로그램 실행시간 계산작업, 로그 확인 등의 업무 처리에 활용된다.
  • AOP는 메서드 앞에서 Proxy 패턴으로 실행된다. 주로 '로깅', '트랜잭션', '에러처리' 등 비즈니스 단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다. AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

2. Dependency Injection(의존성 주입)


  • 객체 의존성을 DI 컨테이너에 맡긴다.
  • Setter 메소드 or 생성자 인수를 통해 의존성을 주입한다.
  • DI 컨테이너는 요청이 들어올 때 필요한 객체의 인스턴스를 만든 후 의존성을 설정한다.
  • 예 : Spring IOC Container

Sprint IOC Container

  • 객체 의존성을 DI 컨테이너에 맡긴다.
  • DI 컨테이너가 객체를 알아서 wiring 해준다.

3. Cross Cutting Concerns(횡단 관심 분리)


  • 어플리케이션 전반에서 가지는 공통적인 관심사를 분리한다.
  • 비즈니스 로직(핵심 관심사) 외에 Logging, Transaction 관리, Security 등 신경써야 할 관심사들이 많다.
  • 관심사들은 많은 어플리케이션 레이어에 퍼져있는데, 이 관심사들을 분리해 처리하는 것이 효율적이다.
    • 비즈니스 로직(핵심 관심사)에 집중할 수 있게 된다.

예제 1. before

public Response executeBusinessLogic(Request request) {
  // 공통 기능
  checkAuth(request);
  
  // 비즈니스 로직
  Response response = businesslogic(userName, message);
  
  // 공통 기능
  logging(response);
}

예제 2. after

public Response executeBusinessLogic(Request request) {
  // 비즈니스 로직
  Response response = businesslogic(userName, message);
}

// 공통 기능은 별도의 코드에서 관리한다.

해결 방법

  1. 자바 프록시
    • 단순한 상황에 적합하다.
    • 개별 객체나 클래스에서 메서드 호출을 감싸는 경우가 좋은 예다.
  2. 순수 자바 AOP 프레임워크
    • 대부분의 프록시 코드는 판박이라 도구로 자동화할 수 있다.
    • 순수 자바 관점을 구현하는 스프링 AOP, JBoss AOP 프레임 워크는 내부적으로 프록시를 사용한다.
    • 설정 파일이나 API를 사용해 객체의 역할을 설정한다.
    • 객체를 얻어올 때는 (XML 파일에 설정했던 DI 컨테이너에게 객체를 요청(getBean)한다.
  3. EJB3 - JPA같은 객체 영속성 관리 표준 API
    • 모든 정보가 annotation 속에 있어서 코드 자체가 깔끔하고 가독성이 좋다.
    • annotation에 있는 영속성 정보 전부 또는 일부를 XML 설정으로 옮겨도 된다.(실무에서는 annotation 사용을 선호)
profile
do for me

0개의 댓글