티스토리 뷰

Spring

[Spring] Spring Boot

토랑 2025. 3. 11. 19:33

Spring Boot

개요

  • 스프링 프레임워크(Spring Framework)를 보다 쉽게 사용할 수 있게 해주는 확장 프레임워크
  • 기존의 Spring 기반 개발에서 필요했던 복잡한 설정이나 반복 코드를 최소화하고, 관례에 따른 자동 설정편리한 스타터(Starter) 의존성을 제공하여 개발 생산성을 높여줌
스프링 부트로 만든 애플리케이션은 독립 실행형(stand-alone) JAR로 패키징되어 별도의 WAS에 배포하지 않고도 바로 실행할 수 있으며(내장 서버 제공), 마이크로서비스 아키텍처에도 잘 맞음


특징

자동 설정(Auto Configuration)

  • Spring Boot의 가장 큰 특징은 자동 설정
  • 애플리케이션에 포함된 의존성(JAR 라이브러리)들을 참고하여, 관련된 스프링 빈(bean)이나 설정을 자동으로 구성해줌
    • 예를 들어, HSQLDB와 같은 데이터베이스 라이브러리를 추가하면, 별도 설정이 없을 경우 자동으로 임베디드(in-memory) 데이터베이스를 생성해주는 식
  • 개발자는 필요한 라이브러리만 추가하면 기본적인 설정은 Spring Boot가 알아서 처리해주므로, 보일러플레이트(boilerplate) 코드를 줄일 수 있음

내장 웹 서버(Embedded Server)

  • Spring Boot 애플리케이션에는 톰캣(Tomcat)이나 제티(Jetty), 언더토우(Undertow)와 같은 웹 서버가 내장되어 있음
  • 웹 애플리케이션을 만들 때 별도로 WAR 파일을 만들어 외부 Tomcat 등에 배포하지 않고도, 내장 톰캣이 포함된 JAR 파일을 실행함으로써 바로 애플리케이션을 구동할 수 있음
  • 기본 포트는 8080이며, 필요에 따라 application.properties(또는 application.yml)에서 server.port와 같은 설정으로 쉽게 변경할 수 있음
  • 내장 서버 덕분에 배포 단계를 단순화하고, 마이크로서비스처럼 독립적으로 실행되는 서비스 개발이 수월해짐

독립 실행형 애플리케이션

  • Spring Boot로 빌드한 애플리케이션은 별도의 설치나 서버 컨테이너 없이 바로 실행 가능한 Fat JAR(모든 필요한 라이브러리를 포함한 JAR) 형태로 만들어짐
  • JAR 파일만 있으면 java -jar로 어디서든 실행할 수 있기 때문에, 배포와 실행이 매우 간편함
    • Docker와 같은 컨테이너 환경에서도 쉽게 이미지로 만들어 배포하기 좋음

Opinionated Configuration (의견을 가진 기본 설정)

  • Spring Boot“관례에 따른 간편한 설정” 철학을 가지고 있음
  • 스프링 프로젝트에서 일반적으로 사용하는 라이브러리와 설정의 조합을 미리 최적의 기본값으로 제공함
  • 이러한 Opinionated Defaults 덕분에 개발자가 하나하나 세부 설정을 고민하지 않아도 권장되는 설정 값들이 자동 적용됨 (물론, 필요한 경우 application.properties 등을 통해 사용자가 설정을 덮어쓰는 것도 가능)

시작 프로젝트 템플릿 제공

  • Spring BootSpring Initializr 같은 도구를 통해 스타터 프로젝트를 손쉽게 생성할 수 있음
  • 웹 사이트나 IDE의 내장 기능으로 Initializr를 사용하면 필요한 모듈 선택만으로 기본 프로젝트 구조와 빌드 설정(pom.xml 또는 build.gradle)을 자동으로 생성해줌

프로덕션 준비 기능

  • Spring Boot에는 Actuator와 같은 모듈을 통해 애플리케이션의 모니터링, 측정(metric), 헬스체크 등을 바로 사용할 수 있는 기능이 내장되어 있음
  • 별도 설정을 통해 애플리케이션의 상태나 각종 지표를 손쉽게 노출하고 관리할 수 있어 운영 환경(프로덕션)에서도 유용
  • 그 밖에도 기본적인 로깅 설정(Logback), 에러 페이지 처리, Configuration Properties를 이용한 외부 설정 주입 등 실무에 필요한 편의 기능들을 기본 제공

장점

빠른 개발 생산성

  • Spring Boot초기 셋업 시간을 크게 단축시켜주고, 반복적인 설정이나 장황한 설정 파일(XML)을 없앰으로써 개발에 집중할 수 있게 해줌
  • 필요한 기능이 있으면 그에 맞는 Starter 의존성만 추가하면 되고, 바로 동작하는 상태로 만들어주기 때문에 프로토타이핑과 개발 속도가 빨라짐

설정 간소화 & 최소화

  • 전통적인 Spring Framework개발할 때는 스프링 컨테이너 설정, Bean 등록, MVC 설정 등을 위해 많은 XML 또는 Java Config를 작성해야 했음
  • Spring Boot에서는 대부분의 설정을 자동으로 해주고, 필요한 속성만 application.properties 등에 작성하면 되므로 설정이 매우 간소화됨
  • Zero XML 구성과 적은 양의 자바 설정만으로 애플리케이션 구성이 가능하며, 기본적으로 합리적인 디폴트 설정이 적용되므로 초기 실행이 쉽게 이루어짐

