SlideShare a Scribd company logo
1 of 20
Dependency Injection 소개 최범균(madvirus@madvirus.net)
TOC DI 의존 의존 처리 DI 장점
기능 구현을 위한 코드 구성 게시글 쓰기 게시판 정보조회 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 데이터 검증 게시글 데이터 삽입
Monolithic 코드의 문제
단일 -> 분리 유지/보수 측면에서 단일 클래스보다 역할 별 분리된 클래스가 유리 (코드 가독성, 기능 추가, 변경, 확장 등) 게시글 쓰기 게시판 정보조회 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 데이터 검증 게시글 데이터 삽입
객체 간 의존(dependency) 발생 게시판 정보조회 데이터 검증 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 게시글 데이터 삽입 * 의존의 가장 단순한 정의: 다른 객체의 메서드를 호출하면 의존
의존 객체를 구하는 방식 직접 의존 객체 구함 중앙 저장소에서 객체 구함 DI 사용
의존 상황
의존 처리 1: 직접 의존 객체 구함 코드에서 직접 의존 클래스의 객체 생성 public class WriteArticleService {     public WriteResult write(Article article) {         BoardService boardService = new DefaultBoardService();         Board board = boardService.getBoard(article.getBoardId());         if (board == null) {             throw new BoardNotFoundException(article.getBoardId());         }         IdGenerator idGenerator = new MemoryIdGenerator();         Integer nextId = idGenerator.nextId();         article.setId(nextId);         ArticleDao articleDao = new MySQLArticleDao();         articleDao.insert(article);         return WriteResult(aritcle);     } } 의존 클래스를 바꾸면 코드 수정 필요 의존 클래스가 구현되기 전이면, 실행 불가
의존 처리 2: 중앙에서 가져옴 객체 Locator (또는 디렉터리 서버)로부터 의존 객체 구함 public class WriteArticleService {     public WriteResult write(Article article) {         BoardService boardService = Locator.getBoardService();         Board board = boardService.getBoard(article.getBoardId());         if (board == null) {             throw new BoardNotFoundException(article.getBoardId());         }         IdGenerator idGenerator = Locator.getIdGenerator();         Integer nextId = idGenerator.nextId();         article.setId(nextId);         ArticleDao articleDao = Locator.getArticleDao();         articleDao.insert(article);         return WriteResult(aritcle);     } } 로직과 상관없는 클래스에 대한 의존 발생
의존 처리 3: Dependency Injection 의존 객체를 외부로부터 전달받음 public class WriteArticleService {     private BoardService boardService;     private IdGenerator idGenerator;     private ArticleDao articleDao;     public void setBoardService(BoardService boardService) {         this.boardService = boardService;     }     …     public WriteResult write(Article article) {         Board board = boardService.getBoard(article.getBoardId());         if (board == null) {             throw new BoardNotFoundException(article.getBoardId());         }         Integer nextId = idGenerator.nextId();         article.setId(nextId);         articleDao.insert(article);         return WriteResult(aritcle);     } }
조립기 DI는 조립기를 통해 구현 public class Assembler {     public void init() {         DefaultBoardServiceboardService = new DefaultBoardService();         MemoryIdGenerator idGenerator = new MemoryIdGenerator();         MySQLArticleDao articleDao = new MySQLArticleDao();         WriteArticleService articleService = new WriteArticleService();         articleService.setBoardService(boardService);         articleService.setIdGenerator(idGenerator);         articleService.setArticleDao(articleDao);         …     }     public WriteArticleService getWriteArticleService() {         return articleService;     } } Assembler assembler = new Assembler(); assembler.init(); WriteArticleService service = assember.getWriteArticleService(); service.write(…);
DI 기법 두 가지 생성자를 통한 의존 객체 전달받음 Setter 메서드를 통해 의존 객체 전달받음 기타: Method Injection public class WriteArticleService {     private ArticleDao articleDao;     public WriteArticleService(ArticleDao articleDao) {         this.articleDao = articleDao;     } } public class WriteArticleService {     private ArticleDao articleDao;     public setArticleDao(ArticleDao articleDao) {         this.articleDao = articleDao;     } }
조립기의 구현 조립기는 객체를 담는 컨테이너 형태로 구현 됨 주요 컨테이너: Spring, Google Guice, … 컨테이너 어플리케이션
Spring DI 설정 예 XML 이용 객체간 의존 설정 <bean id="agent" class="com.wemade.am.agent.Agent"     p:functionConfigLoader-ref="functionConfigLoader"     p:functionConfigRepository-ref="functionTestLineRepository"     p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader"     class="com.wemade.am.agent.loader.HttpClientFunctionConfigLoader"     p:configLoadingUrl="${console.configLoadingUrl}"     p:testConfigUnmarshaller-ref="testConfigUnmarshaller" /> <bean id="testConfigUnmarshaller"      class="com.wemade.am.agent.loader.StaxTestConfigUnmarshaller" /> <bean id="functionTestLineRepository"      class="com.wemade.am.agent.repo.FunctionTestLineRepositoryImpl" /> <bean id="scheduler" class="com.wemade.am.agent.scheduler.TimerScheduler"     p:period="60000" p:testProcessor-ref="testProcessor" />
DI 장점 의존 객체의 변경이 용이 단위 테스트가 쉬워짐 기타 장점 코드 가독성 향상 재사용성 향상
장점1 : 의존 객체 변경 용이 설정 파일 변경 만으로 의존 객체 변경 <bean id="agent" class="com.wemade.am.agent.Agent"     p:functionConfigLoader-ref="functionConfigLoader"     p:functionConfigRepository-ref="functionTestLineRepository"     p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader"     class="com.wemade.am.agent.loader.HttpClientFunctionConfigLoader” /> <bean id="agent" class="com.wemade.am.agent.Agent"     p:functionConfigLoader-ref="functionConfigLoader"     p:functionConfigRepository-ref="functionTestLineRepository"     p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader"     class="com.wemade.am.agent.loader.SoapFunctionConfigLoader” />
장점2 : 단위 테스트 용이 Mock 객체를 이용한 단위 테스트 가능 실제 구현 없이 (또는 사용하지 않고) 테스트 가능 의존 클래스를 코드에서 직접 사용할 경우, 전체가 완성되기 전까지 테스트 과정이 수월하지 않음 WriteArticleService service = new WriteArticleService(); ArticleDao articleDao = mock(ArticleDao.class); … service.setArticleDao(articleDao); WriteResult result = service.write(…); assertNotNull(result.getArticle()); Mockito, easyMock 등 이용해서 실 구현없이 가짜 객체 생성 class WriteArticleService {     public WriteResult write(Article article) {         ArticleDao articleDao = new MySQLArticleDao();         articleDao.insert(article);         …     }  } 의존 클래스 구현 없이 테스트 어려움
DI의 장점을 살리려면,,, 인터페이스에 의존할 것! 자바 인터페이스 or 추상 클래스의 추상 메서드 최대한 역할별로 클래스를 분리할 것 좋은 기준: 클래스 LoC(Line of Code) < 100~200
질문?

