Home [실전 스프링부트] 스프링부트 시작하기
Post
Cancel

[실전 스프링부트] 스프링부트 시작하기

실전 스프링부트

ch1. 스프링 부트 시작하기

다음은 실전 스프링 부트 책을 공부하고 난 후 정리한 포스트 입니다.

스프링 부트 공부를 시작하면서…
막상 인터넷 강의를 보고 공부를 하려니까 왜 스프링 부트를 사용해야 하는지, 정확하게 어떤 기능이 있는지도 잘 모른다는 것을 깨달았다.. 아무래도 나는 지금까지 자바 공부만 했었고, 스프링부트는 처음이였기에 기초부터 다지고 가는게 맞다고 판단했고, 책으로 공부를 하는게 맞다는 생각이 들었다! 그래서 하여튼간에 이번년도에는 이 실전 스프링 부트 책을 여러번 돌리는 것을 목표들 중 하나로 잡았다. 꾸준히 해야쥐….

왜 스프링 부트?

스프링 프레임워크는 복잡한 자바 엔터프라이즈 애플리케이션 개발을 단순화하자는 취지로 시작되었다. 애플리케이션 개발 전략을 단순하게 만들어주고 개발 과정에 필요한 여러가지 복잡한 일들을 스프링 프레임워크가 대신해주면서 엄청난 인기를 끌게 되었다.

스프링 프레임워크 자체만으로도 개발자가 해야할 많은 일을 대신해주고 개발자가 비지니스 문제 해결에 더 집중할 수 있게 해줬지만, 스프링 부트가 나오기 전까지는 애플리케이션을 제대로 구동하기 위해서는 신경써야 되는 부분이 많았다. 예를 들어 다음과 같은 문제들이 있었다.

  • 서블릿에 대해 이해와 서블릿 배포를 위해 필요한 Web.xml에 대한 이해
  • 애플리케이션 컴포넌트를 패키징한 WAR, EAR 디렉터리 구조에 대한 지식
  • 도메인, 포트, 스레드, 데이터 소스 등 애플리케이션 배포시 필요한 서버 지식
  • 복잡한 클래스 로딩 전략, 애플리케이션 모니터링, 유지 관리, 로깅 처리

스프링 부트는 개발자가 애플리케이션을 신속히 만들어서 구동할 수 있게 해주고 복잡한 설정을 하지 않게 하기 위한 목적으로 스프링 프레임워크의 서브 프로젝트로부터 시작되었다. 따라서 예를 들면 스프링 부트를 사용해서 프로젝트를 진행하면 web.xml 파일을 만들지 않아도 된다.
의도적으로 애플리케이션 서버 위에서 스프링 부트 애플리케이션을 실행해야 하는 상황이 아니라면, 애플리케이션 서버 없이도 스프링 부트 애플리케이션을 실행할 수 있다. 대부분의 경우 스프링 부트의 기본 설정 내용만으로도 애플리케이션을 만들고 가동하는데 충분하다.

스프링 부트는 무엇인가?

스프링 부트는 자바 웹 애플리케이션 개발에 드는 노력을 줄이기 위해 2014년 4월에 처음 출시되었다. 스프링 부트는 스프링 프레임워크에서 사용되는 미리 정의된 형식을 따름으로써 애플리케이션 개발자가 빠르게 개발 과정을 시작할 수 있게 해준다.
스프링 부트는 스프링 프레임워크와 개발자 사이에 존재하는 계층으로서 설정을 단순화해주는 역할을 한다고도 볼 수 있다.
개발자가 사용하는 스프링 컴포넌트를 스프링 부트가 자동으로 설정해준다.

스프링 부트 핵심 기능

많은 프레임워크 사이에서 스프링 부트에서 주목할 기느은 무엇일까?

  • 빠른 시동 - 스프링 애플리케이션 개발을 빨리 시작할 수 있다. 전통적으로 스프링만으로 웹 어플리케이션을 개발하다면 다음과 같은 과정을 먼저 수행해야 한다.
  1. 스프링 MVC 의존 관계를 추가하고 Maven 이나 Gradle 프로젝트 설정
  2. 스프링 MVC DispatcherServlet 설정
  3. 애플리케이션 컴포넌트를 WAR 파일로 패키징
  4. WAR 파일을 아파키 톰캣 Apache Tomcat 같은 서블릿 컨테이너에 배포

