Spring과 Boot가 나누어 맡는 일
Spring Framework와 Spring Boot는 경쟁하는 두 기술이 아닙니다. Spring Framework가 객체의 생성과 연결, 웹 요청 처리 같은 기반을 제공하고, Spring Boot는 그 기능을 바로 실행할 수 있도록 합리적인 기본값과 실행 도구를 얹습니다.
이 차이를 먼저 알아 두면 @SpringBootApplication을 마법처럼 외우지 않게 됩니다. 어떤 객체가 우리 코드인지, 어떤 객체를 Spring 컨테이너가 관리하는지, 어떤 설정을 Boot가 조건에 따라 보태는지 구분할 수 있기 때문입니다.
프레임워크가 애플리케이션의 조립을 맡는다
Spring 컨테이너는 등록된 정의를 바탕으로 객체를 만들고 필요한 협력자를 연결합니다. 이렇게 컨테이너가 관리하는 객체를 Bean이라고 부릅니다. 애플리케이션 코드는 Bean 사이의 업무 규칙과 HTTP 계약을 맡고, Boot는 클래스패스와 설정을 살펴 웹 서버와 JSON 변환기 같은 기반 Bean을 조건부로 준비합니다.
따라서 문제가 생겼을 때도 책임별로 살필 수 있습니다. 객체가 만들어지지 않았다면 컨테이너 등록과 의존성을, 서버가 시작되지 않았다면 Boot의 자동 설정 조건을, 잘못된 응답이 왔다면 애플리케이션의 Controller와 서비스 코드를 확인합니다.
한 요청을 끝까지 통과시키는 최소 애플리케이션
먼저 별도 XML이나 서버 설치 없이 실행되는 가장 작은 HTTP 애플리케이션을 만듭니다. 진입점은 컨테이너를 시작하고, Controller는 /api/welcome 요청의 응답만 책임집니다.
package com.andongmin.studylog;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StudyLogApplication {
public static void main(String[] args) {
SpringApplication.run(StudyLogApplication.class, args);
}
}package com.andongmin.studylog;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class WelcomeController {
@GetMapping("/api/welcome")
Map<String, String> welcome() {
return Map.of("service", "study-log", "status", "ready");
}
}@SpringBootApplication에는 구성 클래스 선언, 컴포넌트 탐색, 자동 설정 활성화가 합쳐져 있습니다. 이 클래스가 있는 com.andongmin.studylog 아래를 기본 탐색 범위로 삼으므로 WelcomeController도 Bean으로 발견됩니다. @RestController는 반환값을 뷰 이름이 아니라 HTTP 응답 본문으로 직렬화하도록 지정합니다.
시작 로그와 HTTP 응답에서 경계를 확인한다
서버는 실행 중인 프로세스이므로 요청 명령과 같은 터미널에 연달아 입력할 수 없습니다. 첫 번째 터미널에서 애플리케이션을 실행하고, 시작 로그에 포트 8080이 표시된 뒤 두 번째 터미널에서 요청합니다.
./mvnw -q spring-boot:runcurl -i http://localhost:8080/api/welcomeHTTP 200과 `{"service":"study-log","status":"ready"}` 응답이 함께 보여야 합니다.404라면 서버 자체보다 URI와 Controller 탐색 범위를 먼저 확인합니다. 연결이 거부된다면 HTTP 계층에 도달하기 전이므로 시작 로그와 사용 중인 포트를 확인해야 합니다. 같은 실패라도 조사할 위치가 다릅니다.
이제 이 코드를 다른 컴퓨터에서도 같은 버전으로 빌드할 수 있도록 Java와 Maven 기준을 프로젝트 안에 고정합니다.