마이크로서비스 친화적

  • Spring Boot로 만든 애플리케이션은 경량 서비스로서 독립적으로 실행 및 배포가 가능
    • 내장 웹서버를 통해 각각의 서비스가 자체적으로 동작하므로, 마이크로서비스 아키텍처에서 각 서비스들을 손쉽게 나누어 배포할 수 있음
    • 또한 Spring Cloud 등과 연계하여 마이크로서비스 환경에서 필요한 구성(discovery, config server 등)을 쉽게 붙일 수 있어 확장이 용이
  • 즉, 마이크로서비스 개발에 최적화된 생태계를 제공

일관된 환경과 버전 관리

  • Spring Boot부모 POM(dependency management)을 통해 호환되는 라이브러리 버전들이 미리 관리되므로, 개별 라이브러리 버전 충돌을 걱정할 필요가 적음
    • 예를 들어, Spring Boot 버전에 맞춰 Spring Framework, Spring Data JPA, Tomcat 등의 호환 버전이 알아서 지정되며, 스타터를 통해 추가된 라이브러리 간 버전 충돌도 최소화함으로써 이는 개발과 빌드 시 안정성을 높여짐

풍부한 커뮤니티와 자료

  • Spring Boot는 현재 가장 인기 있는 Java 기반 웹 프레임워크 중 하나로, 커뮤니티와 문서가 매우 풍부함
  • 공식 문서도 잘 갖춰져 있고, 문제 발생 시 StackOverflow나 블로그 등에 자료가 많아 학습 곡선이 비교적 완만함
  • 또한 스타터를 통한 표준화된 구성 덕분에 팀원 간에 프로젝트 구조나 설정에 대한 이해 공유가 용이

테스트 및 확장 용이

  • Spring Boot내장형으로 동작하기 때문에 단위 테스트나 통합 테스트 시에 별도 WAS 설정 없이 애플리케이션을 구동하여 테스트할 수 있음
    • spring-boot-starter-test에는 JUnit, Spring Test 컨텍스트, Mockito 등이 포함되어 있어 테스트 작성도 수월함
    • 또한 필요에 따라 자동 구성을 일부 배제하거나 커스터마이징하여 확장 가능하며, 기존 Spring과의 호환도 유지되어 기존 코드를 손쉽게 마이그레이션할 수 있음

Starter Dependencies 개념 및 사용법

  • Spring Boot생산성을 높이는 비결 중 하나는 바로 Starter Dependencies (스타터 의존성)
    • 스타터(Starter)특정 기능에 필요한 여러 라이브러리들을 하나의 의존성으로 묶어놓은 패키지임
    • 복잡한 의존성을 일일이 관리하지 않고, 필요한 기능에 맞는 스타터만 추가하면 관련된 라이브러리와 기본 설정을 모두 가져올 수 있도록 설계되어 있음
  • 예를 들어, spring-boot-starter-web 하나만 추가하면 웹 애플리케이션에 필요한 Spring MVC, 내장 톰캣, Jackson (JSON 변환) 등의 라이브러리가 모두 포함되고, 웹 MVC에 필요한 기본 Bean 설정도 자동으로 이루어짐
  • 마찬가지로 spring-boot-starter-data-jpa를 추가하면 Spring Data JPA, Hibernate (ORM), 그리고 H2 같은 내장 DB 드라이버까지 함께 포함되어 JPA 설정을 자동으로 해줌
  • 스타터를 추가하는 것만으로 해당 스택에 대한 기본 설정 Bean들을 자동 등록해주므로, 개발자는 비즈니스 로직 구현에만 집중할 수 있음

Starter 사용 방법

  • Maven이나 Gradle 설정에 원하는 Starter를 의존성으로 추가하면 됨
  • 예를 들어 Maven 프로젝트의 pom.xmlWebJPA 스타터를 추가하려면 다음과 같음
<dependencies>
    <!-- Web Starter: Spring MVC + Embedded Tomcat 등 포함 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>3.1.0</version> <!-- 예시 버전 -->
    </dependency>
    <!-- Data JPA Starter: Spring Data JPA + Hibernate 등 포함 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>3.1.0</version>
    </dependency>
    <!-- 필요에 따라 추가적인 스타터들... -->
</dependencies>
Gradle을 사용하는 경우엔 implementation 'org.springframework.boot:spring-boot-starter-web:3.1.0' 과 같은 형태로 추가

주요 스타터

  • spring-boot-starter-web: 웹 애플리케이션 (Spring MVC + 내장 톰캣 + Jackson 등)
  • spring-boot-starter-data-jpa: 데이터베이스 접근 (Spring Data JPA + Hibernate + JDBC 등)
  • spring-boot-starter-security: Spring Security (보안/인증 기능)
  • spring-boot-starter-test: 테스트 (JUnit, Spring Test, Mockito 등 포함)
  • spring-boot-starter-thymeleaf: 서버사이드 템플릿 엔진 Thymeleaf 지원
  • spring-boot-starter-webflux: 리액티브 웹 애플리케이션 (Spring WebFlux + Netty 등)
  • spring-boot-starter-actuator: 모니터링과 관리용 Actuator 기능 (health check, metrics 등)
