일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 2019 카카오 공채
- 젠킨스
- 카카오
- 백준
- 자바
- 알고리즘
- set
- 2018 KAKAO BLIND RECRUITMENT 1차
- 2019 KAKAO BLIND RECRUITMENT
- 2019 카카오 개발자 겨울 인턴십 코딩테스트
- 2018 카카오 공채
- dfs
- 2018 KAKAO BLIND RECRUITMENT
- bfs
- 삼성 SW 기출문제
- map
- 비트마스크
- gradle
- 2020 카카오 공채
- 삼성 SW 역량테스트
- c++
- gcp
- CS 스터디
- 2020 KAKAO BLIND RECRUITMENT
- 프로그래머스
- 2018 카카오
- Java
- 카카오 공채
- Baekjoon
- 부스트코스
- Today
- Total
아무코딩
스프링 DI 본문
스프링 DI
의존이란?
DI는 'Dependency Injection'의 약자로 우리말로는 '의존 주입'이라고 번역한다. 여기서 의존은 객체간의 의존 을 의미한다.
한클래스가 다른클래스의 메서드를 실행할 때 이를 '의존'한다고 표현한다.
의존은 변경에 의해 영향을 받는 관계를 의미한다. 예를들어 MemberDao insert() 메서드의 이름을 insertMember()로 변경하면 이 메서드를 사용하는 MemberregisterService 클래스의 소스코드도 함께 변경된다. 이렇게 변경에 따른 영향이 전파되는 관계를 "의존"한다고 표현한다.
의존대상 구현 - 의존 대상 객체를 직접 생성
public class MemberRegisterService{
//의존 객체를 직접생성
private MemberDao memberdao = new MemberDao();
...
}
MemberRegisterService 클래스에서 의존하는 MemberDao 객체를 직접 생성하기 때문에 MemberRegisterService 객체를 생성하는 순간에 MemberDao 객체도 함께 생성된다.
//의존하는 MemberDao의 객체도 함께 생성
MemberRegisterService svc = new MemberRegisterService();
클래스 내부에서 직접 의존 객체를 생성하는 것이 쉽긴 하지만 유지보수 관점에서 문제점을 유발할 수 있다.
그래서 사용하는 다른 방법은 DI 와 서비스 로케이터 이다. 여기서 스프링과 관련된 방법은 DI이다.
DI를 통한 의존 처리
DI(Dependency Injection, 의존 주입)은 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달 받는 방식을 사용한다.
package spring;
import java.time.LocalDateTime;
public class MemberRegisterService {
private MemberDao memberDao;
public MemberRegisterService(MemberDao memberDao) {
this.memberDao = memberDao;
}
public Long regist(RegisterRequest req) {
Member member = memberDao.selectByEmail(req.getEmail());
if (member != null) {
throw new DuplicateMemberException("dup email " + req.getEmail());
}
Member newMember = new Member(
req.getEmail(), req.getPassword(), req.getName(),
LocalDateTime.now());
memberDao.insert(newMember);
return newMember.getId();
}
}
public MemberRegisterService(MemberDao memberDao) {
this.memberDao = memberDao;
}
이부분을 보면 알수 있듯이 생성자를 통해 의존 객체를 전달받는다. 즉, 생성자를 통해 MemberRegisterService가 의존하고 있는 MemberDao 객체를 주입(injection) 받은 것이다.
MemberDao dao = new MemberDao();
// 의존 객체를 생성자를 통해 주입한다.
MemberRegisterService svc = new MemberRegisterService(dao);
코드도 길어지고 그러는데 왜 DI를 하는 것인가?
-> 의존 객체 변경이 유연해진다.
Reference
- 초보 웹 개발자를 위한 스프링 5 프로그래밍 입문 - 최범균 저
'Spring+웹' 카테고리의 다른 글
[스프링] AOP 와 프록시 패턴 (0) | 2020.05.13 |
---|---|
[스프링] DI 방식 두가지 비교 (생성자 vs 세터 메서드) (0) | 2020.05.12 |
[웹/부스트코스] Servlet Lifecycle (0) | 2020.04.24 |
[웹] Servlet (0) | 2020.04.23 |
[웹/FE] class와 id (0) | 2020.04.21 |