컴포넌트 스캔으로 의존관계 설정

2024. 5. 13. 13:52스프링

반응형

스프링에서 각 객체를 스프링컨테이너에 빈으로 등록해서 이중에 필요로하는 객체에서 빈을 가져다가 사용한다. 그렇게 하려면 객체를 빈으로 등록해줘야 한다. 빈으로 등록하는 방법중에서 컴포넌트 스캔 방법을 알아보자.

package groupInfo.study.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import groupInfo.study.service.MemberService;

//@Controller 어노테이션을 넣으면 MemberController 객체를 생성해서 스피링에 넣어두고 관리한다.
//스프링 컨테이너에서 빈이 관리되는것
@Controller
public class MemberController {
	
	//여기 컨트롤러에서 서비스를 가져다가 멤버를 생성하거나 멤버를 조회하거나 등등 작업을 수행한다.
	//따라서 컨트롤러는 서비스를 의존하는 의존관계인 것이다.
	//MemberService를 가져다가 쓸건데 new로 객체를 생성해서 가져다가 쓰면 매번 새로운 객체가 생성된다.
	//MemberCongroller 뿐만 아니라 다른 controller에서도 new 로 MemberService를 생성해서 사용하면
	//쓸데없이 객체가 많이 생성되어 메모리 낭비도 심할거다. 
	//private final MemberService memberService = new MemberService();
	
	
	//아래는 생성자로 MemberController 객체가 생성될때 MemberService를 가져와서 변수에 담아준거다.
	//Autowired는 스프링이 관리하는 빈중에서 MemberService 객체인 것을 가져다가 MemberController에 넣어준거다.
	//이렇게 스프링이 관리하는 빈을 사용하는곳에 가져다가 주입시켜 주는걸 의존성 주입이라고 부른다.
	//스프링이 관리하는 빈이 되려면 MemberService에 @Service 어노테이션을 붙여야 한다. 
	//MemberController가 @Controller 어노데이션을 통해 스프링이 관리하는 빈이 된것처럼 서비스에는 @Service 를 붙여줘야 
	//스프링이 관리하는 빈이되어 의존성 주입이 가능하게 된다. 레파지토리 클래스는 @Repository 어노테이션을 붙여준다.
	private final MemberService memberService;
	
	//애플리케이션이 실행될때 스프링은 @Controller, @Service, @Repository 와 같은 어노테이션이 붙은
	//클래스를 생성하여 빈으로 등록을 해야한다. 따라서 애플리케이션이 실행될때 생성자가 호출된다.
	//생성자에 @Autowired가 있으면 스프링은 생성자의 파라미터에 있는 객체가 필요한걸 인식하고 해당 객체를 주입해준다.
	@Autowired
	public MemberController(MemberService memberService) {
		this.memberService = memberService;
	}
	
	
	//스프링빈을 등록하는 방법
	/*
	 1) 컴포넌트 스캔
	 	@Controller, @Service, @Repository를 Ctrl 누른 상태에서 클릭해봐라 그럼 전부 @Component 어노테이션이 있다.
	 	스프링은 이 @Component 어노테이션이 있는 클래스들을 객체를 다 하나씩 생성해서 스프링 컨테이너에 등록한다.
	 	우리가 스프링 프로젝트를 만들면 실행할 수 있는 "프로젝트이름 + Application.java" 이름의 클래스가 있다. 이 java 파일이
	 	있는 패키지의 하위 경로부터 컴포넌트 스캔을 한다. 만약 하위가 아닌 실행되는 application 클래스와 같은 패키지 경로에 있거나 위에 
	 	있으면 @Component 어노테이션이 있어도 빈으롣 등록이 안된다. 
	 2) 자바 코드로 스프링빈 등록
	 
	 
	 참고) 스프링 컨테이너에 등록된 객체들은 기본적으로 싱글톤으로 관리된다. 스프링 컨테이너에 빈으로 등록될때 객체가 생성되고 이렇게 한번 생성된
	  	 객체를 공유한다. 더이상 객체를 더 생성해서 주입하지 않는다. 이렇게 하면 메모리 절약 효과가 있다. 따라 다른 설정을 하면 싱글톤 방식이 
	  	 아니게 할 수 있는데 대부분 싱글톤을 사용한다.
	 */
		

}
반응형