Spring Container
: 객체간의 의존성을 낮추기 위해 사용
객체 관리를 주로 수행하며 빈의 생성, 관계, 사용, 생명 주기 등을 관장한다. 객체를 사용하기 위해 new생성자나 인터페이스 호출, 팩토리 호출 방식을 이용했지만 하나의 어플리케이션에는 이렇게 만들어진 무수한 객체가 존재하고 객체들은 서로 참조하고 있다. 참조의 정도가 심할 수록 의존성이 높다고 말하며 객체 지향 프로그래밍(OOP)에서 높은 의존성은 OOP의 특성과는 거리가 멀다. 따라서 의존성을 제어하기 위해 스프링 컨테이너를 사용한다.
<참고>
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱클톤으로 등록한다. 따라서 같은 스프링 빈이면 모두 같은 인스턴스임
컴포넌트 스캔은 @Component 어노테이션을 통해 빈을 추가하는 방식이다. Class 위에 @Component를 붙이면 스프링이 알아서 스프링 컨테이너에 빈을 등록한다.
@Component는 Class 혹은 Interface에만 붙일 수 있다
❗ @Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록된다.
- @Controller
- @Service
- @Repository
생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입한다. 만약 생성자가 1개만 있다면 @Autowired는 생략할 수 있음
// 예시코드
package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
// 코드 출처 : 인프런 스프링부트입문-김영한
Class에 @Configuration 어노테이션을 붙이고 빈을 등록하기 위해 인스턴스를 생성하는 메소드 위에 @Bean 어노테이션을 붙인다.
@Bean은 메소드나 어노테이션에만 붙일 수 있고, 클래스에는 붙일 수 없고, @Configuration 또한 @Component를 포함한다.
// 예시 코드
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
// 코드 출처 : 인프런 스프링부트입문-김영한