스프링 부트를 사용하면 개발자는 애플리케이션에 필요한 의존 관계를 명시하기만 하면 되고 나머지는 스프링 부트가 알아서 해준다.

  • 자동 구성(autoconfiguration) - 스프링 부트는 클래스패스 에 있는 JAR 파일이나 여러가지 설정 파일에 지정된 프로퍼티 정보를 바탕으로 스프링 애플리케이션에 필요한 최소한의 컴포넌트를 알아서 자동으로 구성해준다. 예를들어 클래스 패스 H2 인메모리 데이터베이스 드라이버 JAR 파일이 있으면 스프링 부트는 H2 데이터베이스 연결에 필요한 데이터 소스를 자동으로 구성해준다.

  • 미리 정의된 방식(Opinionated) - 스프링 부트는 미리 정의된 방식을 따른다. 그래서 스프링 애플리케이션을 실행할 때 필요한 몇 가지 컴포넌트를 스타터(starter) 의존 관계를 기준으로 자동으로 구성한다. 스타터 의존 관계는 애플리케이션 개발의 특정 영역을 대상으로 관련된 의존 관계를 포함하고 있다.

    예를 들어 웹 애플리케이션을 만들때 spring-boot-starter-web 의존 관계만 추가하면 spring-web, spring-webmvc 처럼 웹 애플리케이션 개발에 필요한 의존관계를 클래스패스에 전부 넣어준다.

  • 독립 실행형(standalone) - 스프링 부트 애플리케이션은 웹서버를 내장하고 있어서 외부 웹 서버나 애플리케이션 서버 없이 독립적으로 설치되어 실행할 수 있다. 스프링 부트 애플리케이션은 실행 가능한 JAR 파일로 패키징 되어 java - jar 명령으로 간단하게 실행할 수 있다. 덕분에 스프링 부트 애플리케이션은 쉽게 컨테이너화 될 수 있고, 클라우드 네이티브(cloud-native) 애플리케이션 개발에도 적합하다.

  • 실제 서비스 환경에 사용 가능(production-ready) - 스프링 부트에는 헬스 체크, 스레드 덤프를 수행하고 기타 유용한 측정지표를 보여주는 기능이 포함돼 있어서, 실제 서비스 환경에 배포된 애플리케이션 모니터링이나 유지 관리를 손쉽게 수행할 수 있다.

스프링 부트 컴포넌트

스프링 부트는 애플리케이션 개발 특정 영역에 특화돼 있는 여러가지 컴포넌트로 구성돼 있다. 일부 핵심 컴포넌트는 거의 모든 스프링 부트 프로젝트에서 사용된다.

  • spring-boot : 스프링 부트의 기본 컴포넌트로서 다른 컴포넌트를 사용할 수 있도록 지원한다. 예를들어 SpringApplication 클래스는 몇 가지 정적 메서드를 가지고 있으며 독립 실행형 스프링 부트 애플리케이션을 생성한다. spring-boot 컴포넌트에는 톰캣 같은 내장 웹 서버 지원 기능과 데이터베이스 연결 정보 같은 애플리케이션 설정 정보 외부화 지원 기능이 포함돼 있다.

  • spring-boot-autoconfigure : 스프링 부트 애플리케이션 자동 구성 기능을 담당하는 컴포넌트로서 클래스 패스와 설정 파일의 프로퍼티에 지정된 의존 관계를 바탕으로 스프링 bean을 추론해서 알맞은 빈을 생성한다. 하지만 사용자가 설정한 빈이 있다면 스프링 부트 자동 구성 기능으로 추론되는 빈 대신에 사용자가 설정한 빈이 생성된다.

  • spring-boot-starter : 스타터는 개발자 편의를 위해 제공되는 미리 패키징된 의존관계 기술서 descriptor 모음이다. 스프링 부트 스타터는 스프링과 스프링의 여러 기술을 개발자에서 쉽게 제공해준다. 스타터가 없으면 개발자가 관련 의존 관계를 모두 직접 설정해야 한다.

  • spring-boot-CLI : 그루비Groovy 코드를 컴파일하고 실행할 수 있는 개발자 친화적 명령행 도구로서, 파일 내용 변경을 감지하는 기능이 있어서 애플리케이션에 수정사항이 발생할 때마다 직접 재부팅을 할 필요가 없다. 개발자는 CLI 도구 덕분에 메이븐이나 그레이들같은 의존 관계 관리 도구로부터 벗어날 수 있다. 또한 의존 관계나 관리를 빌드 관련 문제에 대한 걱정 없이 프로토타입 애플리케이션을 아주 빨리 만들 수 있게 해준다.

스프링 부트 시작하기

스프링 부트 프로젝트

스프링 이니셜라이저를 사용하면 스프링부트 프로젝트의 뼈대를 쉽게 생성할 수 있다. https://start.spring.io/ 에 접속해서 스프링 이니셜라이저를 사용할 수 있다.

스프링 부트 프로젝트 구조

스프링 이니셜라이저를 통해 자동 생성된 스프링 부트 프로젝트 구조는 상대적으로 단순하며 , 스프링 부트 애플리케이션 개발을 시작하는데 필요한 최소한의 컴포넌트만으로 구성되어 있다.

  • 스프링 이니셜라이저에서 스프링 부트 프로젝트 생성 시 지정한 의존 관계가 들어있는 pom.xml 파일
  • 메이븐을 로컬 컴퓨터에 설치하지 않고도 프로젝트를 빌드할 수 있게 해주는 메이븐 래퍼wrapper 파일
  • 소스 코드와 테스트 코드를 분리해서 담고 있는 패키지 구조, 소스 패키지에는 메인 메서드가 있는 자바 클래스가 포함되어 있고, 테스트 패키지에는 비어 있는 테스트 클래스가 들어 있다.
  • application.properties 파일이 들어 있는 리소스 폴더, 프로젝트를 진행하면서 사용할 여러가지 파일을 추가할 수 있다.

