💻 프로그래밍

Spring Boot

스프링 부트

Spring 프레임워크 기반의 자동 설정 Java 웹 애플리케이션 프레임워크. Convention over Configuration 철학으로 빠른 개발. 마이크로서비스와 REST API 구축의 표준.

📖 상세 설명

Spring Boot는 Spring 프레임워크를 기반으로 한 자동 설정(Auto-Configuration) Java 웹 애플리케이션 프레임워크입니다. 기존 Spring의 복잡한 XML 설정과 의존성 관리를 자동화하여, 개발자가 비즈니스 로직에 집중할 수 있게 합니다. "설정보다 관례(Convention over Configuration)" 철학을 따릅니다.

2014년 Pivotal(현 VMware)에서 처음 출시되었으며, 2026년 현재 Spring Boot 3.3.x가 최신 안정 버전입니다. Java 17+ 기반으로, Jakarta EE 10, GraalVM Native Image, Virtual Threads(Project Loom) 등 최신 Java 생태계를 지원합니다. 한국에서는 대기업 백엔드 시스템의 80% 이상이 Spring Boot를 사용합니다.

핵심 기능으로 Auto-Configuration(의존성 기반 자동 설정), Embedded Server(Tomcat, Jetty, Undertow 내장), Spring Boot Starter(의존성 그룹 패키지), Actuator(운영 모니터링), DevTools(핫 리로드)가 있습니다. application.yml/properties로 설정을 외부화하고, 프로파일로 환경별 설정을 분리합니다.

실무에서 Spring Boot는 마이크로서비스 아키텍처의 핵심입니다. Spring Cloud와 결합해 서비스 디스커버리(Eureka), API Gateway(Spring Cloud Gateway), 분산 추적(Zipkin/Sleuth), 설정 서버(Config Server)를 구축합니다. REST API, GraphQL, gRPC 엔드포인트 개발과 JPA/MyBatis 기반 데이터 접근 계층 구현에 표준으로 사용됩니다.

💻 코드 예제

// REST API 컨트롤러 예제 - Spring Boot 3.3
@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor  // Lombok: 생성자 주입
public class UserController {

    private final UserService userService;

    // GET /api/users
    @GetMapping
    public List<UserDto> getAllUsers() {
        return userService.findAll();
    }

    // GET /api/users/{id}
    @GetMapping("/{id}")
    public ResponseEntity<UserDto> getUserById(
            @PathVariable Long id) {
        return userService.findById(id)
            .map(ResponseEntity::ok)
            .orElse(ResponseEntity.notFound().build());
    }

    // POST /api/users
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public UserDto createUser(
            @Valid @RequestBody CreateUserRequest request) {
        return userService.create(request);
    }

    // DELETE /api/users/{id}
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteUser(@PathVariable Long id) {
        userService.delete(id);
    }
}
application.yml 예시
# Spring Boot 설정 파일
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: false

server:
  port: 8080

# Actuator (운영 모니터링)
management:
  endpoints:
    web:
      exposure:
        include: health,metrics,prometheus

🗣️ 실무 대화 예시

💬 회의에서: Spring Boot vs Node.js 기술 선정

"신규 프로젝트 백엔드를 Spring Boot로 가겠습니다. Node.js가 빠른 프로토타이핑에 좋지만, 우리 팀 대부분이 Java 경험이 많고, 엔터프라이즈 레벨의 트랜잭션 관리와 보안 기능이 필요합니다. Spring Security, JPA의 성숙도를 고려하면 장기적으로 유지보수가 더 수월할 겁니다."

💬 면접에서: 스프링 빈 스코프

"Spring Bean의 기본 스코프는 Singleton으로, 애플리케이션 컨텍스트 내에서 하나의 인스턴스만 존재합니다. Prototype 스코프는 요청마다 새 인스턴스를 생성하고, Request/Session 스코프는 웹 환경에서 HTTP 요청이나 세션 단위로 빈을 관리합니다. 실무에서 상태를 가진 빈은 Prototype이나 Request 스코프로 설정해 스레드 안전성을 확보합니다."

💬 코드 리뷰에서

"@Autowired 필드 주입 대신 생성자 주입으로 바꿔주세요. 생성자 주입은 불변성을 보장하고, 순환 참조를 컴파일 타임에 잡을 수 있어요. Lombok의 @RequiredArgsConstructor를 쓰면 보일러플레이트도 줄일 수 있습니다."

⚠️ 주의사항

1
자동 설정(Auto-Configuration) 이해 필수

Spring Boot의 "마법"에 의존하면 디버깅이 어렵습니다. @ConditionalOnClass, @ConditionalOnProperty 등 자동 설정 조건을 이해하고, 문제 발생 시 spring.boot.autoconfigure.exclude로 특정 설정을 제외하는 방법을 알아두세요. --debug 플래그로 자동 설정 리포트를 확인할 수 있습니다.

2
성능 튜닝: 시작 시간 & 메모리

Spring Boot 애플리케이션은 초기 로딩에 시간이 걸립니다. 컨테이너 환경에서 빠른 스케일링이 필요하면 GraalVM Native Image(Spring Native)를 고려하세요. JVM 힙 사이즈(-Xmx)를 적절히 설정하고, 불필요한 Starter 의존성은 제거합니다.

3
의존성 버전 관리

Spring Boot Starter Parent가 관리하는 버전을 임의로 오버라이드하면 호환성 문제가 발생합니다. 버전 충돌 시 spring-boot-dependencies BOM을 확인하고, dependencyManagement로 일관된 버전을 유지하세요. 정기적으로 Dependabot이나 Renovate로 의존성을 업데이트합니다.

🔗 관련 용어

📚 더 배우기