필요한 기능에 따라 이러한 스타터들을 선택하여 pom.xml 또는 build.gradle에 추가하면, 관련 설정과 빈들이 자동으로 설정됨
예를 들어 spring-boot-starter-security를 추가하면 기본적인 웹 시큐리티 설정(모든 경로에 인증 요구 등)이 자동 적용되고, spring-boot-starter-actuator를 추가하면 /actuator/health 등의 엔드포인트가 활성화되는 식
Tip
스타터를 이용하면서 필요 없는 라이브러리가 포함되거나 기본 설정을 바꾸고 싶을 때는, 의존성을 개별적으로 추가/제거하거나 자동 설정을 제외(Exclusion)할 수도 있음
하지만 기본 제공되는 설정을 그대로 활용하면서 필요한 부분만 덮어쓰는 것이 Spring Boot의 철학이므로, 처음에는 스타터가 제공하는 대로 활용하고 점진적으로 커스터마이징하는 것이 좋음

Spring Boot 스타터 사용 예제

  • 여기서는 spring-boot-starter-webspring-boot-starter-data-jpa를 사용하여 REST API와 DB 연동 기능을 간략히 구현
    • 예제를 따라하기 위해서는 Maven/Gradle에 해당 스타터와 H2 데이터베이스 드라이버(com.h2database:h2)를 추가했다고 가정

기본 애플리케이션 및 웹 기능 예제

  • 먼저 Spring Boot 애플리케이션의 시작 클래스와 간단한 REST 컨트롤러를 만들어 봄
  • spring-boot-starter-web을 추가했다면, 아래와 같은 메인 클래스와 컨트롤러 정의만으로 웹 서버가 구동되고 HTTP 요청을 처리할 준비가 됨
// DemoApplication.java (메인 애플리케이션 클래스)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication  // @Configuration + @EnableAutoConfiguration + @ComponentScan 결합 애노테이션
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
// HelloController.java (REST 컨트롤러 예제)
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

JPA 데이터 연동 예제

  • spring-boot-starter-data-jpa를 활용하여 간단한 JPA 엔티티와 리포지토리를 만드는 예시
  • 이 예제에서는 H2 데이터베이스를 사용하며, 애플리케이션이 구동되면 메모리 내 데이터베이스에 테이블을 만들고 데이터를 저장/조회하는 REST API를 구현
// User.java (엔티티 클래스 예제)
import jakarta.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // ID 자동 생성
    private Long id;

    private String name;
    
    // 기본 생성자, getters/setters ...
    protected User() {}
    public User(String name) { this.name = name; }
    public Long getId() { return id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}
// UserRepository.java (JpaRepository 인터페이스)
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // JPA 메서드 쿼리 등을 추가로 정의할 수 있음 (필요 시)
}

 

  • 위와 같이 User 엔티티와 Spring Data JPAJpaRepository를 상속받은 UserRepository를 만들면, 별도 구현 없이도 기본적인 CRUD 메서드가 제공
  • spring-boot-starter-data-jpa를 추가한 경우, 애플리케이션 구동 시 자동으로 JPA 관련 빈(엔티티 매니저, 트랜잭션 매니저 등)이 설정되고, 데이터소스도 기본적으로 H2 (메모리 DB)가 적용 ( 만약 H2 의존성이 있다면 )
  • 즉, 추가 설정 없이 UserRepository를 바로 사용하여 DB 작업을 수행할 수 있음

JPA를 통해 데이터를 저장하고 조회하는 API 구현

// UserController.java (JPA 활용 REST 컨트롤러)
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;
    
    // 모든 사용자 조회 (GET /users)
    @GetMapping
    public List<User> getUsers() {
        return userRepository.findAll();  // 모든 User 엔티티 조회
    }
    
    // 새로운 사용자 추가 (POST /users)
    @PostMapping
    public User createUser(@RequestBody User newUser) {
        return userRepository.save(newUser);  // User 엔티티 저장 (id 자동 생성)
    }
}

 

  • UserController에서는 /users 경로 아래에서 동작하는 REST API를 정의
  • GET 요청 시 userRepository.findAll()을 통해 모든 사용자 목록을 JSON으로 반환하고, POST 요청 시 요청 본문을 User 객체로 받아 userRepository.save()를 통해 저장 후 저장된 객체를 반환
  • 이 모든 것이 가능한 것은 Spring Boot가 자동으로 데이터베이스 설정과 JPA 구현체를 구성해주었기 때문
  • H2 데이터베이스를 사용할 경우 아무 설정이 없으면 메모리 모드로 동작하며, spring.jpa.hibernate.ddl-auto=create 등의 기본값으로 인해 애플리케이션 시작 시 User 엔티티에 대응하는 테이블이 자동 생성
  • 실제로 이 애플리케이션을 실행하고 적절한 HTTP 요청을 보내면 ( curl이나 Postman 등을 사용하여 POST /users 호출 등 ), H2 메모리 데이터베이스에 데이터가 저장되고 GET /users를 통해 그 목록을 확인할 수 있습니다

실제 응용에서는 application.properties 또는 application.yml에 데이터베이스 설정(H2가 아닌 별도의 DB사용 시 URL, 계정 등)이나 JPA 옵션(spring.jpa.show-sql=true 등)을 명시적으로 넣어주게 됨
또한 Service 계층을 추가하고 예외 처리나 DTO를 쓰는 등 구조를 더 갖추게 되지만, 여기서는 이해를 돕기 위해 단순화함


Spring Boot VS 기존 Spring Framework

