SlideShare a Scribd company logo
1 of 14
Spring Framework 1부
사내서비스개발센터
김흥래
초난감 DAO
• 모든 로직이 하나의 클래스에 존재
– 중복되는 코드
– 확장이 필요할 때는?
초난감 DAO
• 프로그램의 변경이 일어날 때 필요한 작업
을 최소화하고, 그 변경이 다른 곳에 문제
를 일으키지 않게 할 수 없을까?
• Sample : code01
관심사의 분리
• 관심사의 분리 (Separation of Concerns)
– 변화가 한번에 한가지 관심에 집중될 가능성이 크다.
– 우리가 해야 할 일은 한가지 관심이 한군데의 코드로 집중되게
하는 것
– 관심이 같은 것끼리는 모으고 관심이 다른 것은 따로 떨어져 있
게 하는 것
관심사의 분리 (Method)
• 중복 코드의 메소드 추출
– 관심의 종류에 따라 코드를 메소드로 구분 짓는다. (Extract
Method)
– 한가지 관심에 대한 변경이 일어날 경우 그 관심이 집중되
는 부분의 코드만 수정하면 된다.
• 문제점
– 확장이 불가능
• Sample : code02
관심사의 분리 (상속)
• 상속을 통한 확장
관심사의 분리 (상속)
• 상속을 통한 확장
– 관심사에 따라 클래스 레벨로 코드 분리
• DAO의 Read, Write 같은 행위를 담당하는 UserDAO
• DB 연결을 어떻게 할것인가라는 관심을 담당하는 NUserDAO, DUserDAO
– 새로운 DB 연결이 필요할 때에는 UserDAO를 상속을 통해 확장
해주면 된다.
• Sample : code03
관심사의 분리 (상속)
• 상속보다는 구현을 사용해야 한다
– 상속을 이용한 방식에는 단점이 존재한다.
– 자바는 다중상속을 허용하지 않는다.
– 자식클래스는 부모클래스의 모든 기능을 직접 사용할 수 있다.
(강력한 커플링)
• 생각해 봅시다
– 부모클래스가 변경된다면?
– 새로운 DAO 클래스가 추가된다면 getConnection()을 재사용할
수 있을까?
관심사의 분리 (구현)
• 클래스의 분리
관심사의 분리 (구현)
• 클래스의 분리
– 분리된 관심사 객체를 생성자에서 주입 받으므로 인해서 상속관
계를 제거할 수 있다.
– 인터페이스를 이용하여 주입되는 객체와의 커플링을 제거할 수
있다.
– 다형성을 이용하여 관심사를 Runtime에 결정할 수 있다.
• Sample : code04 (Composition)
• Sample : code05 (Aggregation)
관심사의 분리 (구현)
• 관계설정에 대한 책임을 사용하는 곳으로 떠
넘긴다.
– 관심사와의 연결고리를 만드는 코드를 분리한다.
– UserDAO를 사용하는 코드(호스트 코드)에 관계설정의 책임을 떠넘
긴다.
• 호스트 코드
– 런타임 시 오브젝트들의 의존관계를 설정하는 책임을 담당해야 한
다.
• UserDAO
– 데이터 엑세스 작업에만 집중한다.
분리와 확장을 고려한 설계
• 리팩토링
• 변화가 필요한 부분(관심사)만 따로 분리하여 구현할 수 있도록
코드를 지속적으로 수정해야 한다.
• 디자인 패턴
• 객체지향 설계 원칙 (SOLID)
분리와 확장을 고려한 설계
• 관심사의 분리 과정
– 1단계 (메소드 추출)
• 독립된 메소드를 만들어서 분리
– 2단계 (상속)
• 상속 기반의 상하위 클래스를 분리
– 3단계 (구현)
• 상속 기반이 아닌 완전히 독립된 클래스로 분리
분리와 확장을 고려한 설계
• 관계설정 책임의 분리
– 인터페이스를 도입하여 호스트 코드에 책임을 떠넘기는 방식은
상속을 이용한 방식보다 훨씬 유연하다.
– 서로 영향을 주지 않으면서도 필요에 따라 자유롭게 확장할 수
있는 구조가 된다.
– 책임을 분리해 각자 자신이 부여 받은 책임에만 집중할 수 있다.
• DI (Dependency Injection)
– Runtime에 오프젝트의 의존성을 주입하는 객체 생성방식

More Related Content

What's hot

자바 8
자바 8자바 8
자바 8신 한
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DIAnselmKim
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2Daniel Lim
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
분석과 설계
분석과 설계분석과 설계
분석과 설계Haeil Yi
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)중선 곽
 
11 swift 값타입참조타입
11 swift 값타입참조타입11 swift 값타입참조타입
11 swift 값타입참조타입Changwon National University
 
Oop design principle
Oop design principleOop design principle
Oop design principleRyan Park
 

What's hot (15)

자바 8
자바 8자바 8
자바 8
 
