스프링 빈 등록과 의존성 주입

유정현·2023년 12월 15일

빈, 스프링 컨테이너, 의존성 주입

스프링에서는 의존성을 주입하는 것이 매우 간단하다. 의존성을 빈으로 등록하면 스프링 컨테이너는 이 빈들을 관리한다. 그리고 우리가 의존성을 주입하고 싶은 곳에 "여기 주입해줘~"라고 하면 주입해준다. 나중에는 컨테이너의 크기나 작동원리도 알아야 겠지만, 지금은 딱 사용하는 방법만 정리해본다.

Bean 등록하기

  1. 컴포넌트 스캔을 이용한 방법 ( @Component, @Controller... )
    특정 클래스를 개발하고 선언부 바로 위에 @Component라는 것을 달아주면 스프링은 알아서 해당 클래스를 빈으로 등록한다. 그리고 우린 필요한 곳에서 주입해서 쓰면 된다.

  2. 자바코드로 설정하는 방법 ( @bean 활용 )
    자바코드로 설정하는 것은 설정파일을 만들어야 한다. 설정파일을 만들면 좋은 점은 의존성을 여러가지를 두고 교차로 사용하고 싶을 때 해당 파일 하나만 수정하면 된다는 장점이 있다.

컴포넌트 스캔

아래와 같이 해당 클래스 선언부 바로 위에 @Component나 특정 어노테이션을 달아주면 된다. 확인하고 싶으면 @Controller 어노테이션 정의 코드를 보면 @ComponentScan 어쩌구 하는 어노테이션이 달려있다.
@Controller
public HomeController{
	.... 
}

-----------------------------------------------------

@Service
public HomeService{
	.....
}

자바 코드로 Bean등록

이건 Configuration 어노테이션을 활용하는 방법이다. 여기서 내가 Bean으로 등록하고싶은 생성자를 반환하는 메소드를 만들어주고, @Bean을 붙여주면 해당 의존성을 편하게 주입받을 수 있다.
@Configuration
public SpringConfig {
	@Bean 
    public homeService(){
    	return new HomeService();
    }
}

DI

DI는 약 세 가지 종류가 있다. 필드주입, 세터주입, 생성자 주입이다.

필드주입은 지양하는 분위기인데 테스트코드 같은 곳에선 편하게 쓰면 될 것 같다.

public class HomeController {
	@Autowired
	MemberService memberService;
}

세터주입은 말 그대로 세터를 사용하는 건데 특수한 경우가 아니면 이것도 그다지 많이 쓰지는 않는다고 한다.

public class HomeController {

	HomeService homeService;
	
	@Autowired
	public void setService(HomeService homeService) {
		this.homeService = homeService;
	}
}

생성자 주입이 가장 많이 쓰인다. 내 생각에도 가장 일반적이고 깔끔한 느낌이 든다. 사실 난 필드주입 쓰고싶다.

public Class HomeController{
	HomeService homeService;
    @Autowired
    public HomeContorller (HomeService homeService){
    	this.homeService = homeService;
    }
}

마무리

스프링을 안 써본게 아니다. 나름 프로젝트도 두 세 번 해보고, 유지보수도 잠깐 해보고 그랬다. 이런 내가 사용하지 않았던 부분들을 정리를 해야지 하면서 늘 안 하고 뒷전으로 했는데 이러면 안된다는 걸 이제 알았다. 차근차근 다시 꼭꼭 씹으면서 이해하고 공부해 나가야겠다.
profile
코딩하는 감자입니다.

0개의 댓글