Notice
Recent Posts
Recent Comments
관리 메뉴

Developer Gonie

[스프링 부트] 14. 스프링빈을 등록하는 방법1 본문

인프런 김영한님 강의/1 . 스프링 부트 입문

[스프링 부트] 14. 스프링빈을 등록하는 방법1

이대곤 2022. 6. 27. 17:16

스프링빈을 등록하는 2가지 방법

* 두가지 방법을 모두 알고 있어야 한다.

방법1. 컴포넌트 스캔과 자동 의존관계 설정

방법2. 자바 코드로 직접 스프링빈 등록하기

 

이번 게시물에서는 방법1 을 배워보고, 다음 게시물에서 방법2 를 배워본다.

 

 

MemberController가

MemberService를 통해 회원가입하고, 

MemberService를 통해 데이터를 조회할 수 있어야 한다.

이런 관계를 서로 의존관계가 있다 라고 표현하는데

MemberController가 MemberService에 의존한다라고 말한다.

이제 이 작업을 스프링 스럽게 해볼 것이다.

1. MemberController 클래스 추가

2. MemberController 클래스에 @Controller 어노테이션 부착

여기까지 해두면 기능은 아무것도 없지만

스프링이 실행되면 스프링 컨테이너라는 통이 생기는데

@Controller 어노테이션이 있으면

여기에 이 클래스의 객체를 자동으로 생성해서 그 통에 넣어두게 됨

3. MemberController에 MemberService 관련 멤버변수, 생성자 추가

MemberController가

MemberService를 통해 회원가입하고, MemberService를 통해 데이터를 조회할 수 있어야 하기 때문에

MemberService 관련 멤버변수 및 생성자를 추가해줌. 

4. MemberController의 생성자에 @Autowired 어노테이션 부착

스프링 컨테이너가 관리중인 MemberService 객체를 인자부분에 자동으로 연결되도록 함. 

5. MemberService 클래스에 @Service 어노테이션 부착

컨테이너가 4번의 작업을 정상적으로 하려면 MemberService의 객체가 스프링빈에 등록되어 있어야 하는데

이 어노테이션을 사용하면 해당 클래스의 객체를 스프링빈에 등록할 수가 있음

6. MemoryMemberRepository 클래스에 @Repository어노테이션 부착

??? 무슨의미지?

 

 

 

1. 클래스 + @Controller 어노테이션 ***

이 어노테이션은 클래스 이름 상단에 위치하게되며,

이게 클래스 정의 상단에 붙어있으면 내부에 코드가 아무것도 없을지라도

스프링이 실행되면 이 클래스의 객체를 자동으로 생성해서,

컨테이너라는 공간에 넣어두게 되고 이를 스프링이 관리하게 된다.

이걸 스프링 컨테이너에서 스프링 빈이 관리된다고 표현한다. 

 

스프링 컨테이너에 등록되게 하면 해당 클래스에 대해서 단 1개의 객체만 생성되어 공유되는 것이 특징이다.

 

이전에 HelloController 클래스 상단에도 @Controller 어노테이션이 붙어있었는데,

스프링 컨테이너에 해당 클래스의 객체가 자동으로 생성되어 관리되고 있었기 때문에

내부의 @GetMapping 어노테이션에 따라 url 별로 다른 화면을 던져준 것이 잘 동작하는 것이었음

package hello.hellospring.controller;

import org.springframework.stereotype.Controller;

@Controller
public class MemberController {
}

2. 생성자 + @Autowired어노테이션 ***

바로 위에서 컨테이너에 담아둘 클래스의 객체가 자동으로 생성되어 담긴다고 하였다.

그렇다면 이 클래스의 생성자가 호출될텐데, 이때 생성자의 인자로 다른 클래스의 객체를 받는 경우가 있을 것이다.

이때 스프링은 생성자 위에 @Autowired 어노테이면이 있다면

스프링 컨테이너에 존재하는 관리중인 객체들 중, 인자로 받아야 하는 객체를 찾아서 자동으로 연결해준다. 

아래에서는 스프링 컨테이너가 관리중인 객체중에 MemberService 타입의 객체가 자동으로 연결될 것으로 보인다.

단, 그 전에 스프링 컨테이너가 MemberService 클래스의 객체를 관리하도록 MemberService 클래스를 스프링빈에 등록해 뒀어야 자동 연결이 가능하다.

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;
    }
}

3. 일반 java 파일 + @Service어노테이션

이 어노테이션을 사용하면 해당 클래스의 객체를 스프링빈에 등록해 스프링 컨테이너가 관리하도록 한다.

바로위에서 빨간글씨로 언급한 부분인데, 이 방식이 일반 java 클래스를 스프링빈에 등록하는 첫번째 방법이다.

@Service
public class MemberService {
	...
}

4. 일반 java 파일 + @Repository어노테이션

 

Comments