반응형
0. 스프링과 스프링 부트의 차이
1) 스프링(Spring Framework)
- 의존성 주입(DI), AOP, 트랜잭션 관리 등 엔터프라이즈 애플리케이션의 기반을 제공
- XML, Java Config, Annotation 등을 이용해 원하는 설정을 직접 해야 함
: 웹 애플리케이션을 만들려면 DispatcherServlet, ViewResolver, DataSource 등을 직접 등록해야 함 - 원하는 대로 커스터마이징 가능하지만, 초기 설정이 복잡하여 시간이 많이 걸림
2) 스프링 부트(Spring Boot)
- 스프링을 더 쉽게 쓰도록 만든 확장판
- 대부분의 설정을 자동 설정(Auto Configuration) 가능하고, 필요한 부분만 오버라이드 가능
- Tomcat, Jetty 같은 서버가 내장되어 있어 java -jar만으로 실행 가능
- 스타터 의존성(spring-boot-starter-web, spring-boot-starter-data-jpa 등)을 추가하면 빠른 개발 시작 가능
-> @SpringBootApplication 하나만 붙이면 웹 서버가 바로 뜨고, REST API를 만들 수 있음
1. 스프링이란?
1) 애플리케이션 기본 원리
- 대부분의 애플리케이션은 애플리케이션 전체 기능 중 일부를 담당하는 컴포넌트 여러 개로 구성되며,
각 컴포넌트는 다른 애플리케이션의 구성 요소와 협력하여 작업을 처리 - 애플리케이션이 실행될 때는 각 컴포넌트가 어떻게든 생성되어야 하고 상호 간 알 수 있어야 함
2) 스프링에서의 애플리케이션 동작 원리
- 스프링 애플리케이션 컨텍스트(Spring application context)라는 이름의 컨테이너(container)를 통해,
애플리케이션 컴포넌트에 해당하는 빈(Bean)들을 생성 및 관리
-> 빈(Bean)들은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만듬 - 빈(Bean) 간의 상호 연결은 의존성 주입(Dependency Injection/DI)을 기반으로 수행
- 최신 버전의 스프링에서는 XML 파일이 아닌, 자바 기반의 구성 클래스(configuration)을 사용
-> 컴포넌트와 다른 컴포넌트와의 관계를 나타내서 빈(Bean)을 상호 연결하는 역할
# Java 기반 Configuration 예시 코드
@Configuration
public class ServiceConfiguration {
@Bean
public InventoryService inventoryService() {
return new InventoryService();
}
@Bean
public ProductService productService() {
return new ProductService();
}
}
- 애플리케이션 컴포넌트는 스프링 애플리케이션 컨텍스트(Spring application context)에 의해 관리되고, 상호 주입됨

2. 스프링 애플리케이션 초기 설정하기
1) 스프링 이니셜라이저(Initializer)를 사용한 애플리케이션 초기화
- 스프링 이니셜라이저(Initializer)는 REST API를 사용하는 브라우저 기반 웹 애플리케이션으로,
원하는 기능을 구현할 수 있는 스프링 프로젝트의 구조를 생성해 줌 - Spring Tool Suite(STS)의 스프링 Initializer 지원 기능을 사용하여 새로운 프로젝트 생성
2) Spring Tool Suite(STS)에서 스프링 프로젝트 초기 설정하기
(1) Spring Tools 4 for Eclipse, Java JDK 17버전 다운로드 (Windows11 환경)
- 이전에 스프링부트(Spring Boot)를 공부할 때 썼던 환경설정을 그대로 사용
: 2025.07.15 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - Gradle 기초, API를 작성하는 다양한 방법
스프링 부트 핵심 가이드(장정우 지음) - Gradle 기초, API를 작성하는 다양한 방법
*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법
keep-programming-study.tistory.com

(2) 새로운 스프링 프로젝트 생성
- File -> New -> Spring Starter Project 클릭 후 다음과 같이 입력한 후 Next 클릭

- 의존성 추가 화면에서 다음과 같이 체크한 후 Finish 클릭

3) 스프링 프로젝트 구조 살펴보기
- 애플리케이션 소스 코드는 src/main/java, 테스트 코드는 src/test/java, 자바 리소스가 아닌 것은 src/main/resources에 저장
- mvnw, nvnw.cmd: 메이븐(Maven) 래퍼(Wrapper) 스크립트로,
메이븐이 각 컴퓨터에 설치되어 있지 않아도 이 스크립트로 프로젝트 빌드 가능 - pom.xml: 메이븐(Maven) 빌드 명세(프로젝트 빌드 시 필요한 정보)를 지정한 파일
- TaoCloudApplication.java: 스프링 부트 메인 클래스
- application.properties: 초기에는 내용이 없지만, 구성 속성을 지정 가능한 파일
- templates: 초기에는 내용이 없지만, 브라우저에 콘텐츠를 보여주는 템플릿 파일을 두는 폴더로 Thymeleaf 템플릿을 추가할 수 있음
- TacoCloudApplicationTests.java: 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스
-> 애플리케이션을 개발하는 동안 더 많은 테스트 추가 가능
- mvnw, nvnw.cmd: 메이븐(Maven) 래퍼(Wrapper) 스크립트로,