More Related Content

What's hot

2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료beom kyun choi
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftSeongGyu Jo
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지NAVER Engineering
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여Jin wook
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기YoungSu Son
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트병한 유
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발NAVER D2
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2기동 이
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10hungrok
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GDG Korea
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙Hyosang Hong
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGDG Korea
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 

What's hot (19)

2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
2007년 제8회 JCO 컨퍼런스 POJO 프로그래밍 발표 자료
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
Protocol Oriented Programming in Swift
Protocol Oriented Programming in SwiftProtocol Oriented Programming in Swift
Protocol Oriented Programming in Swift
 
[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지[11]Android DataBinding : 기초에서 고급까지
[11]Android DataBinding : 기초에서 고급까지
 
AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여AngularJS의 개발방식에 대하여
AngularJS의 개발방식에 대하여
 
안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기안드로이드 개발자에 필요한 오픈소스이야기
안드로이드 개발자에 필요한 오픈소스이야기
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발[1A5]효율적인안드로이드앱개발
[1A5]효율적인안드로이드앱개발
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
GraphQL overview #2
GraphQL overview #2GraphQL overview #2
GraphQL overview #2
 
Jquery javascript_ed10
Jquery javascript_ed10Jquery javascript_ed10
Jquery javascript_ed10
 
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
GKAC 2014 Nov. - 안드로이드 스튜디오로 생산성 올리기
 
유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙유지보수 가능한 개발 원칙
유지보수 가능한 개발 원칙
 
GKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android LooperGKAC 2015 Apr. - Android Looper
GKAC 2015 Apr. - Android Looper
 
Redux
ReduxRedux
Redux
 
Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
Tdd 4장
Tdd 4장Tdd 4장
Tdd 4장
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 

Viewers also liked

[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)Young-Ho Cho
 
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)Darion Kim
 
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상Darion Kim
 
