Chapter 03의 내용
- 객체 의존과 의존 주입(DI)
- 객체 조립
- 스프링 DI 설정
※ 정리
- 스프링 DI(Dependency Injection)
- 한 클래스가 다른 클래스의 메서드를 실행할 때, 변경에 의해 영향을 받는 관계
- 의존은 직접 생성이 아닌, 생성자를 통해 주입하는 방법으로 해야 변경에 용이함
- @Configuration, @Bean으로 스프링 설정 클래스를 만들어 객체를 등록하면 스프링 컨테이너에서 내부적으로 관리된다.
스프링 DI(Dependency Injection)
의존 관계 ?
DI이는 우리말로 의존 주입으로, 한 클래스가 다른 클래스의 메서드를 실행하는 관계, 변경에 의해 영향을 받는 관계를
'의존 관계'라고 표현한다.
package chap03.spring;
import java.time.LocalDateTime;
public class MemberReegisterService {
private MemberDao memberDao;
//생성자를 통해 의존 객체를 주입 받음, 주입 받은 객체를 필드에 할당
public MemberReegisterService(MemberDao memberDao){
this.memberDao=memberDao;
}
public Long regist(RegisterRequest req){ //RegisterRequest 커맨드 객체 , 스프링은 커맨드 객체의 setter를 이용해 값을 담아주는 기능을한다.
Member member = memberDao.selectByEmail(req.getEmail());
if(member!=null){
throw new DuplicationMemberException("dup email"+req.getEmail());
}
Member newMember = new Member(req.getEmail(),req.getPassword(),req.getName(), LocalDateTime.now()); //이메일, 패스워드, 이름, 시간 등을 newmember에 담아서
memberDao.insert(newMember); //member객체에 insert한다.
return newMember.getId();
}
}
- MemberReegisterService에서 회원을 등록하기 위해 memberDao의 insert()메서드를 실행
- MemberDao의 insert()메서드의 이름을 insertMember()로 변경하면 MemberReegisterService에서도 수정
DI를 통한 의존 처리
1) MemberDAO의 객체를 직접 생성해서 필드에 할당(유지보수 관점에서 좋지 못함)
public class MemberRegisterService{
private MemberDao memberDao = new MemberDao()
MemberRegisterService svc = new MemberRegisterService()
}
MemberRegisterService의 객체를 생성할 때, MemberDao객체도 함께 생성된다. 수정 사항이 발생했을 때 MemberDao 객체가 필요한 클래스 모두 동일하게 소스 코드를 변경해야해서 유지보수 관점에서 좋지 못하다.
2) 생성자를 통해 의존 객체를 주입 받아 필드에 할당
public class MemberReegisterService {
private MemberDao memberDao;
//생성자를 통해 의존 객체를 주입 받음, 주입 받은 객체를 필드에 할당
public MemberReegisterService(MemberDao memberDao){
this.memberDao=memberDao;
}
}
DI는 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방식을 사용한다. 생성자를 통해 객체를 주입받는다.
두가지 방식을 비교하면,
생성자를 통해 객체를 주입하는 코드가 변경할 코드가 한곳으로 집중되기 때문에 변경에 유연해진다.
객체 조립기 (assembler)
- 객체를 생성하고 의존 객체를 주입해주는 조립기 클래스를 따로 작성한다.
- 의존 객체를 변경하려면 조립기의 코드만 수정해주면 되기 때문에 관리가 편하다.
스프링의 DI 설정
ㅁ 스프링은 조립기!
= 스프링이 DI를 지원하는 조립기. Assembler 클래스의 생성자 코드처럼 필요한 객체를 생성하고 생성한 객체에 의존을 주입한다.
= 스프링이 어떤 객체를 생성하고, 의존을 어떻게 주입할지 정의한 설정 정보(Configuration)를 작성해 꺼내쓰면 된다.
- @Configuration : 스프링 설정 클래스를 나타냄
- @Bean : 메서드가 생성한 객체
@Configuration 애노테이션이 붙어있는 클래스는 스프링 설정 클래스임을 나타내고, 설정 클래스에서 @Bean 애노테이션 태그를 사용해서 객체를 등록해주면 스프링 컨테이너에서 내부적으로 관리를 하게 된다. 위의 코드에서 AppCtx 클래스는 스프링 설정 클래스이며, memberDao(), memberRegSvc(), cahngePwdSvc()가 Bean으로 등록되서 내부적으로 관리 되는 중이다.
AnnotationConfigApplicationContext 클래스로 스프링 컨테이너를 생성하여 설정 클래스가져오고, 등록 된 Bean 객체들을 꺼내쓰면 된다. 위의 코드에서는 changePwdSvc로 등록 된 빈 객체를 꺼내 쓰고 있다.
REFERENCE
초보 웹 개발자를 위한 스프링 5 프로그래밍 입문(최범균)
'공부 > Spring' 카테고리의 다른 글
[Spring] Chapter 07 - Spring AOP (0) | 2021.06.13 |
---|---|
[Spring] Chapter 06 - 빈라이클사이클과 범위 (0) | 2021.06.13 |
[Spring] Chapter 05 - 컴포넌트 스캔 (0) | 2021.06.13 |
[Spring] Chapter 04 - 의존 자동 주입 (0) | 2021.06.13 |
[Spring]Chapter 02 - 스프링 시작하기 (1) | 2021.06.13 |