HyeLog
김영한 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 템플릿 엔진 방식으로 나뉘는 것이다.
'웹 개발 > Spring Boot' 카테고리의 다른 글
[김영한_자바 ORM 표준 JPA 프로그래밍 - 기본편] 1. JPA 시작하기(1) (0) | 2022.06.07 |
---|---|
Spring Boot 이메일 인증 2가지 방법 (0) | 2022.05.13 |
Spring Boot 이메일 인증 구현 (0) | 2022.05.12 |
Spring Boot - OAuth2 소셜 로그인 (0) | 2022.03.12 |
Spring Boot - 트랜잭션(Transaction) 개념 및 사용법 (0) | 2022.03.12 |