스프링(Spring), 스프링부트(SpringBoot)/스프링(Spring) 기초

스프링 인 액션 제5판(크레이그 월즈 지음) - 스프링 시작하기 1

개발학생 2026. 5. 25. 23:25
반응형

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 환경)

 

스프링 부트 핵심 가이드(장정우 지음) - 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: 스프링 애플리케이션이 성공적으로 로드되는지 확인하는 간단한 테스트 클래스
      -> 애플리케이션을 개발하는 동안 더 많은 테스트 추가 가능

(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 단어를 포함하고 있는데,
        이들은 스프링 부트 스타터 의존성이기에, 자체적으로 라이브러리 코드를 갖지 않고 다른 라이브러리의 것을 사용 
        -> 모든 라이브러리의 의존성을 선언하지 않아도 되므로 빌드 파일이 작아지고 관리하기 쉬워지며,
            라이브러리들의 버전을 걱정하지 않아도 됨 
    • 가장 끝에는 스프링 부트 플러그인이 지정됨
      • 메이븐을 사용하는 애플리케이션 실행 가능
      • 의존성에 지정된 모든 라이브러리가
        실행 가능 JAR 파일에 포함되어 있는지 + 런타임 시 classpath에서 찾을 수 있는지 확인
      • 실행 가능 JAR 파일에 메인 클래스로 부트스트랩(구동) 클래스(TacoCloudApplication.java)를 나타내는 매니페스트 파일을 JAR 파일에 생성
<?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편이 다음 글에서 계속됩니다 

반응형