[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI[스프링 스터디 2일차] IoC 컨테이너와 DI
[스프링 스터디 2일차] IoC 컨테이너와 DI
 
Java class
Java classJava class
Java class
 
Desing Pattern-2
Desing Pattern-2Desing Pattern-2
Desing Pattern-2
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Java 기초
Java 기초Java 기초
Java 기초
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
Java inner class
Java inner classJava inner class
Java inner class
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
 
11 swift 값타입참조타입
11 swift 값타입참조타입11 swift 값타입참조타입
11 swift 값타입참조타입
 
7 swift 제너릭스
7 swift 제너릭스7 swift 제너릭스
7 swift 제너릭스
 
Oop design principle
Oop design principleOop design principle
Oop design principle
 

Similar to Spring di chapter1

C Language II
C Language IIC Language II
C Language IISuho Kwon
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DIJU Chae
 
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리경식 최
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차seung-hyun Park
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리Gyuwon Yi
 
지금 우리에게 필요한 것은
지금 우리에게 필요한 것은지금 우리에게 필요한 것은
지금 우리에게 필요한 것은현진 김
 
MSA 세미나.pptx
MSA 세미나.pptxMSA 세미나.pptx
MSA 세미나.pptxssuser89c688
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)종일 김
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
Data oriented design
Data oriented designData oriented design
Data oriented designSangwook Kwon
 
11장 시스템
11장 시스템11장 시스템
11장 시스템kidoki
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 APINAVER Engineering
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개 SuHyun Jeon
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013devCAT Studio, NEXON
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)InBum Kim
 

Similar to Spring di chapter1 (20)

C Language II
C Language IIC Language II
C Language II
 
토비의 스프링 - DI
토비의 스프링 - DI토비의 스프링 - DI
토비의 스프링 - DI
 
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
마이크로 프론트엔드 아키텍쳐를 위한 모노레포 관리
 
몽고디비교육1일차
몽고디비교육1일차몽고디비교육1일차
몽고디비교육1일차
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
지금 우리에게 필요한 것은
지금 우리에게 필요한 것은지금 우리에게 필요한 것은
지금 우리에게 필요한 것은
 
MSA 세미나.pptx
MSA 세미나.pptxMSA 세미나.pptx
MSA 세미나.pptx
 
Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)Event Storming(이벤트 스토밍)
Event Storming(이벤트 스토밍)
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
Data oriented design
Data oriented designData oriented design
Data oriented design
 
11장 시스템
11장 시스템11장 시스템
11장 시스템
 
Linq
LinqLinq
Linq
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
LucideWorks Banana 소개
LucideWorks Banana 소개 LucideWorks Banana 소개
LucideWorks Banana 소개
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)MongoDB in use(김인범, mongodb korea)
MongoDB in use(김인범, mongodb korea)
 

More from 흥래 김

생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기흥래 김
 
검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유흥래 김
 
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기흥래 김
 
한글 자동완성 구현하기
한글 자동완성 구현하기한글 자동완성 구현하기
한글 자동완성 구현하기흥래 김
 
한글 자모 분석 원리
한글 자모 분석 원리한글 자모 분석 원리
한글 자모 분석 원리흥래 김
 
한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기흥래 김
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기흥래 김
 
5강 코드효율성
5강 코드효율성5강 코드효율성
5강 코드효율성흥래 김
 