설정 방식

  • 기존 SpringXML 설정 파일이나 Java Config로 세밀한 설정을 개발자가 모두 명시해야 했음
    • 예를 들어 데이터소스, 트랜잭션 매니저, ViewResolver 등을 일일이 설정하고 Bean으로 등록해야 했음
  • Spring Boot에서는 자동 설정(Auto Configuration)을 통해 필요 빈들을 알아서 등록해주므로, 설정에 대한 부담이 크게 줄었음
    • 필요한 경우 일부 설정만 properties 파일에 키-값으로 지정하면 됨

의존성 관리

  • 기존 Spring 프로젝트에서는 Maven/Gradle에서 각각의 라이브러리를 직접 추가해야 했음
    • 웹 앱이라면 Spring MVC, 서블릿 API, JSTL, Jackson, SLF4J 등 여러 라이브러리를 개별적으로 지정하고 호환 버전을 맞춰야 했음
  • Spring BootStarter 의존성을 통해 관련 라이브러리를 한 번에 추가할 수 있고, Boot의 BOM(Bill of Materials)이 호환되는 버전들을 관리해주기 때문에, 라이브러리 충돌이나 호환성 문제를 신경 쓸 일이 적음

내장 서버 지원

  • 기존 Spring 기반 웹 앱은 보통 WAR 파일로 패키징되어 외부 Tomcat 같은 애플리케이션 서버에 배포되어야 했음
    • 개발 중에는 임베디드 Tomcat을 수동으로 설정하지 않는 한 별도 서버를 띄워야 했음
  • Spring Boot처음부터 내장 서버(Tomcat 등)를 포함해서 JAR로 배포되므로, 개발이나 배포 시에 추가 설정 없이 바로 실행할 수 있음
    • Spring Framework 자체도 코딩으로 내장 Tomcat을 붙일 수 있지만 Spring Boot만큼 간편하지는 않음

배포 및 실행

  • 기존 SpringWAR/EAR 등 전통적인 배포 방식을 따랐고, 서버 운영 환경에 따라 복잡한 설정(JNDI 등)도 필요했음
  • Spring Boot독립 실행형 JAR로 DevOps에 친화적
    • CI/CD 파이프라인에서 바로 빌드 아웃풋(JAR)을 실행하거나 Docker 이미지로 만들어 배포하기 쉬움
    • Spring Boot는 애플리케이션 시작 시 banner 로고 출력이나 다양한 명령행 옵션(--server.port=8081 등) 지원 등 Standalone 애플리케이션 느낌에 맞게 설계되었음

관례 vs 설정

  • 기존 Spring설정보다 명시(configurations over conventions) 스타일에 가까움
    • 원하는 대로 일일이 설정을 조정할 자유가 있었음
  • Spring Boot관례가 우선(convention over configuration)
    • Opinionated(의견있는) 기본값을 제공하여 평범한 경우 설정을 생략하게 함
    • Spring Boot에서도 물론 필요한 경우 설정을 커스터마이징할 수 있지만, 기본적으로는 Spring의 철학 중 하나인 “필요한 것만 설정하고 나머지는defaults”를 극대화했다고 볼 수 있음

부가 기능

  • 기존 Spring + 추가 라이브러리 조합으로도 모니터링이나 보안 등을 구축할 수 있음
  • Spring BootActuator, DevTools 등 개발/운영에 유용한 부가 기능들을 쉽게 붙일 수 있게 해줌
    • 예를 들어 Actuator로 애플리케이션 상태나 각종 Metric을 바로 확인할 수 있고, DevTools로 코드 변경 시 자동 재시작 등의 편의를 얻을 수 있음
Spring Boot = Spring Framework + α(개선된 개발 경험)으로 볼 수 있음
Spring Boot를 사용하면 Spring의 강력한 기능은 그대로 활용하면서 초기 설정과 반복 작업을 줄여 개발 효율을 높일 수 있음
다만 Spring Boot도 내부적으로 Spring Framework를 사용하므로, Spring Boot를 잘 활용하기 위해서는 Spring 자체에 대한 이해도 함께 가지고 있는 것이 좋음

Spring Boot 프로젝트 설정 및 구조

  • Spring Boot로 생성한 프로젝트는 관례에 따라 정해진 구조를 가짐
  • 기본 Maven 프로젝트를 예로 들면 다음과 같음
my-springboot-app/
 ├─ src/
 │   ├─ main/
 │   │   ├─ java/ (자바 소스 폴더)
 │   │   │    └─ com/example/demo/... (주요 코드: @SpringBootApplication 클래스, 컨트롤러, 서비스 등)
 │   │   └─ resources/ (리소스 폴더)
 │   │        ├─ static/ (정적 리소스: HTML, JS, CSS 등)
 │   │        ├─ templates/ (템플릿 엔진 뷰: Thymeleaf 등 사용할 경우)
 │   │        └─ application.properties (또는 application.yml)   <-- **설정 파일**
 │   └─ test/ (테스트 코드 폴더)
 │        └─ java/ ... (테스트 소스들)
 └─ pom.xml (Maven 빌드 설정 파일)

 

  • 위와 같이 src/main/resources 경로에 application.properties 또는 application.yml 파일을 두면 Spring Boot가 애플리케이션 실행 시 자동으로 로드하여 사용함
  •  설정 파일들은 애플리케이션의 다양한 설정 값을 정의하는데 사용됨
    • 예를 들어, 포트를 바꾸거나 로깅 레벨을 지정하거나, DB 접속 정보를 설정하는 등 모든 설정을 키-값 형태로 기술할 수 있음

