Skip to main content

김주엽

1. 📌 핵심 개념 정리

✅ 요약하기

  1. 시스템 제작과 시스템 사용을 분리하라

    • 모든 애플리케이션에서 풀어야 할 관심사는 초기화 단계이다.

    • 대다수의 애플리케이션이 초기화 과정 코드를 주먹구구식으로 구현하고 런타임 로직과 마구 뒤섞는다.

    • 예시

      public Service getService(){
        if (service == null)
          service = new MyServiceImpl(...); // 모든 상황에 적합한 기본값일까?
         return service;
      }
      
      • 위의 기법은 Lazy Initializaion 또는 Lazy Evaluation이라는 기법이다.
        • 장점
          1. 객체가 필요한 경우에 객체를 생성하기에 불필요한 부하가 걸리지 않는다.
          2. 또한 어떤 경우에도 null을 반환하지 않는다.
        • 문제점
          1. 메서드가 MyServiceImpl 및 생성자 인수에 의존한다.
          2. 객체를 생성하는 로직과 동작하는 로직이 함께 있어 SRP 원칙에 위배된다.
          3. MyServiceImpl이 어떤 객체인지 알 수 없다.
    • Main 분리

      • main함수에서 시스템에 필요한 객체를 생성한 후 애플리케이션으로 전달한다,
      • 이 과정에서 애플리케이션은 main에서 객체가 생성되는 과정을 알 수 없다.
    • 팩토리

      • 객체가 생성되는 시점을 애플리케이션이 결정하는 경우에는 추상 팩토리 패턴을 사용하라.
      • 이 경우에도 애플리케이션에서는 객체가 생성되는 과정을 알 수 없다.
    • 의존성 주입(DI, Dependency Injection)

      • 객체 생성 및 관리에 대한 책임을 DI 컨테이너가 가지며 필요한 객체를 직접 생성하거나 외부에서 주입받는 방식을 말한다.
      • 의존성 주입은 제어의 역전(IoC, Inversion of Control) 기법을 의존성 관리에 적용한 메커니즘이다.
        • 제어의 역전에서는 한 객체가 맡은 보조 책임을 새로운 객체에게 전적으로 넘긴다.
        • 새로운 객체는 넘겨받은 책임만 동작하기에 SRP 원칙을 지키게 된다.
      • 대다수의 DI 컨테이너는 객체가 필요한 순간에 생성할 수 있도록
        Lazy Initializaion 기법을 이용해 팩토리를 호출하거나 프록시를 생성하는 방법을 제공한다.

  1. 확장

    • 처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다.
    • TDD리팩터링으로 얻어지는 깨끗한 코드는 코드 수준에서 시스템을 조정하고 학장하기 쉽게 만든다.

  1. 횡단(cross-cutting) 관심사

    • 하나의 기능 혹은 모듈을 관심사라고 말한다.
    • 현실적으로 영속성 방식을 구현한 코드는 온갖 객체로 흩어진다.
    • 이를 처리하기 위해 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)이 나오게 됐다.
    • AOP에서 관점(aspect) 이라는 모듈 구성 개념은 여러 곳에서 반복되는 기능(로그, 보안 검사 등)을 한 곳에 모아 일관되게 적용한다.
    • AOP에서 명시는 특별한 문법을 사용하여 간단하게 기능을 적용할 수 있어야 한다.

  1. 자바 프록시

    • 자바 프록시는 개별 객체나 클래스에서 메서드 호출을 감싸는 경우 등 단순한 상황에 적합하다.
    • 하지만 JDK에서 제공하는 동적 프록시는 인터페이스만 지원한다.
      클래스 프록시를 사용하려면 별도의 바이트 코드 처리 라이브러리가 필요하다.
    • 코드 양이 많고 크기가 무거운 단점이 존재하기에 깨끗한 코드를 작성하기 어렵다.

  1. 순수 자바 AOP 프레임워크

    • 자바 관점을 구현하는 스프링 AOP, JBosss AOP 등 여러 프레임워크가 내부적으로 프록시를 사용한다.
    • POJO를 이용해서 구현한 프레임워크는 다른 도메인에 의존하지 않아 테스트가 개념적으로 더 쉽고 간단하다.
    • 프로그래머는 설정 파일이나 API를 사용해 애플리케이션 기반 구조를 구현하고 AOP 프레임워크나 라이브러리를 사용해 관점을 명시한다.
    • 프레임워크는 사용자가 모르게 프록시나 바이트코드 라이브러리를 사용해 이를 구현한다.

  1. AspectJ 관점

    • 관심사를 관점으로 분리하는 가장 강력한 도구는 AspectJ 언어다.
    • 스프링 AOP, JBoss AOP가 제공하는 POJO 방식은 관점이 필요한 상황 중 80~90% 에 충분하다.
    • AspectJ는 관점을 분리하고 강력한 풍부한 도구 집합을 제공하지만 새 도구 사용, 새 언어 문법과 사용법을 익혀야 하는 단점이 존재한다.

  1. 의사 결정을 최적화하라
  • 모듈을 나누고 관심사를 분리하면 각 부분을 독립적으로 테스트하고 관리하기 쉬워진다.
  • 관심사를 모듈로 분리한 POJO 시스템은 기민함을 제공해 최선의 시점에 최적의 결정을 내리기 쉬워지고 결정의 복잡성도 줄어든다.

  1. 시스템은 도메인 특화 언어가 필요하다
  • DSL(Domain-Specific Language)가 최근 들어 새롭게 조명받기 시작했다.
  • DSL은 간단한 스크립트 언어나 표준 언어로 구현한 API를 말한다.
  • 좋은 DSL은 도메인 개념과 그 개념을 구현한 코드 사이에 존재하는 의사소통 간극을 줄여준다.
  • DSL로 도메인 논리를 구현하면 도메인을 잘못 구현할 가능성이 줄어든다.

2. 🤔 이해가 어려운 부분

🔍 질문하기

  1. 순수 자바 AOP 프레임워크
    • 어려웠던 부분
      "Bank 도메인 객체는 자료 접근자 객체 DAO로 프록시되었으며 자료 접근자 객체는 JDBC 드라이버 자료 소스로 프록시되었다." 이 문장을 이해하기 어려웠다.
    • 이해한 점
      • Bank 객체는 DAO 객체를 통해서만 데이터에 접근한다.
        Bank 객체가 DAO 객체로 프록시됐다.
      • DAO 객체는 JDBC 드라이버를 통해서만 DB에 접근한다.
        DAO 객체는 JDBC 드라이버가 프록시 역할을 수행해 DB에 접근한다.

3. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 관련 자료 공유

  1. 논의하고 싶은 주제
    • 주제
      논의하고 싶은 내용을 간략히 정리합니다.
    • 설명
      논의하고 싶은 이유를 작성합니다.