HyeLog

김영한 Spring Boot 입문 - 13. Component Scan 본문

웹 개발/Spring Boot

김영한 Spring Boot 입문 - 13. Component Scan

shj718 2022. 3. 2. 16:21

스프링 빈 등록 방법 ① - 컴포넌트 스캔

(컨트롤러 내 의존성 주입에 대하여)

🫒빈(Bean)이란?

우리가 @Controller 어노테이션을 쓰면, 스프링은 시작할 때 해당 컨트롤러 객체를 만들어서 컨테이너에 집어넣는다. (Ex. HelloController 객체, MemberController 객체 등)

이때, 각 개체는 여러번 만들어질 수 있는게 아니라 딱 하나만 만들어질 수 있다.

 

처음 Controller를 배울 때, HelloController를 만들면서, Hello 객체를 그 안에서 새로 생성(new Hello();)했었는데, 사실 이런 방식으로 하면 너무 비효율적이다. MemberService 클래스의 메소드들은 Post나 Story나 Comment 등 매우 많은 컨트롤러에 쓰일텐데, 매번 이렇게 객체를 새로 생성하는 것은 안좋다.

 

그래서 🫒빈(Bean) 개념을 이용해서, 스프링 컨테이너 전체에 MemberService 객체를 딱 1개만 만들 것이다. (= 등록할 것이다.)

 

아래와 같이 매번 객체를 새로 생성하는 것은 안좋은 방식이다.

@Controller
public class MemberController {
    MemberService memberService = new MemberService();
    
    public MemberController(MemberService memberService) {
    	this.memberService = memberservice;
    }
}

이를 바꾸는 방법은 간단하다.

생성자(Constructor)위에 @Autowired 어노테이션을 붙여줘야 한다. 그러면 처음에 스프링이 컨트롤러 객체를 만들 때 멤버서비스도 딸려서 만들어진다.

이때! 중요한 것은 MemberService.java 파일의 MemberService 클래스 위에 @Service 가 있어야 한다.

(없으면, 스프링이 얘가 뭔지 인지하지 못한다.) 같은 원리로 MemberRepository.interface 파일의 해당 클래스도 @Repository 어노테이션을 주고, MemberService 안에서 @Autowired 걸어줘야, 스프링이 연결→연결 해서 객체를 생성해준다!

 

+ 주목할만한 점: MemberService안에서 MemoryMemberRepository(구현체)가 아니라 MemberRepository(인터페이스)에 @Autowired를 걸어주었다.

 

이게 스프링 빈 등록 방법 2가지 중 첫번째인 컴포넌트 스캔 방식이었다. 이때 주의할 것은 @Component 어노테이션을 아무데나 붙이면 되느냐? 그게 아니라, HelloSpringApplication(맨처음 시작하는곳)의 상위 폴더인 hello.hellospring의 하위 폴더에 있는 애들만 가능하다!

 

스프링 빈 등록 방법 ② - Java로 직접 코딩

SpringConfig이라는 새로운 파일 만들어서 직접 스프링 빈 등록.

 

스프링 부트 컨트롤러의 3가지 종류

API템플릿 엔진(Ex. Thymeleaf) 방식의 차이:

위에 @ResponseBody 어노테이션이 있는지 없는지에 따라 나뉜다.

템플릿 엔진 방식은 해당 어노테이션 없이 @GetMapping만 있고, return 값 (String)에 해당하는 템플릿(Ex. hello.html)을 보여준다.

반면에, API방식은 @GetMapping과 @ResponseBody 가 둘 다 있고, return 값이 String 타입일 수도 있고, 객체 타입일 수도 있다. 이때 String 타입이면, 진짜 그 String을 바로 보여주는 것이고, 객체 타입이면, JSON 형식(key, value 쌍)으로 객체의 멤버변수(필드)들을 보여준다.

 

이외에도 정적 컨텐츠 방식이 있다. 이건 고객 요청에 대한 컨트롤러가 없을 때 작동하는 것으로, static 패키지 내의 html 파일을 찾아서 보여주는 것이다.

 

항상 우선순위는 컨트롤러가 1등이다. 컨트롤러가 일단 있으면, 리턴값의 타입에 따라, 위에서 언급한 API 방식 OR 템플릿 엔진 방식으로 나뉘는 것이다.