application.properties 예시 ( Key-Value 형태 )

server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=myuser 
spring.datasource.password=mypass
spring.jpa.show-sql=true
logging.level.com.example.demo=DEBUG
  • 각 설정이 {키}={값} 형태로 작성됨
    • 예시에서는 서버 포트를 8081로 변경, MySQL 데이터소스 설정, JPA 실행 SQL 로깅 활성화, 패키지별 로깅 레벨 DEBUG 설정 등을 보여줌

application.yml 예시 (계층적 YAML 형태 )

server:
  port: 8081

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: myuser
    password: mypass
  jpa:
    show-sql: true

logging:
  level:
    com.example.demo: DEBUG
  • YAML 형식은 들여쓰기를 사용하여 계층 구조를 표현하기 때문에, 관련된 설정을 그룹화해서 보기 쉬움
    • 위 내용은 properties 예시와 동일한 설정을 YAML로 표현한 것임

  • 두 형식 모두 Spring Boot에서 동일하게 지원되며, 취향이나 상황에 따라 둘 중 하나를 선택하면 됨
    • 일반적으로 application.properties가 기본 생성되지만 YAML을 더 선호하는 개발자도 많음
주의
두 파일을 동시에 사용하는 것은 권장되지 않으며, 하나만 사용하는 것이 일관성에 좋음
  • Spring Boot에서는 프로파일(Profile) 개념을 활용하여 다중 환경 설정을 관리할 수 있음
    • 예를 들어, 개발과 운영 환경의 설정을 분리하기 위해 application-dev.properties, application-prod.properties처럼 파일을 만들고, 활성화할 프로파일을 spring.profiles.active=dev 등으로 지정하면 해당 프로파일의 설정이 기본 설정과 병합되어 적용됨
    • 이를 통해 한 프로젝트 내에서 환경(개발, 테스트, 운영 등)별로 다른 설정을 손쉽게 관리할 수 있음
  • Spring Boot 프로젝트 구조에서 메인 클래스(@SpringBootApplication)의 패키지에 주목해야 함
    • 이 클래스가 위치한 패키지와 그 하위 패키지들만 컴포넌트 스캔의 대상이 되므로, 일반적으로 메인 클래스를 최상위 패키지에 위치시켜 애플리케이션의 모든 구성 요소를 스캔하도록 함
    • com.example.demo 패키지에 DemoApplication 클래스가 있다면 그 하위의 controller, service, repository 패키지 등을 자동으로 스캔하여 Bean을 등록함
요약하면, Spring Boot정해진 프로젝트 구조와 설정 파일 관례를 따름으로써 별도 설정 코드 없이도 동작함
개발자는 이 구조 안에서 파일들만 적절히 배치하고 properties/yml 파일에 필요한 설정을 작성하면 되므로, 프로젝트 구조를 처음 맞출 때 약간만 신경 쓰면 이후 개발이 수월해짐

면접 대비 질문

더보기

기초 질문

Q1. Spring Boot란 무엇이고 왜 사용하나요?

모범 답안

Spring Boot는 기존 Spring Framework를 쉽게 사용할 수 있도록 자동 설정과 스타터 의존성 등을 제공하는 프레임워크입니다. 복잡한 설정 없이 빠르게 독립 실행형(Spring Standalone) 애플리케이션을 만들 수 있다는 장점 때문에 사용합니다. 예를 들어, 웹 애플리케이션을 만들 때 Spring Boot를 사용하면 톰캣 같은 내장 웹 서버가 자동으로 설정되고, 필요한 라이브러리도 Starter를 통해 한 번에 추가되어 개발 생산성이 높아집니다. 요약하면 "Spring을 편하게 쓰기 위한 도구”로서, 빠른 개발과 쉬운 배포를 위해 Spring Boot를 사용합니다.


Q2. Spring Boot의 자동 설정(Auto Configuration)은 무엇인가요?

모범 답안

자동 설정이란 클래스패스에 존재하는 라이브러리들을 기준으로 적절한 스프링 빈 설정을 자동으로 해주는 Spring Boot의 기능입니다. 예를 들어, 프로젝트에 H2 데이터베이스 라이브러리를 추가하기만 하면, Spring Boot는 별도의 설정 없이도 DataSource 빈과 JPA 관련 빈을 자동으로 등록합니다. 개발자가 일일이 설정 클래스를 작성하지 않아도 되므로 빠르게 기본 동작을 갖춘 애플리케이션을 만들 수 있습니다. 자동 설정은 @EnableAutoConfiguration (혹은 @SpringBootApplication) 애노테이션을 통해 활성화되며, Spring Boot가 제공하는 수많은 AutoConfiguration 클래스들에 의해 동작합니다. 필요한 경우 특정 자동 설정을 사용하지 않도록 제외하거나, 사용자 설정으로 덮어씌울 수도 있습니다.


Q3. Spring Boot 스타터(Starter)란 무엇인가요?

모범 답안

