Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Spring Bean과 의존관계(@Component 스캔) 본문

Spring Boot

Spring Bean과 의존관계(@Component 스캔)

Seung__ 2021. 7. 22. 21:44

스프링 빈을 등록하는 방법은 두 가지가 있다.

  - 컴포넌트  스캔 & 자동 의존관계 설정

  - 자바 코드로 직접 

 

먼저 컴포넌트 스캔에 대하여 알아보자.

 

1) 컴포넌트(@Component) 스캔과 자동 의존관계 설정 

 

   @Controller, @Service, @Repository 등은 모두  @Component

   

   컴포넌트 스캔은  스프링이 시작될 때 @Component붙은 클래스를 bean으로 등록!
   

   스프링은 컨테이너에 빈을 등록할 때 싱글톤으로 등록. 따라서 유일한 인스턴스 존재.

   

   @Autowired의 역할을 해당 bean들을 필요한 곳에 연결시키는 역할을 함.

 

 

 

1. @Controller


@Controller
public class MemberController {
}

 

스프링이 처음 뜰 때 스프링 컨테이너가 생김 이 때,

 

@Controller가 붙어있으면  객체를 만들어서 스프링 컨테이너에 넣어둠.

 

그리고 스프링이 그 객체를 관리함.(bean으로 등록)

 

일반적으로 인스턴스를 만들 때 아래처럼 new를 통해 직접 생성하여 사용할 수 있다.

@Controller
public class MemberController {

    private final MemberService memberService = new MemberService();
}

하지만 스프링에서 관리하게 되면, 스프링 컨테이너에 등록이 되고, 컨테이너에서 받아 쓰도록 바꿔야 한다.

 

만약 MemberService를 여러 controller에서 사용한다고 가정해 보자.

 

Service는 현재 별 기능이 없어서 한 번만 만들어서 같이 사용하면 되는데,

각 controller에서 매 번 생성하여 사용하기는 비효율적이다.

 

자 그러면 Spring 컨테이너에 등록을 하고 받아서 사용해 보자.

(컨테이너에는 하나씩만 등록이 가능하다. 싱글톤...!)

 

 

2. @Autowired


@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

위와같이 Contstructor를 생성하고 @Autowired를 붙여주자. 그럼 어떻게 진행되냐.?

  • 스프링 시작
  • 스프링 컨테이너 생성
  • MemberController 객체 생성될 때! 
  • 스프링이 컨테이너에 있는 MemberService객체와 연결시켜야 하느데..?  등록돼있어야 하는데..?
  • 따라서 MemberService는 @Service로 스프링 bean으로 등록
    @Service
    public class MemberService {
    
        private final MemberRepository memberRepository;
    
        //repository를 직접 생성하는 것이 아니라, 외부에서 넣어주도록 변경.
        //MemberService입장에서 외부에서 Repository를 주입받음 = Dependancy Injection(DI)
        @Autowired
        public MemberService(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
  • @Service가 붙어있으면 스프링이 뜰 때 얘도 컨테이너에 등록됨.
  • 그런데 MemberService 객체가 생성되려면 @Autowired를 통해 MemberRepository도 커네이너에서 가져와야함.
  • 주입되는 객체는 MemberRepository의 구현체인 MemoryMemberRepository이다!
  • Repository는 @Repository로 bean으로 등록 가능, 
    @Repository
    public class MemoryMemberRepository implements MemberRepository{​

 

 

@Controller, @Service, @Repository를 붙여주면 스프링이 뜰때 해당 객체를 싹 컨테이너에 등록을 한다.

 

 

2. Spring Bean을 등록하는 방법


1) 컴포넌트(@Component) 스캔과 자동 의존관계 설정 

   @Controller, @Service, @Repository 모두 @Component

   스프링이 시작될 때 @Component붙은 클래스를 bean으로 등록!
  @Autowired를 통해 해당 bean들을 연결시킨다.


  -->  웬만한 것은 bean으로 등록하고 사용해야 이점이 많다.

 

 

 스프링은 컨테이너에 빈을 등록할 때 싱글톤으로 등록. 따라서 유일한 인스턴스 존재.

 

2) 자바 코드로 직접(다음에 ㅎ) 

 

3. GitHub : 210722, Component scan, DI


 

 

GitHub - bsh6463/SpringBootClass

Contribute to bsh6463/SpringBootClass development by creating an account on GitHub.

github.com

 

 

Comments