(1) 빌드 명세 살펴보기
- 스프링 Initializer가 우리가 지정한 내용(의존성)들을 갖는 pom.xml 파일을 생성하는데, 해당 파일에서 빌드 명세를 정의
- <parent>의 <version>: 부모 POM(Project Object Model)으로 spring-boot-starter-parent를 갖는다는 것을 지정
-> 스프링 프로젝트에 흔히 사용되는 여러 라이브러리의 의존성 관리 제공 (버전을 지정할 필요 없음) - <dependencies>: STS의 프로젝트 위저드에서 선택한 각 의존성이 <dependency> 요소로 지정되는데,
Spring Web/Thymeleaf/Spring Boot DevTools/Lombok이 우리가 선택한 것이고 spring-boot-starter-test가 우리가 테스트를 작성할 것에 대비하여 스프링 Initializer가 자동으로 추가한 것- Spring Web/Thymeleaf/Test는 <artifactId>에 starter 단어를 포함하고 있는데,
이들은 스프링 부트 스타터 의존성이기에, 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용
-> 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 작아지고 관리하기 쉬워지며,
라이브러리들의 버전을 걱정하지 않아도 됨
- Spring Web/Thymeleaf/Test는 <artifactId>에 starter 단어를 포함하고 있는데,
- 가장 끝에는 스프링 부트 플러그인이 지정됨
- 메이븐을 사용하는 애플리케이션 실행 가능
- 의존성에 지정된 모든 라이브러리가
실행 가능 JAR 파일에 포함되어 있는지 + 런타임 시 classpath에서 찾을 수 있는지 확인 - 실행 가능 JAR 파일에 메인 클래스로 부트스트랩(구동) 클래스(TacoCloudApplication.java)를 나타내는 매니페스트 파일을 JAR 파일에 생성
- <parent>의 <version>: 부모 POM(Project Object Model)으로 spring-boot-starter-parent를 갖는다는 것을 지정
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>sia</groupId>
<artifactId>taco-cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>taco-cloud</name>
<description>Taco Cloud Example</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webmvc-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
(2) 애플리케이션의 부트스트랩(구동)
- 실행 가능 JAR 파일에서 애플리케이션을 실행하므로 제일 먼저 시작되는 부트스트랩 클래스 + 애플리케이션을 부트스트랩하기 위한 최소한의 스프링 구성이 있어야 함
- @SpringBootApplication은 세 개의 어노테이션이 결합한 것
- @SpringBootConfiguration: 현재 클래스를 구성 클래스로 지정, 필요 시 자바 기반 스프링 프레임워크 구성을 현재 클래스에 추가
- @EnableAutoConfiguration: 스프링 부트 자동 구성을 활성화하여 우리가 필요로 하는 컴포넌트들을 자동으로 구성하도록 스프링 부트에 알려줌
- @ComponentScan: 컴포넌트 검색을 활성화하여, @Component,@Controller,@Service 등의 어노테이션과 함께 클래스 선언 가능
-> 스프링에서 자동으로 위 어노테이션이 붙은 클래스를 찾아 스프링 애플리케이션 컨텍스트에 컴포넌트로 등록
- main() 메서드: 실제로 애플리케이션을 시작시키고 스프링 애플리케이션 컨텍스트를 생성하는 SpringApplication 클래스의 run() 메서드를 호출
-> run()에 전달되는 두 개의 매개변수는 구성 클래스와 명령행(Command-line) 인자로, 구성 클래스와 부트스트랩 클래스를 동일하게 지정
package tacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TacoCloudApplication {
public static void main(String[] args) {
SpringApplication.run(TacoCloudApplication.class, args);
}
}
(3) 애플리케이션 테스트하기 - 스프링 Initializer에서 제공하는 테스트 클래스
- 테스트 클래스에는 하나의 테스트 메서드가 있으며, 실행 코드는 없음
- 스프링 애플리케이션 컨텍스트가 성공적으로 로드될 수 있는지 확인하는 기본적인 검사 수행 가능
-> 이 테스트가 실패할 경우 스프링 애플리케이션 컨텍스트의 생성을 저해하는 코드가 있는 것 - @SprintBootTest: 스프링 부트 기능으로 테스트를 시작하라는 것을 JUnit에 알려주며,
main() 메서드의 SpringApplication.run() 호출에 부합하는 테스트 클래스를 나타냄 - 테스트 메서드: 이것이 없다면 @SpringBootTest는 아무 일도 하지 않음
-> 다만 contextLoad() 처럼 실행 코드는 없어도 테스트 메서드가 있다면 @SpringBootTest가 작업 수행
- 스프링 애플리케이션 컨텍스트가 성공적으로 로드될 수 있는지 확인하는 기본적인 검사 수행 가능
package tacos;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class TacoCloudApplicationTests {
@Test
void contextLoads() {
}
}
*2편이 다음 글에서 계속됩니다
반응형
'스프링(Spring), 스프링부트(SpringBoot) > 스프링(Spring) 기초' 카테고리의 다른 글
| 스프링 인 액션 제5판(크레이그 월즈 지음) - 스프링 시작하기 2 (1) | 2026.06.10 |
|---|---|
| Spring Interceptors(스프링 인터셉터) (0) | 2023.01.02 |
| 예외처리 (0) | 2022.12.27 |
| 스프링 트랜잭션과 로깅 (0) | 2022.12.05 |
| PointCut 표현식과 Advisor 구현 (0) | 2022.11.20 |