1. introduction to java8
1. introduction to java81. introduction to java8
1. introduction to java8흥래 김
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa흥래 김
 
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE  [제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE 흥래 김
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy흥래 김
 
Apache http component
Apache http componentApache http component
Apache http component흥래 김
 
플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포흥래 김
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화흥래 김
 
Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략흥래 김
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava흥래 김
 

More from 흥래 김 (18)

생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기생초보를 위한 한글 형태소 분석하기
생초보를 위한 한글 형태소 분석하기
 
검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유검색엔진과 DB Like 검색의 결과가 다른 이유
검색엔진과 DB Like 검색의 결과가 다른 이유
 
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
Elasticsearch와 Python을 이용하여 맨땅에서 데이터 분석하기
 
한글 자동완성 구현하기
한글 자동완성 구현하기한글 자동완성 구현하기
한글 자동완성 구현하기
 
한글 자모 분석 원리
한글 자모 분석 원리한글 자모 분석 원리
한글 자모 분석 원리
 
한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기한글 형태소 분석기 활용하기
한글 형태소 분석기 활용하기
 
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
엘라스틱서치 클러스터로 수십억 건의 데이터 운영하기
 
5강 코드효율성
5강 코드효율성5강 코드효율성
5강 코드효율성
 
3. stream api
3. stream api3. stream api
3. stream api
 
1. introduction to java8
1. introduction to java81. introduction to java8
1. introduction to java8
 
Spring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msaSpring boot와 docker를 이용한 msa
Spring boot와 docker를 이용한 msa
 
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE  [제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
[제14회 JCO 컨퍼런스] 개발자를 위한 서버이중화 by JAVACAFE
 
[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy[DevOn 2013] Dynamic web proxy
[DevOn 2013] Dynamic web proxy
 
Apache http component
Apache http componentApache http component
Apache http component
 
플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포플랫폼 통합을 위한 Client Module 개발 & 배포
플랫폼 통합을 위한 Client Module 개발 & 배포
 
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
[JCO 컨퍼런스] 웹사이트 Front-End 성능 최적화
 
Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략Spring 3.1에서 ehcache 활용 전략
Spring 3.1에서 ehcache 활용 전략
 
[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava[2012 자바카페 OPEN 세미나] Introduction to google guava
[2012 자바카페 OPEN 세미나] Introduction to google guava
 

Spring di chapter1

  • 2. 초난감 DAO • 모든 로직이 하나의 클래스에 존재 – 중복되는 코드 – 확장이 필요할 때는?
  • 3. 초난감 DAO • 프로그램의 변경이 일어날 때 필요한 작업 을 최소화하고, 그 변경이 다른 곳에 문제 를 일으키지 않게 할 수 없을까? • Sample : code01
  • 4. 관심사의 분리 • 관심사의 분리 (Separation of Concerns) – 변화가 한번에 한가지 관심에 집중될 가능성이 크다. – 우리가 해야 할 일은 한가지 관심이 한군데의 코드로 집중되게 하는 것 – 관심이 같은 것끼리는 모으고 관심이 다른 것은 따로 떨어져 있 게 하는 것
  • 5. 관심사의 분리 (Method) • 중복 코드의 메소드 추출 – 관심의 종류에 따라 코드를 메소드로 구분 짓는다. (Extract Method) – 한가지 관심에 대한 변경이 일어날 경우 그 관심이 집중되 는 부분의 코드만 수정하면 된다. • 문제점 – 확장이 불가능 • Sample : code02
  • 6. 관심사의 분리 (상속) • 상속을 통한 확장
  • 7. 관심사의 분리 (상속) • 상속을 통한 확장 – 관심사에 따라 클래스 레벨로 코드 분리 • DAO의 Read, Write 같은 행위를 담당하는 UserDAO • DB 연결을 어떻게 할것인가라는 관심을 담당하는 NUserDAO, DUserDAO – 새로운 DB 연결이 필요할 때에는 UserDAO를 상속을 통해 확장 해주면 된다. • Sample : code03
  • 8. 관심사의 분리 (상속) • 상속보다는 구현을 사용해야 한다 – 상속을 이용한 방식에는 단점이 존재한다. – 자바는 다중상속을 허용하지 않는다. – 자식클래스는 부모클래스의 모든 기능을 직접 사용할 수 있다. (강력한 커플링) • 생각해 봅시다 – 부모클래스가 변경된다면? – 새로운 DAO 클래스가 추가된다면 getConnection()을 재사용할 수 있을까?
  • 9. 관심사의 분리 (구현) • 클래스의 분리
  • 10. 관심사의 분리 (구현) • 클래스의 분리 – 분리된 관심사 객체를 생성자에서 주입 받으므로 인해서 상속관 계를 제거할 수 있다. – 인터페이스를 이용하여 주입되는 객체와의 커플링을 제거할 수 있다. – 다형성을 이용하여 관심사를 Runtime에 결정할 수 있다. • Sample : code04 (Composition) • Sample : code05 (Aggregation)
  • 11. 관심사의 분리 (구현) • 관계설정에 대한 책임을 사용하는 곳으로 떠 넘긴다. – 관심사와의 연결고리를 만드는 코드를 분리한다. – UserDAO를 사용하는 코드(호스트 코드)에 관계설정의 책임을 떠넘 긴다. • 호스트 코드 – 런타임 시 오브젝트들의 의존관계를 설정하는 책임을 담당해야 한 다. • UserDAO – 데이터 엑세스 작업에만 집중한다.
  • 12. 분리와 확장을 고려한 설계 • 리팩토링 • 변화가 필요한 부분(관심사)만 따로 분리하여 구현할 수 있도록 코드를 지속적으로 수정해야 한다. • 디자인 패턴 • 객체지향 설계 원칙 (SOLID)
  • 13. 분리와 확장을 고려한 설계 • 관심사의 분리 과정 – 1단계 (메소드 추출) • 독립된 메소드를 만들어서 분리 – 2단계 (상속) • 상속 기반의 상하위 클래스를 분리 – 3단계 (구현) • 상속 기반이 아닌 완전히 독립된 클래스로 분리
  • 14. 분리와 확장을 고려한 설계 • 관계설정 책임의 분리 – 인터페이스를 도입하여 호스트 코드에 책임을 떠넘기는 방식은 상속을 이용한 방식보다 훨씬 유연하다. – 서로 영향을 주지 않으면서도 필요에 따라 자유롭게 확장할 수 있는 구조가 된다. – 책임을 분리해 각자 자신이 부여 받은 책임에만 집중할 수 있다. • DI (Dependency Injection) – Runtime에 오프젝트의 의존성을 주입하는 객체 생성방식