이번 편의 목표: 스프링이 객체를 만들게 하고, 그 객체를 다른 클래스의 생성자로 받습니다.
자바 기초에서는 new로 객체를 만들었습니다. 스프링에서는 클래스를 빈으로 등록하면 컨테이너가 객체를 하나 만들고, 그 객체가 필요한 곳에 넣어 줍니다. 이 객체를 빈이라고 부릅니다.
빈으로 등록
com.thinktree.library 패키지에 Greeting.java를 추가합니다.
package com.thinktree.library;
import org.springframework.stereotype.Component;
@Component
public class Greeting {
public String hello() {
return "안녕하세요. 생각나무 스프링 부트입니다.";
}
}@Component는 이 클래스를 스캔해서 빈으로 만들라는 표시입니다. 서버가 뜰 때 Greeting 객체가 하나 만들어집니다.
생성자로 받기
HelloController.java도 같은 패키지에 추가합니다.
package com.thinktree.library;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
private final Greeting greeting;
public HelloController(Greeting greeting) {
this.greeting = greeting;
}
@GetMapping("/hello")
public String hello() {
return greeting.hello();
}
}생성자에 Greeting 매개변수가 있으면 스프링이 이미 만든 Greeting 빈을 넘겨 줍니다. new Greeting()을 컨트롤러에 적지 않습니다. 필드에 @Autowired를 붙이는 방식도 있지만, 이 연재는 생성자 주입만 사용합니다. 필요한 의존이 생성자 서명에 드러나고, 필드를 final로 둘 수 있습니다.
서버를 다시 실행한 뒤 브라우저에서 http://localhost:8080/hello 를 엽니다. 인사 문장이 보이면 빈 생성과 주입, 그리고 주소 연결이 한 번에 동작한 것입니다.
직접 해 보기
Greeting에 책 소개 문장을 반환하는 메서드를 추가하고, /hello 응답 뒤에 그 문장을 붙여 출력하세요.
해설
public String bookLine() {
return "오늘은 도서관 API를 만듭니다.";
}컨트롤러에서는 greeting.hello()와 greeting.bookLine()을 이어 반환합니다. Greeting을 컨트롤러에서 new로 만들 필요는 없습니다.
COMMENTS
댓글 0
이 글에 대한 의견이나 질문을 남겨 주세요.
댓글은 구글이나 카카오로 시작한 뒤에 남길 수 있습니다.
등록된 댓글이 없습니다.