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에서 제공하는 동적 프록시는 인터페이스만 지원한다.

2. 🤔 이해가 어려운 부분

🔍 질문하기

책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      해당 개념이 헷갈리거나 명확하지 않았던 점을 구체적으로 설명합니다.
    • 궁금한 점
      해당 개념이 어떤 원리로 동작하는지, 실무에서 어떻게 활용되는지 등을 질문 형태로 정리합니다.

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

  1. 개념 또는 원칙의 이름
    • 어려웠던 부분
      .
    • 궁금한 점
      .

3. 📚 참고 사항

📢 논의하기

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

  1. 관련 자료 공유
    • 추가 자료
      관련 블로그 글이나 공식 문서 링크를 제공합니다.

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