메이븐 pom.xml파일
생성된 프로젝트에 포함되어 있는 pom.xml 파일 내용은 다음과 같다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?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> <!-- 1. 이 프로젝트가 스프링 부트 프로젝트의 하위 프로젝트임을 나타내기 위해  
    스프링 부트 스타터 페런트를 지정한다. 이렇게 하면 애플리케이션에 사용할 플러그인이나 
    의존 관계 관리를 스프링 부트에 맡길 수 있다.-->
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.2.0</version> 
		<relativePath/> <!-- 메이븐 리포지터리에서 parent를 가져온다 -->
	</parent> <!-- 1 -->


	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>17</java.version>
	</properties>



	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

        <!-- spring-starter-web , spring-boot-starter-test 등 메이븐 의존 관계 목록 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
        <!-- spring-boot-starter-test는 제이유닛, 햄크레스트, 모키토 같은 인기 있는 라이브러리를 사용해서 편리하게 스프링 부트 애플리케이션을 테스트할 수 있도록 지원한다. 이때 제이유닛5 를 사용하기 위해 기존의 래거시 junit-vintage-engine은 제외한다.  -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>


	</dependencies>


	<build>
		<plugins>
        <!-- 스프링 부트 메이븐 플러그인은 여러가지 애플리케이션 관리 활동을 도와주는 플러그인이다.-->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

pom.xml 파일은 크게 세가지 부분으로 구성되어 있다.

  1. parent 태그
  2. dependancies 태그
  3. 스프링 부트 메이븐 플러그인

spring-boot-starter-parent는 모든 스프링 부트 스타터 의존 관계의 부모 스타터이다.spring-boot-starter-parent를 명시하면 프로젝트가 자식 스프링 부트 프로젝트로서 부모 프로젝트의 몇 가지 부분을 확장한다는 것을 나타낸다.

spring-boot-starter-parent는 기본 자바 버전 지정과 스프링 부트 프로젝트에서 사용되는 몇가지 메이븐 플러그인에 대한 기본 설정을 제공하는 특별한 유형의 스타터이다.

생성된 프로젝트에는 spring-boot-starter-web과 spring-boot-starter-test 이렇게 2개의 스타터 의존 관계가 포함되어 있다. spring-boot-starter-web 에는 웹 애플리케이션을 만드는데 필요한 여러가지 JAR 파일이 들어 있고, spring-boot-starter-test 에는 애플리케이션 테스트 케이스 작성을 도와주는 여러 JAR 파일이 들어 있다.

pom.xml 파일의 끝 부분에는 spring-boot-maven-plugin이 있다. 이 플러그 인은 애플리 케이션 관리 활동을 편리하게 수행할 수 있도록 도와 준다.

스프링 부트 메인 클래스

스프링 이니셜라이저가 생성해준 프로젝트의 Application.java 소스 살펴보면 다음과 같이 main() 메서드를 가지고 있는 자바 클래스가 생성된 것을 확인할 수 있다.

1
2
3
4
5
6
7
@SpringBootApplication
public class SpringBootAppDemoApplication {
    public static void main(String[]args){
        SpringApplication.run(SpringBootAppDemoApplication.class, args);
    }
}
@SpringBootApplication

이 애너테이션은 @EnableAutoConfiguration, @ComponentScan, @SpringBootConfiguration 이렇게 3개의 애너테이션을 포함하고 있다.

@EnableAutoConfiguration

스프링 부트에는 @Enable로 시작하는 여러 가지 애너테이션이 있다. @EnableAutoConfiguration은 애플리케이션 클래스패스에 있는 JAR 파일을 바탕으로 애플리케이션을 자동으로 구성해주는 스프링 부트 자동 구성 기능을 활성화 한다.

@ComponentScan

애플리케이션에 있는 스프링 컴포넌트를 탐색해서 찾아낸다. 스프링 컴포넌트는 @Component, @Bean 등이 붙어 있는 자바 빈으로서 스프링을 관리하다. @ComponentScan 애너테이션이 붙어 있으면 스프링 부트 애플리케이션은 애너테이션에서 지정한 디렉터리와 그 하위 디렉터리를 모두 탐색해서 스프링 컴포넌트를 찾아내고, 라이프사이클을 관리한다.

@SpringBootConfiguratin

스프링 부트 애플리케이션 설정을 담당하는 클래스에 이 애너테이션을 붙인다. 내부적으로 @Configuration을 포함하고 있어서 이 설정 클래스는 스프링 부트 컴포넌트 탐색으로 발견되며 이 클래스 안에서 정의된 빈도 스프링으로 발전해 로딩된다. 결과적으로 이러한 빈을 통해 애플리케이션 설정 과정에 참여한다.

This post is licensed under CC BY 4.0 by the author.

[자바의 정석] 14장 람다와 스트림(Lambda & Stream)

-