김시용
1. 📌 핵심 개념 정리
✅ 요약하기
각자 해당 챕터에서 중요하다고 느낀 개념이나 아이디어를 간략하게 정리하고 개선 전, 후에 대한 예시 코드를 비교하며 개념을 설명합니다.
- 시스템 제작과 사용을 분리하라
관심사 분리 : 준비 과정 (객체 제작 및 의존성 연결) <-> 런타임 로직 분리하기-
관심사 분리 안된 예시 : 초기화 지연 / 계산 지연
public Service getService() { if (service == null) service = new MyServiceImpl(..); retrun service; }
장점: 필요할 때만 객체를 생성하므로 부하↓ / null 포인트 반환X
단점:
의존성 문제 (MyServiceImpl 객체 사용하지 않더라도 의조선 해결해야함)
테스트 문제 (런탐임 로직에 객체 생성 로직을 섞어 놓아서 모든 실행 경로도 테스트 해야함 -> SRP도 깬다는 말이다.) -
관심사 분리 : Main 분리
main 함수에서 시스템에 필요한 객체 모두 생성 -> 애플리케이션에 넘김
애플리케이션은 객체를 사용할 뿐 (객체 생성 시점, 과정 모름) -
관심사 분리 : 팩토리
객체가 생성되는 시점을 애플리케이션이 결정해야할 때 사용
애플리케이션은 여기서도 객체 생성 과정 모름 -
관심사 분리 : 의존선 주입 객체가 의존하는 객체를 직접 생성하지 않고 외부로부터 제공받는 설계 패턴
객체 간 결합도 낮추고, 코드의 재사용성과 테스트 용이성을 높여줌
스프링에서는 DI 컨테이너가 의존성을 관리해줌
-
- 확장
처음부터 올바르게 시스템을 만들 수 있다는 믿음은 미신이다.
현재 주어진 상황에 맞게 시스템을 구현해야 한다. (TDD, 리팩터링 활용하기)- 횡단 관심사: 시스템 전반에 걸쳐 공통적으로 적용되어야하는 기능 (핵심 비즈니스 로직과 분리되는 공통적인 기능)
- 자바 프록시
프록시란 어떤 대상(객체)를 대신하여 요청을 처리하는 대리 객체를 의미한다.
즉, 원래 객체의 기능을 확정하거나 변경하기 위해 중간에서 요청을 가로채는 역할을 한다.- 단점 : 코드의 양과 크기가 늘어나 깨끗한 코드 작성이 어려움 / 시스템 단위로 실행지점 명시도 어려움
- 순수 자바 AOP 프레임워크
프록시를 활용하여 실행되는 메서드 앞뒤에 부가 기능 적용
-> 어노테이션 활용해 영속성 정보 부여 (필요시, XML 배치로 옮겨도 됨)- AspectJ 관점: 관심사를 관점으로 분리하는 가장 강력한 도구 (AOP 적용 도구)
- 결론 모든 추상화 단계에서 의도는 명확히 하기 위해 -> POJO를 작성하고 관점 혹은 관점과 유사한 메커니즘을 사용해 각 구현 관심사를 분리해야 함
2. 🤔 이해가 어려운 부분
🔍 질문하기
책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.
- POJO (Plain Old Java Object)
- 어려웠던 부분
POJO를 처음 보는거라 개념 자체가 이해가 안 갔음 - 궁금한 점
POJO는 특정 프레임워크나 라이브러리에 의존하지 않는 순수한 자바 객체 (특별한 규칙, 상속 없이 자유롭게 설계된 객체)
- 어려웠던 부분
- 의존성 주입
-
어려웠던 부분
제어의 역전이 이해가 안감 -
궁금한 점
제어의 역전이란? 객체가 스스로 의존성을 생성하고 관리 -> 객체의 생성 및 의존성 관리를 외부에 맡김- 의존성 주입 (제어의 역전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. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 관련 자료 공유
- 추가 자료
관련 블로그 글이나 공식 문서 링크를 제공합니다.
- 추가 자료
- 논의하고 싶은 주제
- 주제
논의하고 싶은 내용을 간략히 정리합니다. - 설명
논의하고 싶은 이유를 작성합니다.
- 주제