이번 편의 목표: 스프링이 객체를 만들게 하고, 그 객체를 다른 클래스의 생성자로 받습니다.

자바 기초에서는 new로 객체를 만들었습니다. 스프링에서는 클래스를 빈으로 등록하면 컨테이너가 객체를 하나 만들고, 그 객체가 필요한 곳에 넣어 줍니다. 이 객체를 빈이라고 부릅니다.

빈으로 등록

com.thinktree.library 패키지에 Greeting.java를 추가합니다.

Java
package com.thinktree.library;

import org.springframework.stereotype.Component;

@Component
public class Greeting {
    public String hello() {
        return "안녕하세요. 생각나무 스프링 부트입니다.";
    }
}

@Component는 이 클래스를 스캔해서 빈으로 만들라는 표시입니다. 서버가 뜰 때 Greeting 객체가 하나 만들어집니다.

생성자로 받기

HelloController.java도 같은 패키지에 추가합니다.

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 응답 뒤에 그 문장을 붙여 출력하세요.

해설

Java
public String bookLine() {
    return "오늘은 도서관 API를 만듭니다.";
}

컨트롤러에서는 greeting.hello()와 greeting.bookLine()을 이어 반환합니다. Greeting을 컨트롤러에서 new로 만들 필요는 없습니다.