[DI(Dependency Injection)]
- 의존성 주입
- 코드상 객체를 직접적으로 만드는 게 아닌 객체의 밖에서 객체를 넣어주는(주입하는) 방식
배터리가 일체형인 장난감은 배터리가 다 떨어지면 장난감을 새로 사야하지만
배터리가 분리형인 장난감은 배터리가 다 떨어지면 배터리만 바꿔주면 된다
- 코드상 객체를 직접적으로 만드는 것
public class BugService {
public void countLeg() {
BugRepository bug = new Fly();
bug.legCount();
}
}
이것을 일체형 배터리라고 생각하면 된다
코드에서 직접 new를 이용해 객체를 생성해주고, 수정할 일이 생긴다면 이 부분을 직접 찾아 수정해야 한다
이것을 "의존성이 생겼다", "의존성을 가진다"라고 말을 할 수 있다
이렇게 코드를 짰을 때 직접 그 분을 가서 수정을 해줘야하기 때문에
코드의 재활용성이 떨어지고, 결합도가 높아졌다 라고도 할 수 있다
- 객체의 밖에서 객체를 넣어주는(주입) 것
public class BugService {
privateBugRepository bugRepository;
public BugService(BugRepository bugRepository) {
this.bugRepository = bugRepository;
}
public void countLeg(){
bugRepository.legCount();
}
}
이것을 분리형 배터리라고 할 수 있다
new를 이용해 객체를 생성하는 게 아니고
생성자의 매개변수에 다른 클래스를 넣어주면서 클래스를 가져오는것이다
이것을 "DI"라고 한다
이것은 "의존성을 주입받았다" 라고 할 수도 있고, "느슨한 결합"이라고도 한다
생성자를 이용해서 다른 객체를 주입받으면 결합도를 낮출 수 있다
BugService와 BugRepository를 Bean으로 등록을 했을 때
BugService의 생성자만 만들어주면
IoC 컨테이너라는 것이 BugRepository에 주입을 알아서 해준다
[IoC(Inversion of Control)]
- 제어권이 역전된 것
- 이전까지는 개발자가 코드의 흐름이나 제어의 주체였다면,
스프링에서는 프레임워크(컨테이너)가 주체가 됨
"DI랑 IoC와 같은 말인가..?" 라고 생각이 들었다
- 의존성을 주입하는 "일"을 DI
- 의존성을 대신 만들어주는 "상황"을 IoC
이렇게 이해했다
[IoC 컨테이너]
- 객체들을 담는 용기
- 컨테이너를 통해 등록된 빈(Bean)들은 시스템에서 사용 가능하다
* 빈(Bean): IoC 컨테이너가 관리하는 일반적인 객체
[IoC 컨테이너에 Bean 등록 방법]
1. @Component & @Autowired
@Component
public class Student {
@Autowired
private Pencil pencil;
public Student(){
System.out.println(”hi”);
}
}
클래스 위에 Component 어노테이션을 달아주고
빈으로 등록한 클래스를 불러오려면 AutoWired 어노테이션을 써주면 된다
@Controller, @Service, @Repository는 @Component를 상속받고 있기 때문에
위의 어노테이션을 적어주면 컨테이너에 자동으로 빈으로 등록됨
2. @Bean & @Configuration
@Configuration
public class ApplicationConfig {
@Bean
public ArrayList<String> array(){
return new ArrayList<String>();
}
}
클래스 위에 Configuration 어노테이션을 달아주고
Bean 어노테이션을 적어주면 컨테이너에 등록이 된다
"Bean 등록 방법이 왜 두 가지?"
- 둘의 용도가 다르다!
* @Bean
- 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용
ex: Spring Security
Spring Security에서 제공하는 PasswordEncoder는 Spring Security 개발자에 의해 만들어진 라이브러리이다
때문에 따로 수정하는것은 힘들다
PasswordEncoder를 사용하기 위해서는 스프링에 Bean으로 등록을 해야하는데
이 때 사용할 수 있는 방법이 @Bean 어노테이션을 이용한 등록 방법이다
* @Component
- 개발자가 직접 컨트롤할 수 있는 클래스에 사용
개발자가 컨트롤 할 수 있는 클래스는 개발자가 만든 클래스를 의미하며, 컨트롤러 등에 사용하는 클래스를 의미한다
그래서 @Configuration, @Controller, @Service, @Repository 등의 어노테이션들은 @Component을 포함하고 있다
* 참고
- https://cbw1030.tistory.com/54
- https://devlog-wjdrbs96.tistory.com/165
- https://ecsimsw.tistory.com/entry/Spring-IoC-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88
'항해99 3기' 카테고리의 다른 글
Spring Security) 비밀번호, 비밀번호 확인 입력 값 비교 안 됨 (0) | 2021.10.06 |
---|---|
[TIL] 2021.10.05 - 프로젝트 유효성 검사 (0) | 2021.10.05 |
[TIL] 2021.10.04 - 팀 내 발표, 개인 프로젝트 시작 (0) | 2021.10.04 |
[WIL] 항해99 3기 3주차 : Spring 심화 강의 (0) | 2021.10.03 |
[TIL] 2021.09.29 - 개인 프로젝트 마무리 (0) | 2021.09.29 |