스타터(Starter)는 특정 기능에 필요한 여러 가지 의존성(dependencies)을 한 번에 묶어놓은 Maven/Gradle 의존성입니다. Spring Boot는 웹, JPA, 시큐리티 등 자주 쓰이는 기능별로 스타터를 제공하여, 개발자가 어떤 기능을 쓰고 싶을 때 일일이 라이브러리를 찾을 필요 없이 해당 스타터 하나만 추가하면 관련 라이브러리와 기본 설정을 모두 가져오게 됩니다. 예를 들어 spring-boot-starter-web을 추가하면 Spring MVC, 톰캣, JSON 처리 라이브러리가 모두 추가되고 웹 애플리케이션을 위한 기본 구성이 완료됩니다. 스타터 덕분에 의존성 관리가 쉽고 일관성 있게 이루어지며, 프로젝트 설정 시간이 크게 단축됩니다.


Q4. Spring Boot로 생성한 애플리케이션을 어떻게 실행하나요?

모범 답안

Spring Boot 애플리케이션은 일반 Java 애플리케이션처럼 main 메서드를 통해 실행합니다. Maven이나 Gradle 빌드 후 생성된 JAR 파일을 java -jar 앱이름.jar 명령어로 실행할 수도 있고, IDE에서 직접 실행(run)할 수도 있습니다. 내장 톰캣 등이 포함되어 있으므로, JAR만 실행하면 애플리케이션이 곧바로 구동됩니다. (만약 Spring Boot 프로젝트를 WAR 패키지로 만들었다면 전통적인 WAS에 배포하여 실행할 수도 있지만, 일반적으로는 JAR로 실행합니다.)


Q5. (팔로업) 그럼 Spring Boot 애플리케이션의 기본 포트를 바꾸거나 설정을 변경하려면 어떻게 해야 하나요?

모범 답안

Spring Boot에서는 src/main/resources에 있는 application.properties (또는 application.yml) 파일을 편집하여 설정을 변경합니다. 예를 들어 포트를 8080에서 9090으로 바꾸려면 application.properties에 server.port=9090이라고 작성하면 됩니다. 이 외에도 데이터베이스 접속정보, 로그 레벨, 스프링 설정 등 수백 가지 옵션을 이 설정 파일에서 지정할 수 있습니다. 외부 설정 파일을 사용하기 때문에 코드 수정 없이도 환경 설정을 변경할 수 있다는 점이 Spring Boot의 편의성입니다.


심화 질문

Q1. @SpringBootApplication 애노테이션의 역할은 무엇인가요?

모범 답안

@SpringBootApplication은 사실 세 가지 애노테이션의 복합체입니다: @SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan입니다.

  • @Configuration은 해당 클래스가 스프링 설정(자바 기반 설정) 클래스임을 나타냅니다.
  • @ComponentScan은 현재 패키지와 그 하위 패키지에서 @Component, @Controller, @Service, @Repository 등이 붙은 클래스를 찾아 스프링 빈으로 등록하라는 뜻입니다.
  • @EnableAutoConfiguration은 앞서 설명한 Spring Boot 자동 설정을 활성화하라는 의미입니다.
    따라서 @SpringBootApplication이 붙은 클래스를 프로그램 시작점으로 두고 실행하면, 해당 패키지 하위의 모든 컴포넌트를 스캔하여 로딩하고, Spring Boot가 제공하는 자동 설정을 적용하여 필요한 빈들을 구성하게 됩니다.

Q2. Spring Boot에서 프로파일(Profile)을 이용한 다중 환경 구성은 어떻게 하나요?

모범 답안

Spring Boot에서는 프로파일별 설정 파일을 통해 환경별 구성을 분리할 수 있습니다. 기본 설정은 application.properties에 두고, 예를 들어 개발 환경에 특화된 설정은 application-dev.properties, 운영 환경 설정은 application-prod.properties처럼 파일을 만들어 관리합니다. 그리고 애플리케이션 실행 시 활성화할 프로파일을 명령어 인자 환경변수, 또는 기본 properties에 spring.profiles.active 키를 사용해 지정합니다 (예: --spring.profiles.active=prod). 이렇게 하면 해당 프로파일의 설정이 기본 설정과 함께 적용됩니다. 예를 들어 application-prod.properties에 logging.level.root=INFO를 두고 dev에는 DEBUG로 두는 식으로 환경마다 다르게 설정할 수 있습니다. 또한 YAML 형식일 경우 하나의 application.yml 안에 프로파일별 섹션을 %[profile] 키로 분리해서 작성할 수도 있습니다. 이 메커니즘을 통해 하나의 코드베이스로 다른 환경에서 다른 설정을 사용하고, 민감한 정보 DB URL 등을 환경별로 안전하게 관리합니다.


Q3. Spring Boot Actuator란 무엇이고, 어떤 용도로 사용하나요?

모범 답안

Spring Boot Actuator 애플리케이션의 상태 정보를 확인하고 관리할 수 있도록 도와주는 모니터링 툴킷입니다. spring-boot-starter-actuator를 추가하면 애플리케이션에 여러 유용한 엔드포인트(URL)가 활성화됩니다. 예를 들어 /actuator/health는 애플리케이션의 건강 상태(Health)를 보여주고, /actuator/metrics는 JVM 메트릭이나 커스텀 메트릭 등의 각종 지표를 노출합니다. 이 외에도 환경 변수(/actuator/env), 설정 프로퍼티(/actuator/configprops), 로그 레벨 변경(/actuator/loggers) 등 운영에 필요한 정보와 제어를 제공하는 엔드포인트가 있습니다. Actuator는 주로 운영 환경에서 서비스 상태를 모니터링하거나, Kubernetes/Cloud 환경에서 애플리케이션 헬스체크 용도로 활용됩니다. 또한 보안 설정과 연계하여 민감 정보는 보호하면서 필요한 정보만 노출하도록 설정할 수 있습니다. 간단히 말해, Actuator는 Spring Boot 애플리케이션을 운영/모니터링하기 쉽게 만들어주는 도구입니다.


