Skip to main content

김시용

1. 📌 핵심 개념 정리

✅ 요약하기

각자 해당 챕터에서 중요하다고 느낀 개념이나 아이디어를 간략하게 정리하고 개선 전, 후에 대한 예시 코드를 비교하며 개념을 설명합니다.

  1. 시스템 제작과 사용을 분리하라
    관심사 분리 : 준비 과정 (객체 제작 및 의존성 연결) <-> 런타임 로직 분리하기
    • 관심사 분리 안된 예시 : 초기화 지연 / 계산 지연

      public Service getService() {
        if (service == null)
          service = new MyServiceImpl(..);
        retrun service;
      }
      

      장점: 필요할 때만 객체를 생성하므로 부하↓ / null 포인트 반환X
      단점:
      의존성 문제 (MyServiceImpl 객체 사용하지 않더라도 의조선 해결해야함)
      테스트 문제 (런탐임 로직에 객체 생성 로직을 섞어 놓아서 모든 실행 경로도 테스트 해야함 -> SRP도 깬다는 말이다.)

    • 관심사 분리 : Main 분리
      main 함수에서 시스템에 필요한 객체 모두 생성 -> 애플리케이션에 넘김
      애플리케이션은 객체를 사용할 뿐 (객체 생성 시점, 과정 모름)

    • 관심사 분리 : 팩토리
      객체가 생성되는 시점을 애플리케이션이 결정해야할 때 사용
      애플리케이션은 여기서도 객체 생성 과정 모름

    • 관심사 분리 : 의존선 주입 객체가 의존하는 객체를 직접 생성하지 않고 외부로부터 제공받는 설계 패턴
      객체 간 결합도 낮추고, 코드의 재사용성과 테스트 용이성을 높여줌
      스프링에서는 DI 컨테이너가 의존성을 관리해줌


  1. 확장
    처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다.
    현재 주어진 상황에 맞게 시스템을 구현해야 한다. (TDD, 리팩터링 활용하기)
    • 횡단 관심사: 시스템 전반에 걸쳐 공통적으로 적용되어야하는 기능 (핵심 비즈니스 로직과 분리되는 공통적인 기능)

  1. 자바 프록시
    프록시란 어떤 대상(객체)를 대신하여 요청을 처리하는 대리 객체를 의미한다.
    즉, 원래 객체의 기능을 확정하거나 변경하기 위해 중간에서 요청을 가로채는 역할을 한다.
    • 단점 : 코드의 양과 크기가 늘어나 깨끗한 코드 작성이 어려움 / 시스템 단위로 실행지점 명시도 어려움

  1. 순수 자바 AOP 프레임워크 프록시를 활용하여 실행되는 메서드 앞뒤에 부가 기능 적용
    -> 어노테이션 활용해 영속성 정보 부여 (필요시, XML 배치로 옮겨도 됨)
    • AspectJ 관점: 관심사를 관점으로 분리하는 가장 강력한 도구 (AOP 적용 도구)

  1. 결론 모든 추상화 단계에서 의도는 명확히 하기 위해 -> POJO를 작성하고 관점 혹은 관점과 유사한 메커니즘을 사용해 각 구현 관심사를 분리해야 함

2. 🤔 이해가 어려운 부분

🔍 질문하기

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

  1. POJO (Plain Old Java Object)
    • 어려웠던 부분
      POJO를 처음 보는거라 개념 자체가 이해가 안 갔음
    • 궁금한 점
      POJO는 특정 프레임워크나 라이브러리에 의존하지 않는 순수한 자바 객체 (특별한 규칙, 상속 없이 자유롭게 설계된 객체)

  1. 의존성 주입
    • 어려웠던 부분
      제어의 역전이 이해가 안감

    • 궁금한 점
      제어의 역전이란? 객체가 스스로 의존성을 생성하고 관리 -> 객체의 생성 및 의존성 관리를 외부에 맡김

      • 의존성 주입 (제어의 역전X)
        class ServiceA {
         public void doSomething() {
             System.out.println("ServiceA 동작");
         }
       }
      
       class Client {
           private ServiceA serviceA;
      
           public Client() {
               this.serviceA = new ServiceA(); // 직접 객체 생성 (강한 결합)
           }
      
           public void execute() {
               serviceA.doSomething();
           }
       }
      
       public class Main {
           public static void main(String[] args) {
               Client client = new Client();
               client.execute();
           }
       }
      
      • 의존성 주입 (제어의 역전O)
      class ServiceA {
           public void doSomething() {
               System.out.println("ServiceA 동작");
           }
       }
      
       // IoC 적용: 의존성 주입을 위한 생성자 사용
       class Client {
           private final ServiceA serviceA;
      
           public Client(ServiceA serviceA) {  // 외부에서 의존성 주입
               this.serviceA = serviceA;
           }
      
           public void execute() {
               serviceA.doSomething();
           }
       }
      
       public class Main {
           public static void main(String[] args) {
               ServiceA serviceA = new ServiceA();  // 의존성 객체 생성
               Client client = new Client(serviceA);  // 생성자 주입
               client.execute();
           }
       }
      

3. 📚 참고 사항

📢 논의하기

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

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

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