Dagger 2.0 을 활용한 의존성 주입
Dagger 2.0 을 활용한 의존성 주입Dagger 2.0 을 활용한 의존성 주입
Dagger 2.0 을 활용한 의존성 주입승용 윤
 
회사에서 기술서적을 읽는다는것
회사에서 기술서적을 읽는다는것회사에서 기술서적을 읽는다는것
회사에서 기술서적을 읽는다는것성환 조
 
RxJava in Action
RxJava in ActionRxJava in Action
RxJava in ActionTaeho Kim
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration수홍 이
 
Introduction For seq2seq(sequence to sequence) and RNN
Introduction For seq2seq(sequence to sequence) and RNNIntroduction For seq2seq(sequence to sequence) and RNN
Introduction For seq2seq(sequence to sequence) and RNNHye-min Ahn
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)Sang Don Kim
 
PyCon 2015 - 업무에서 빠르게 활용하는 PyQt
PyCon 2015 - 업무에서 빠르게 활용하는 PyQtPyCon 2015 - 업무에서 빠르게 활용하는 PyQt
PyCon 2015 - 업무에서 빠르게 활용하는 PyQt덕규 임
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신NAVER D2
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기YoungSu Son
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법 YoungSu Son
 
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -Darion Kim
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 Young-Ho Cho
 
Victoria's Secret Angels Campaign
Victoria's Secret Angels CampaignVictoria's Secret Angels Campaign
Victoria's Secret Angels CampaignJohn White
 

Viewers also liked (20)

[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)[JWPA-1]의존성 주입(Dependency injection)
[JWPA-1]의존성 주입(Dependency injection)
 
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)
주니어 개발자도 이해 할 수 있는 의존성 주입(Dependency Injection)
 
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상
주니어 개발자도 이해 할 수 있는 아름다운 JVM 세상
 
Dagger 2.0 을 활용한 의존성 주입
Dagger 2.0 을 활용한 의존성 주입Dagger 2.0 을 활용한 의존성 주입
Dagger 2.0 을 활용한 의존성 주입
 
회사에서 기술서적을 읽는다는것
회사에서 기술서적을 읽는다는것회사에서 기술서적을 읽는다는것
회사에서 기술서적을 읽는다는것
 
Spring
SpringSpring
Spring
 
Mvp 이전2
Mvp 이전2Mvp 이전2
Mvp 이전2
 
RxJava in Action
RxJava in ActionRxJava in Action
RxJava in Action
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
 
Introduction For seq2seq(sequence to sequence) and RNN
Introduction For seq2seq(sequence to sequence) and RNNIntroduction For seq2seq(sequence to sequence) and RNN
Introduction For seq2seq(sequence to sequence) and RNN
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
[Td 2015]너에게만 나는 반응해 반응형 응용프로그램(이규원)
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
PyCon 2015 - 업무에서 빠르게 활용하는 PyQt
PyCon 2015 - 업무에서 빠르게 활용하는 PyQtPyCon 2015 - 업무에서 빠르게 활용하는 PyQt
PyCon 2015 - 업무에서 빠르게 활용하는 PyQt
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
 
[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기[NEXT] Andorid에 MVC 패턴 적용하기
[NEXT] Andorid에 MVC 패턴 적용하기
 
SW 아키텍처 분석방법
SW 아키텍처 분석방법 SW 아키텍처 분석방법
SW 아키텍처 분석방법
 
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -
주니어 개발자도 이해하는 코어 J2EE 패턴 - 학급반장편 -
 
애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향 애플리케이션 아키텍처와 객체지향
애플리케이션 아키텍처와 객체지향
 
Victoria's Secret Angels Campaign
Victoria's Secret Angels CampaignVictoria's Secret Angels Campaign
Victoria's Secret Angels Campaign
 

Similar to Dependency Injection 소개

REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With HiltSSLEE14
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax KoreanTerry Cho
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정정호 이
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationHyuncheol Jeon
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3plusperson
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로NHN FORWARD
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.Hojin Jun
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Cappuccino fundamental
Cappuccino fundamentalCappuccino fundamental
Cappuccino fundamentalJeongHun Byeon
 

Similar to Dependency Injection 소개 (20)

[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초[Codelab 2017] ReactJS 기초
[Codelab 2017] ReactJS 기초
 
Coded ui가이드
Coded ui가이드Coded ui가이드
Coded ui가이드
 
3-2. selector api
3-2. selector api3-2. selector api
3-2. selector api
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With Hilt
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax Korean
 
Android Google Cloud Message 설정
Android Google Cloud Message 설정Android Google Cloud Message 설정
Android Google Cloud Message 설정
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
Hacosa jquery 1th
Hacosa jquery 1thHacosa jquery 1th
Hacosa jquery 1th
 
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modificationSecrets of the JavaScript Ninja - Chapter 12. DOM modification
Secrets of the JavaScript Ninja - Chapter 12. DOM modification
 
Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로
 
HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.HOONS닷넷 오픈소스 프로젝트 Part1.
HOONS닷넷 오픈소스 프로젝트 Part1.
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Cappuccino fundamental
Cappuccino fundamentalCappuccino fundamental
Cappuccino fundamental
 

More from beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기beom kyun choi
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)beom kyun choi
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회beom kyun choi
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료beom kyun choi
 

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 
하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기하둡2 YARN 짧게 보기
하둡2 YARN 짧게 보기
 
차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)차원축소 훑어보기 (PCA, SVD, NMF)
차원축소 훑어보기 (PCA, SVD, NMF)
 