Q4. (심화) Spring Boot에서 특정 자동 설정을 커스터마이즈하거나 제외하려면 어떻게 해야 할까요?

모범 답안 

Spring Boot의 자동 설정은 편리하지만, 때로는 자동 생성되는 빈이나 설정을 사용자가 원하는 방식으로 대체해야 하는 경우가 있습니다. 이를 해결하는 방법은 몇 가지가 있습니다:

  • 빈 오버라이드(Override): Spring Boot는 기본적으로 자동 구성된 빈보다 사용자가 정의한 빈을 우선합니다. 예를 들어, DataSource를 자동으로 설정하지만 사용자가 @Bean DataSource를 작성하면 그 빈이 사용됩니다. 이처럼 동일한 타입의 빈을 정의하면 자동 설정 빈을 대체할 수 있습니다. (Spring Boot 2.x부터는 기본 빈 override가 금지되어 있으나, spring.main.allow-bean-definition-overriding=true 설정으로 가능)
  • 속성으로 제어: 자동 설정의 동작은 대개 application.properties의 설정값으로 조정할 수 있습니다. 예를 들어, spring.autoconfigure.exclude 속성에 제외할 자동 설정 클래스명을 지정하거나, JPA 자동 ddl 생성 기능을 끄기 위해 spring.jpa.hibernate.ddl-auto=none처럼 설정할 수 있습니다.
  • 애노테이션 exclude 사용: @SpringBootApplication(exclude={AutoConfigClass1.class, ...})와 같이 애노테이션의 exclude 속성을 사용하면 특정 자동 설정 클래스를 아예 적용하지 않도록 할 수 있습니다. 예컨대, JPA 자동 구성을 빼고 싶다면 exclude={DataSourceAutoConfiguration.class}처럼 지정할 수 있습니다.
  • 조건 설정 사용: 때로는 @ConditionalOnMissingBean이나 @ConditionalOnClass 등의 조건 애노테이션을 이용해 사용자 설정 클래스가 특정 조건에서만 동작하도록 구성할 수도 있습니다. 이는 고급 주제이지만, Spring Boot 자동 구성 원리가 이러한 조건 기반으로 이루어져 있다는 것을 이해하면 응용할 수 있습니다.
    요약하면, Spring Boot에서는 자동 설정을 필요에 따라 유연하게 조정할 수 있는 장치가 있으며, 일반적으로는 "자동 설정을 기본으로 사용하되 필요한 부분만 직접 정의하여 덮어쓴다"는 원칙으로 접근합니다.

Q5. Spring Boot와 Spring MVC (또는 Spring Framework) 간의 관계는 무엇인가요?

모범 답안

Spring Boot는 Spring Framework의 부분집합이자 발전형이라고 볼 수 있습니다. Boot 자체는 새로운 웹 프레임워크가 아니라 기존 Spring(Spring MVC, Spring Core 등)의 설정을 간편하게 해주는 지원 도구입니다. 예를 들어, Spring Boot로 웹 앱을 만들 때 내부적으로는 Spring MVC의 DispatcherServlet이 요청을 처리하고, IoC 컨테이너도 Spring Framework의 ApplicationContext입니다. 다만 Boot는 이러한 것을 설정하는 과정을 자동화하고 추가 기능을 붙여줬을 뿐입니다. 따라서 Spring Boot는 Spring Framework 위에서 돌아가며, 개발 편의성을 높이는 것이 주 목적입니다. 비유하자면, Spring Framework가 엔진과 부품을 제공한다면 Spring Boot는 시동을 걸면 바로 달릴 수 있게 조립해놓은 차라고 할 수 있습니다. 그러므로 Boot를 쓴다고 해서 Spring 지식이 불필요한 것은 아니며, 내부 동작은 Spring 원리에 따라 움직입니다. 다만 Boot를 통해 신속한 개발 베스트 프랙티스 적용이 쉬워졌다는 차이가 있을 뿐입니다.


압박 질문

Q1. Spring Boot를 사용하면서 발생할 수 있는 단점이나 주의할 점은 무엇이라고 생각하시나요?

모범 답안

