김영한 Spring Boot 입문 - 13. Component Scan
스프링 빈 등록 방법 ① - 컴포넌트 스캔
(컨트롤러 내 의존성 주입에 대하여)
🫒빈(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 템플릿 엔진 방식으로 나뉘는 것이다.