build.gradle, settings.gradle, Gradle Wrapper 파일로 프로젝트 빌드와 실행 환경을 정의한다src/main/java에 메인 클래스와 controller, service, repository, domain 패키지로 계층형 구조를 구성한다src/main/resources에 설정 파일, 정적 리소스, 뷰 템플릿을 두고 src/test/java에 단위/통합 테스트 코드 담당 
애플리케이션 메인 클래스란 Spring Boot 애플리케이션의 진입점을 정의한 메인 클래스이다.
@SpringBootApplication으로 자동 설정과 컴포넌트 스캔을 활성화하고, SpringApplication.run()으로
스프링 컨텍스트와 내장 서버를 구동한다. (web이 있을 경우)
→ Spring에서는 존재하지 않았던 main을 Spring Boot에서는 드디어 확인 할 수 있게 되었다.
Resources는 애플리케이션의 환경 설정, 정적 파일, 템플릿 등 비자바 리소스를 관리하는 디렉토리이다.
빌드 시 이 파일들은 클래스패스(classpath:/)에 포함되어 애플리케이션 실행 시 자동으로 로드 된다.
test영역은 애플리케이션의 단위 및 통합 테스트 코드를 작성하는 전용 디렉토리이다.
메인 코드(src/main/java)와 동일한 패키지 구조를 유지해 테스트 대상을 쉽게 매핑할 수 있다.
JUnit, Spring Test 등의 도구를 활용해 기능 검증 및 회귀 테스트를 수행하는 공간으로 사용된다.
Gradle은 JVM 기반의 오픈소스 빌드 자동화 도구로, Groovy·Kotlin DSL을 사용해 유연하게 프로젝트
빌드 과정을 정의할 수 있다. 의존성 관리(Maven Central 등)와 멀티 프로젝트 빌드를 손쉽게 지원하며,
증분 빌드와 캐싱으로 빌드 속도를 최적화한다.
Java뿐 아니라 Kotlin, Android, Spring 등 다양한 생태계에서 표준 빌드 도구로 널리 활용된다.
→ Google이 2013년 Android Studio를 발표하면서 Gradle을 기본 빌드 도구로 채택 된 이후 활성화됨
아래 경로는 Gradle 프로젝트 생성시 생성되는 기초 파일 리스트로 해당 파일을 통해 Gradle 기능을
활용할 수 있다.
build.gradle은 Gradle 빌드 도구의 설정 파일로, 프로젝트의 플러그인, 의존성, 빌드 작업을 정의한다.
기본적으로 Groovy DSL로 작성되며, 조건문과 함수 작성이 가능한 스크립트 형태로 동작한다.
이를 통해 빌드·배포·테스트 과정을 자동화하고 관리할 수 있다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.4'
id 'io.spring.dependency-management' version '1.1.7'
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
tasks.register('hello') {
doLast { println 'Hello Gradle!' }
}
Gradle은 애플리케이션 빌드, 실행, 테스트 수행, 의존성 트리 확인, 사용 가능한 작업 목록 조회, 빌드 결과 초기화와 같은 주요 기능을 제공한다.
| 명령어 | 설명 |
|---|---|
./gradlew build | 전체 애플리케이션을 빌드 (컴파일 + 테스트 + 패키징) |
./gradlew clean | 빌드 결과물(build/)을 삭제하여 초기화 |
./gradlew bootRun | 애플리케이션을 실행 (Spring Boot 전용) |
./gradlew test | 테스트 코드 실행 |
./gradlew dependencies | 의존성 트리 확인 |
./gradlew tasks | 프로젝트에서 사용할 수 있는 모든 태스크 목록 출력 |
Gradle Wrapper(래퍼)는 Gradle이 설치되어 있지 않은 환경에서도 프로젝트를 동일한 Gradle 버전으로 빌드할 수 있도록 해주는 실행 도구이다. (절대 gitignore 하면 안된다!)
Maven Repository(mvnrepository.com)는 Maven·Gradle 같은 빌드 도구가 사용하는 라이브러리
저장소를 검색할 수 있는 웹 서비스다. 개발자는 여기서 의존성 좌표(Group, Artifact, Version)를 확인해
빌드 스크립트에 추가할 수 있다. 즉, 외부 라이브러리 관리와 버전 확인을 쉽게 해주는 중앙 허브
역할을 한다.
→ mavenCentral()을 통해 의존성 파일은 실제 여기서 다운로드 된다.
Spring Boot 애플리케이션의 환경 설정 파일로, 포트, DB 연결, 로깅, 프로필 등 실행 환경을 정의한다.
설정 파일은 Spring Boot가 자동으로 로드해 애플리케이션 실행 시 설정 값을 주입하는 역할을 한다.
.properties 키-값 쌍으로 단순하게 작성된다. (Legacy).yaml 계층적 구조로 가독성이 높아 복잡한 설정에 적합하다. (최근 권장)프로젝트 프로필(Profile)은 개발·테스트·운영 등 환경별로 다른 설정을 적용하기 위한 논리적 구분이다.
application-{profile}.yml 형식으로 프로필별 설정 파일을 만들어 관리하며, 예를 들어 application-dev.yml, application-prod.yml처럼 구분한다.
jar파일 실행 시 --spring.profiles.active=dev 옵션이나 application.yml에서 spring.profiles.active로 활성화 할 프로필을 지정한다. (권장)
Spring Boot는 다양한 위치와 방식으로 설정 값을 로드 하며, 우선순위가 존재한다.
(낮음 → 높음)
application.properties / application.ymlapplication-{profile}.yml (예: application-dev.yml)--spring.config.location 또는 --spring.config.additional-location 으로 지정--server.port=9090 형태로 실행 시 직접 지정 (가장 높은 우선순위)뒤에서 읽은 값이 앞의 값을 덮어씀(Override)
application.yml 같은 설정 파일을 공개 저장소(GitHub 등)에 업로드하면 도메인 계정 비밀번호나 API Key 같은 민감 정보가 그대로 노출될 위험이 있다. (실제 이것만 스캔하는 bot이 수백개다)
Spring Boot 애플리케이션은 main 메서드를 포함하는 진입 클래스로부터 실행된다.
진입 클래스에는 @SpringBootApplication이 선언되며, 이 어노테이션을 통해 핵심적인 부트스트랩 과정이 수행된다. 실행 시 SpringApplication.run() 메서드를 호출하여 애플리케이션 컨텍스트를 초기화하고, 자동 설정과 빈 등록을 포함한 구동 절차가 진행된다.
@SpringBootApplication 어노테이션 선언 순서에 따라 Config → AutoConfig → Scan이 수행된다.
@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {}
@SpringBootConfiguration@Configuration을 포함한다.@EnableAutoConfigurationspring-boot-starter-web이 있으면 내장 톰캣 + Spring MVC 자동 설정spring-boot-starter-data-jpa가 있으면 JPA + Hibernate 설정 자동 구성@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})처럼 특정 자동 설정 제외 가능@ComponentScan@Controller, @Service, @Repository, @Component로 선언된 클래스가 자동 등록@SpringBootApplication(scanBasePackages = "com.example.myapp")
실행 시 동작 흐름
SpringApplication.run() 호출.@SpringBootApplication → 내부적으로 아래 내용 실행@SpringBootConfiguration: 설정 클래스 인식@EnableAutoConfiguration: 라이브러리 기반 자동 설정@ComponentScan: 패키지 하위 클래스 자동 스캔 및 빈 등록SpringApplication.run() 호출 시 SpringApplication 객체가 초기화되고 ApplicationContext가 생성된다.AnnotationConfigServletWebServerApplicationContext(웹) 또는 AnnotationConfigApplicationContext(비웹)가 사용된다.@EnableAutoConfiguration이 활성화되어 SpringFactoriesLoader를 통해 spring.factories에 정의된 자동 설정 클래스를 읽어온다.@ConditionalOnClass, @ConditionalOnMissingBean 등)을 검사하여 현재 환경에 맞는 Bean만 등록한다.DataSourceAutoConfiguration이 동작@ComponentScan) 으로 패키지 내의 @Component, @Service, @Repository, @Controller 등을 찾아 Bean으로 등록@Configuration) 의 @Bean 메서드가 실행되어 Bean 생성ApplicationEvent(ApplicationStartedEvent, ApplicationReadyEvent 등)가 순차적으로 발행된다.@EventListener나 ApplicationListener로 실행 단계별 로직을 추가할 수 있다.InitializingBean.afterPropertiesSet() 또는 @PostConstruct 호출, 종료 시 DisposableBean.destroy() 또는 @PreDestroy가 실행된다.spring-boot-starter는 스프링 부트 애플리케이션의 실행을 위한 공통 기본 의존성 묶음이다.
로깅(Logback), 자동 설정(AutoConfiguration), YAML 파서 등 부트 구동에 필요한 필수 모듈을 포함한다.
웹·JPA 등 특정 기능은 없고, 다른 스타터들의 기반이 되는 최소 스타터 역할을 한다.
spring-boot-starter-web은 Spring MVC 기반 웹 애플리케이션 개발을 위한 스타터다.
내장 Tomcat을 통해 별도의 WAS 없이 바로 실행 가능한 환경을 제공한다. REST API, JSON 처리, 검증 등 웹 개발 필수 모듈을 자동으로 포함한다.
spring-boot-starter-test는 스프링 부트 애플리케이션 테스트를 위한 통합 스타터다.
단위 테스트, 통합 테스트, Mock 객체 기반 테스트를 위한 주요 라이브러리를 자동 포함한다.
JUnit, Mockito, Spring Test 등 표준 테스트 도구를 한 번에 제공한다.
Spring Boot는 BOM(Bill of Materials) 방식을 사용해, 의존성 라이브러리들의 버전을 일괄 관리하고
호환성을 보장한다. 개발자가 개별 라이브러리 버전을 명시하지 않아도, Spring Boot가 테스트·검증한
안정된 버전 세트를 자동 적용
spring-boot-dependencies는 Spring Boot 프로젝트에서 사용하는 BOM으로, 모든 Starter 및 주요
서드파티 라이브러리(Jackson, Tomcat, Hibernate 등)의 버전을 통합 관리한다.
Gradle/Maven에서 별도 버전을 지정하지 않으면 이 BOM에 정의된 기본 버전이 사용됨
dependencies {
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-jetty'
}dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
}dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.0' // 오버라이딩
}Spring Boot 애플리케이션은 관심사 분리(Separation of Concerns)를 위해 레이어드 아키텍처 패턴을
주로 사용한다. 각 계층은 명확한 책임을 가지고, 아래 계층에만 의존하는 구조를 갖는다.
@Controller 웹 요청/응답을 처리하는 컨트롤러 (MVC, View가 있을 때 사용)
@RestController 웹 요청/응답을 처리하는 컨트롤러 (REST, View가 없을 때 사용)
@Service 핵심 비즈니스 로직 담당, 트랜잭션 및 도메인 규칙 구현
@Repository 데이터 접근 계층, SQL/JPA를 통한 데이터 연산 처리
(@RestController = @Controller + @ResponseBody)

이벤트 기반 아키텍처(Event-Driven Architecture)는 특정 동작이 발생했을 때(이벤트) 이를 비동기적으로 처리하는 구조를 말한다. 핵심은 발생(Producer) 과 처리(Consumer) 를 느슨하게 연결해 확장성과 유연성을 높이는 것이다.

Spring Boot에서 이벤트 기반 아키텍처는 ApplicationEventPublisher와 @EventListener 를 활용해 발행-
구독 구조로 동작하며, 비즈니스 로직을 느슨하게 결합하고 비동기적 처리를 가능하게 한다.