Spring Boot는 편리함을 주지만, 몇 가지 트레이드오프도 있습니다. 우선 불필요한 리소스 사용 가능성이 있는데, 스타터 의존성을 통해 편하게 라이브러리를 추가하다 보면 실제로 안 쓰이는 기능까지 포함되어 애플리케이션이 다소 무거워질 수 있습니다. 예를 들어 간단한 REST 서비스에도 내부적으로 수많은 자동 설정 시도가 이루어지고 필요 없는 빈들도 로딩될 수 있죠. 또한 자동 설정에 익숙해지면 정작 내부에서 무슨 일이 일어나고 있는지 모르게 되는 경우가 있습니다. 이는 문제가 생겼을 때 원인을 파악하기 어렵게 할 수 있습니다. 그러므로 Spring Boot의 편의에 너무 의존하기보다는 기본 원리를 이해하려는 노력이 필요합니다.
성능 측면에서도, Boot가 해주는 편의 때문에 초기 구동 시간이 약간 증가하거나 메모리 사용량이 늘어날 수 있습니다. 대규모 시스템에서는 이러한 오버헤드가 신경 쓰일 수 있죠. 마지막으로 Boot의 Opinionated한 구조가 때로는 제약이 될 수 있습니다. Boot가 정해준 구조나 방식에서 크게 벗어나 특수한 설정을 하려면 오히려 학습이 더 필요하거나, Boot의 기본 기능을 끄고 수동 설정해야 하는 경우가 있습니다. 요약하자면, Spring Boot의 단점은 "편의를 위해 약간의 무거움과 제어권 희생"으로 표현할 수 있고, 이를 보완하기 위해서는 불필요한 스타터 제거, 프로파일별 경량화, 필요 기능만 사용 등의 노력이 필요합니다.


Q2. (시나리오) 만약 Spring Boot 자동 설정이 원치 않는 빈을 만들어 충돌이 발생한다면 어떻게 대응하시겠습니까?

모범 답안

우선 문제 원인을 확인하기 위해 Spring Boot의 자동 구성 리포트를 참고할 것입니다. Spring Boot 애플리케이션을 실행할 때 --debug 옵션을 주거나, org.springframework.boot.autoconfigure 로거를 DEBUG로 설정하면 어떤 자동 설정이 적용되었는지, 어떤 조건 때문에 적용/미적용되었는지 상세히 알 수 있습니다. 이를 통해 원치 않는 빈이 어느 자동 설정 클래스에 의해 등록되었는지 파악합니다.
해결 방법으로는 몇 가지를 고려할 수 있습니다. 가장 쉬운 방법은 해당 빈을 덮어쓰는 사용자 정의 빈을 만들거나, 충돌의 원인이 된다면 @Primary @Qualifier로 어떤 빈을 쓸지 명시해주는 것입니다. 그래도 충돌이 해결되지 않거나 정말 해당 자동 설정이 문제를 일으킨다면, **자동 설정 자체를 비활성화(exclude)**할 수 있습니다. 예를 들어 특정 SecurityAutoConfiguration이 원치 않는 필터를 등록하면, @SpringBootApplication(exclude=SecurityAutoConfiguration.class)처럼 설정합니다.
경우에 따라서는 Starter 의존성을 빼는 방법도 있습니다. 만약 어떤 스타터가 포함된 탓에 자동 설정이 발동한 거라면, 그 스타터를 제거하고 필요한 의존성만 개별 추가하는 식으로 제어할 수도 있습니다. 결국 중요한 것은 Spring Boot의 자동 기능을 필요에 따라 끌 수 있다는 점을 인지하는 것입니다. 저는 이러한 상황에 대비해 Spring Boot의 문서나 AutoConfiguration 소스를 참고하고, 필요한 경우 @ImportAutoConfiguration이나 spring.autoconfigure.exclude 속성도 활용하여 문제를 해결하겠습니다.


Q3. (압박) Spring Boot 없이도 Spring 기반 애플리케이션을 개발할 수 있는데, 굳이 Spring Boot를 사용하는 이유와, 반대로 Spring Boot를 사용하지 말아야 할 상황은 있을까요?

모범 답안

Spring Boot 없이도 전통적인 Spring MVC + Maven 조합으로 개발하는 것은 가능합니다. 그러나 생산성과 표준화 측면에서 현재는 Spring Boot를 사용하는 것이 이점이 훨씬 큽니다. Boot를 사용하면 위에서 이야기한 자동 설정, 스타터, 내장 서버 등으로 개발 속도가 빨라지고 오류 발생 가능성이 줄어듭니다. 특히 새로운 프로젝트를 시작하거나 마이크로서비스를 만들 때 부트는 사실상 표준 도구입니다.
반면, Spring Boot를 사용하지 말아야 할 상황도 몇 가지 생각해볼 수 있습니다. 예를 들어 애플리케이션 크기가 매우 작고 단순해서 Boot의 혜택이 과하지 않은 경우입니다. Boot 자체가 약간의 오버헤드(라이브러리 로드, 부트스트랩 코드)를 가져오므로, 만약 몇 개의 설정만으로 충분한 아주 단순한 앱이라면 순수 Spring + 서블릿으로 구성하는 편이 가벼울 수 있습니다. 또 다른 경우는 레거시 WAS 환경에 엄격하게 종속된 경우입니다. 어떤 조직은 이미 WebLogic, WebSphere 같은 WAS에 최적화된 환경을 갖고 있어서 Boot의 내장 서버보다는 전통적인 배포가 나을 수 있습니다. 이때는 Boot를 쓰더라도 WAR로 패키징하거나, 아예 Boot를 쓰지 않는 선택을 할 수 있겠습니다.
마지막으로, Boot의 자동화가 오히려 방해가 되는 특수한 케이스에서는 Boot를 부분적으로 끄거나 안 쓰는 걸 고려할 수 있습니다. 하지만 이런 경우는 드물고, 보통은 Boot를 쓰면서 설정을 조정하면 해결됩니다. 요컨대, Spring Boot는 대부분의 상황에서 개발 효율을 높여주지만, 시스템의 특수성이나 성능상 제약 때문에 부득이하게 전통적인 방법을 써야 할 때가 있을 수는 있다고 답변드릴 수 있겠습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함