의존성 주입, 외부 객체를 주입하는 것, 즉 new 생성을 마구잡이로 안하고 동일 객체를 사용한다
예시코드
public class MemberService {
...
}
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
Controller에 Service를 객체를 외부에서 가져온다.
스프링이 스프링 컨테이너에서 해당 빈을 찾아서 주입한다.
위의 코드에서 @AutoWired를 통해 memberController → memberService 와 같이 연결한다.
그럼 개발자가 직접 의존성을 주입하는 것과 @AutoWried 사용해서 주입하는 것에 차이는 무엇일까?
@AutoWried를 설정해둔 메서드가 자동으로 호출되고 인스턴스가 자동으로 주입된다.
따라서 개발자는 빈을 명시적으로 주입 코드를 작성하지 않아도 된다.
→ 시간 절약, 간결성, 유연성등등이 높아짐
위의 코드에서 @AutoWried를 사용하면 아마 오류가 날 것이다
이유는
빈등록 X → @AutoWried 수행 → 빈 찾을 수 없음 → 오류발생
바로 @Component 를 사용해서 스프링 컨테이너에 빈을 등록하면 된다.
이때 빈은 Singleton pattern으로 관리한다.
@Service
public class MemberService {
...
}
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
스프링 컨테이너에 해당 빈이 들어가서 이제는 오류가 발생하지 않을 것이다.
근데 왜 @Component를 사용하지 않고 @Service, @Controller 를 사용할까 ?
Controller의 어노테이션을 보면 @Component 가 이미 포함되어 있다
따라서 controller 역할에 맞게 더욱 잘 수행할 수 있는 @Controller를 사용하는 것이다
Service도 마찬가지!!
DI에 대해서 알아보았다.