객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회객체 지향 발담그기 JCO 컨퍼런스 14회
객체 지향 발담그기 JCO 컨퍼런스 14회
 
Storm 훑어보기
Storm 훑어보기Storm 훑어보기
Storm 훑어보기
 
Hive 입문 발표 자료
Hive 입문 발표 자료Hive 입문 발표 자료
Hive 입문 발표 자료
 

Dependency Injection 소개

  • 1. Dependency Injection 소개 최범균(madvirus@madvirus.net)
  • 2. TOC DI 의존 의존 처리 DI 장점
  • 3. 기능 구현을 위한 코드 구성 게시글 쓰기 게시판 정보조회 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 데이터 검증 게시글 데이터 삽입
  • 5. 단일 -> 분리 유지/보수 측면에서 단일 클래스보다 역할 별 분리된 클래스가 유리 (코드 가독성, 기능 추가, 변경, 확장 등) 게시글 쓰기 게시판 정보조회 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 데이터 검증 게시글 데이터 삽입
  • 6. 객체 간 의존(dependency) 발생 게시판 정보조회 데이터 검증 게시글 쓰기 폼 게시글 쓰기 요청 처리 게시글 ID/정렬값생성 게시글 데이터 삽입 * 의존의 가장 단순한 정의: 다른 객체의 메서드를 호출하면 의존
  • 7. 의존 객체를 구하는 방식 직접 의존 객체 구함 중앙 저장소에서 객체 구함 DI 사용
  • 9. 의존 처리 1: 직접 의존 객체 구함 코드에서 직접 의존 클래스의 객체 생성 public class WriteArticleService { public WriteResult write(Article article) { BoardService boardService = new DefaultBoardService(); Board board = boardService.getBoard(article.getBoardId()); if (board == null) { throw new BoardNotFoundException(article.getBoardId()); } IdGenerator idGenerator = new MemoryIdGenerator(); Integer nextId = idGenerator.nextId(); article.setId(nextId); ArticleDao articleDao = new MySQLArticleDao(); articleDao.insert(article); return WriteResult(aritcle); } } 의존 클래스를 바꾸면 코드 수정 필요 의존 클래스가 구현되기 전이면, 실행 불가
  • 10. 의존 처리 2: 중앙에서 가져옴 객체 Locator (또는 디렉터리 서버)로부터 의존 객체 구함 public class WriteArticleService { public WriteResult write(Article article) { BoardService boardService = Locator.getBoardService(); Board board = boardService.getBoard(article.getBoardId()); if (board == null) { throw new BoardNotFoundException(article.getBoardId()); } IdGenerator idGenerator = Locator.getIdGenerator(); Integer nextId = idGenerator.nextId(); article.setId(nextId); ArticleDao articleDao = Locator.getArticleDao(); articleDao.insert(article); return WriteResult(aritcle); } } 로직과 상관없는 클래스에 대한 의존 발생
  • 11. 의존 처리 3: Dependency Injection 의존 객체를 외부로부터 전달받음 public class WriteArticleService { private BoardService boardService; private IdGenerator idGenerator; private ArticleDao articleDao; public void setBoardService(BoardService boardService) { this.boardService = boardService; } … public WriteResult write(Article article) { Board board = boardService.getBoard(article.getBoardId()); if (board == null) { throw new BoardNotFoundException(article.getBoardId()); } Integer nextId = idGenerator.nextId(); article.setId(nextId); articleDao.insert(article); return WriteResult(aritcle); } }
  • 12. 조립기 DI는 조립기를 통해 구현 public class Assembler { public void init() { DefaultBoardServiceboardService = new DefaultBoardService(); MemoryIdGenerator idGenerator = new MemoryIdGenerator(); MySQLArticleDao articleDao = new MySQLArticleDao(); WriteArticleService articleService = new WriteArticleService(); articleService.setBoardService(boardService); articleService.setIdGenerator(idGenerator); articleService.setArticleDao(articleDao); … } public WriteArticleService getWriteArticleService() { return articleService; } } Assembler assembler = new Assembler(); assembler.init(); WriteArticleService service = assember.getWriteArticleService(); service.write(…);
  • 13. DI 기법 두 가지 생성자를 통한 의존 객체 전달받음 Setter 메서드를 통해 의존 객체 전달받음 기타: Method Injection public class WriteArticleService { private ArticleDao articleDao; public WriteArticleService(ArticleDao articleDao) { this.articleDao = articleDao; } } public class WriteArticleService { private ArticleDao articleDao; public setArticleDao(ArticleDao articleDao) { this.articleDao = articleDao; } }
  • 14. 조립기의 구현 조립기는 객체를 담는 컨테이너 형태로 구현 됨 주요 컨테이너: Spring, Google Guice, … 컨테이너 어플리케이션
  • 15. Spring DI 설정 예 XML 이용 객체간 의존 설정 <bean id="agent" class="com.wemade.am.agent.Agent" p:functionConfigLoader-ref="functionConfigLoader" p:functionConfigRepository-ref="functionTestLineRepository" p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader" class="com.wemade.am.agent.loader.HttpClientFunctionConfigLoader" p:configLoadingUrl="${console.configLoadingUrl}" p:testConfigUnmarshaller-ref="testConfigUnmarshaller" /> <bean id="testConfigUnmarshaller" class="com.wemade.am.agent.loader.StaxTestConfigUnmarshaller" /> <bean id="functionTestLineRepository" class="com.wemade.am.agent.repo.FunctionTestLineRepositoryImpl" /> <bean id="scheduler" class="com.wemade.am.agent.scheduler.TimerScheduler" p:period="60000" p:testProcessor-ref="testProcessor" />
  • 16. DI 장점 의존 객체의 변경이 용이 단위 테스트가 쉬워짐 기타 장점 코드 가독성 향상 재사용성 향상
  • 17. 장점1 : 의존 객체 변경 용이 설정 파일 변경 만으로 의존 객체 변경 <bean id="agent" class="com.wemade.am.agent.Agent" p:functionConfigLoader-ref="functionConfigLoader" p:functionConfigRepository-ref="functionTestLineRepository" p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader" class="com.wemade.am.agent.loader.HttpClientFunctionConfigLoader” /> <bean id="agent" class="com.wemade.am.agent.Agent" p:functionConfigLoader-ref="functionConfigLoader" p:functionConfigRepository-ref="functionTestLineRepository" p:scheduler-ref="scheduler" /> <bean id="functionConfigLoader" class="com.wemade.am.agent.loader.SoapFunctionConfigLoader” />
  • 18. 장점2 : 단위 테스트 용이 Mock 객체를 이용한 단위 테스트 가능 실제 구현 없이 (또는 사용하지 않고) 테스트 가능 의존 클래스를 코드에서 직접 사용할 경우, 전체가 완성되기 전까지 테스트 과정이 수월하지 않음 WriteArticleService service = new WriteArticleService(); ArticleDao articleDao = mock(ArticleDao.class); … service.setArticleDao(articleDao); WriteResult result = service.write(…); assertNotNull(result.getArticle()); Mockito, easyMock 등 이용해서 실 구현없이 가짜 객체 생성 class WriteArticleService { public WriteResult write(Article article) { ArticleDao articleDao = new MySQLArticleDao(); articleDao.insert(article); … } } 의존 클래스 구현 없이 테스트 어려움
  • 19. DI의 장점을 살리려면,,, 인터페이스에 의존할 것! 자바 인터페이스 or 추상 클래스의 추상 메서드 최대한 역할별로 클래스를 분리할 것 좋은 기준: 클래스 LoC(Line of Code) < 100~200