많은 경우에 `JAVA`를 이용한 웹개발 환경은 **스프링프레임워크**를 사용한다. **스프링프레임워크**는 `JAVA` 웹개발 환경의 표준이라고 말해도 우습지 않을만큼 많이 사용 되어지고 있다. **스프링프레임워크**를 이용해 개발을 하기 위해선 우선적으로 환경을 구성해야 한다.
### 스프링프레임워크 환경 구성시 요구되는 것들
- 프로젝트에 요구되는 갖가지 의존성과 빌드환경 구성
- `DispatcherServlet`을 선언한 `web.xml` 파일 또는 `WebApplicationInitializer`의 구현
- `MVC`를 사용할 수 있는 환경 구성
- `HTTP`요청에 응답할 컨트롤러 클래스
- 애플리케이션을 배포할 웹 애플리케이션 서버
각 환경마다 다를 수 있지만 일반적으로 이러한 것들이 필요하다고 느껴지는 부분들을 나열한 것이다. 우리는 이런 **스프링프레임워크** 개발환경을 구성하기 위해 문서를 참조하거나 공개된 설정 예제를 검색하는 등 사용하는 라이브러리 의존성과 **스프링프레임워크**의 버전까지 고려해가며 작업을 해야한다. 못해도 꼬박 하루이틀 이상은 걸릴 수도 있는 일이다.
헌데 이런 작업들을 살펴보면 결국 **보일러플레이트**라고 봐도 무방할 정도로 항상 거의 동일한 환경구성을 보여준다. 일반적으로는 소속된 조직에서 주로 사용되는 잘 구성된 환경정보를 가져와서 사용하는 일도 부지기수니까 말이다. 이렇게 반복되고 복잡한 **스프링프레임워크**의 환경구성 작업으로부터 벗어날 수 있는 방법은 없을까? `"누가 대신 해줬으면 좋겠다."`라고 생각해본적이 있다면 **스프링부트**를 사용할 때다!
# 스프링부트(Spring Boot) ?
**스프링부트**는 스프링 애플리케이션을 개발하는데 있어 필요한 의존성과 `XML`구성등의 일반적인 공통 시나리오를 자동으로 구성해주고 개발자는 즉시 애플리케이션 로직 개발을 시작할 수 있도록 지원하는 도구이다.
## 구성 자동화
`REST API`서버를 만들거나 `MVC`환경을 만들거나 여기에 필요한 데이터베이스, 뷰 템플릿 등을 구성하는데 있어서 **스프링부트**는 자동구성을 지원한다. 필요한 라이브러리 의존성을 안전성을 확인한 버전으로 조합하여 미리 준비된 구성으로 제공하는가 하면 `spring-boot-starter`를 사용하면 의존성을 자동으로 추가할 뿐 아니라 필요한 기능 유형을 지정하게 된다. 의존성을 추가하고 사용하도록 활성화하는 등의 작업을 **스프링부트**가 알아서 처리해주고 미리 구성된 `application.properties`(또는 `application.yml`)에 프로퍼티 값을 지정하는것 만으로도 애플리케이션의 작동을 제어할 수 있게 된다. 얼마나 편한가?
## 특징
**스프링부트**의 특징은 다음과 같다.
- 모든 스프링 개발환경에 빠르게 접근
- 요구사항을 빠르게 처리할 수 있는 기본 설정값
- 프로젝트 환경 구축에서 요구되는 기능 외적인 것들을 제공(내장형 웹서버, 시큐리티, 측정, 외부설정 등)
- 시작하기 위해 XML 기반 설정이나 코드를 요구하지 않음
**스프링부트**는 구성을 자동화 할 뿐만 아니라, 내장된 톰캣(웹서버)를 이용해 별도의 웹서버 환경없이 즉시 단독으로 애플리케이션을 실행할 수도 있다. 기본적으로 요구되는 요구사항들을 처리하기 위해 프로퍼티를 통한 설정값을 제어할 수 있도록 하고, **스프링부트**를 시작하기 위해 XML 기반 설정파일이나 코드를 요구하지도 않는다. **스프링부트**는 정말 쉽게 시작할 수 있다. 다음으로는 이런 **스프링부트**를 이용해 `"Hello World!"`를 출력하는 예제를 보도록 하자.
# 스프링부트 시작 예제
백문이 불여일견이라 했다. [Spring Boot Reference - Getting Startd](http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/#getting-started)를 참고해 `HTTP[GET]`요청을 보내고 `"Hello World!"`를 응답받는 서버 애플리케이션을 만들어 보도록 하자.
## 시스템 요구사항
- JAVA 7+ (JAVA 8 권장)
- Spring Framework 4.3.3.RELEASE
- Maven 3.2+ (or Gradle 1.12 or 2.x)
>위 요구사항은 `Spring Boot 1.4.1.RELEASE`를 기준으로 하였음.
## 설치
설치하는 방법은 다양하지만 이 포스팅에서는 `Maven`을 사용하도록 한다.
### 1. Maven 프로젝트 생성
우선 `Maven`프로젝트를 하나 생성한다.
```
Project
- src
ㄴ main
java
resources
ㄴ test
pom.xml
```
>프로젝트를 생성하면 일반적인 구조와 더불어 `pom.xml`파일이 생성된다.
### 2. 스프링부트 설치(spring-boot-starter)
`pom.xml`파일을 열어서 다음 내용을 추가한다.
```xml:line-numbers
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<!-- Add typical dependencies for a web application -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!-- Package as an executable jar -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
```
>**스프링부트**를 이용해 웹 애플리케이션을 개발하기 위한 설치와 구성이 끝났다.
놀랍게도 `spring-boot-starter`의존성을 추가하기만 하면 자동으로 관련 의존성과 구성준비가 완료된다. 정말 끝이다.
### 3. SpringBootApplication 작성
**스프링부트**애플리케이션을 사용하기 위해서는 하나의 자바 파일이 필요하다. 해당 파일에는 `main()`메소드가 필요한데 그 이유는 내장 애플리케이션서버를 이용한 단독실행이나 실행시 커맨드라인을 통해 `args`인자를 받아들이기 위해 요구된다.
```java:line-numbers
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
```
> `@SpringBootApplication`어노테이션이 눈에 띄는데, 이는 일반적으로 사용하는 `@Configuration`, `@EnableAutoConfiguration`, `@ComponentScan` 을 편하게 사용하도록 제공되는 것이다. 편의를 위해 제공되는 것이니 직접 필요한 애노테이션들을 직접 사용해도 상관없다.
### 4. 본격 코드 작성
모든 준비와 구성과 설정이 끝났다. 그 어떤 `XML`설정을 할 필요도 없다. 이제 `Controller`를 작성하면 된다.
```java:line-numbers
@RestController
public class MyController {
@GetMapping("/")
String home() {
return "Hello World !";
}
}
```
>`@GetMapping`은 `Spring Framework 4`부터 편의를 위해 지원되는 어노테이션으로 `@RequestMapping(method = GET)`과 동일하다.
여기까지 따라왔다면 프로젝트 구조는 다음과 같을 것이다.
```
Project
- src
ㄴ main
java
ㄴ com.eglowc
ㄴ web
MyController.java
Application.java
resources
ㄴ test
pom.xml
```
### 5. 실행
**스프링부트**애플리케이션을 실행하는 방법은 여러가지가 있는데 여기서는 `Maven`을 이용한 실행방법을 설명한다. 다른 방법은 [Spring Boot Reference Guide](http://docs.spring.io/spring-boot/docs/1.4.1.RELEASE/reference/htmlsingle/)를 참고하기 바란다.
```cmd
$ mvn spring-boot:run
```
커맨드창에 `mvn spring-boot:run`을 실행하면 내장톰캣을 이용해서 기본포트인 `8080`포트로 톰캣이 실행된다. 이제 웹브라우저에서 `localhost:8080`으로 접속해보면 `Hello World!` 메시지를 만나볼 수 있다.
![spring boot helloworld](https://t1.daumcdn.net/cfile/tistory/270B053557E28BEC09)
# 결론
**스프링부트**를 이용해서 빠르게 `Hello World !` 웹 애플리케이션을 만들어보았다. 구성의 자동화와 단독실행 뿐만 아니라 **스프링부트**는 다양한 스타터를 통해 편의기능들을 제공하고 있다. 이 짧은 포스팅에서 모든걸 다 다룰수 없으므로 여기서 글을 마치도록 하겠다. 아마 **스프링부트**를 처음 접하게 되면 자동구성 때문에 자유도가 떨어진다고 오해할 수도 있지만 부분적인 수정이나 덮어쓰기 또한 가능하고 사용되는 의존성의 버전도 입맛대로 변경할 수 있다. 다만, 서로 참조하는 의존성간의 버전 안전성을 직접 테스트해야 하므로 이미 안정성이 통과된 자동구성을 신뢰하는게 나쁘지 않은 선택일 것이다.
#
환경의 자동구성을 통해 개발자는 애플리케이션 로직 개발을 위해 즉시 작업을 수행할 수 있게됐다. 이렇게 편한 **스프링부트**를 사용하지 않을 이유는 없다고 생각한다. 물론 사용하는 사람의 선택에 달린 문제이지만 **스프링프레임워크**를 이용한 애플리케이션을 개발한다면 꼭 **스프링부트**의 도입을 고려해보길 추천한다.
# 같이보기
- [[책] 스프링부트 코딩 공작소](http://eglowc.tistory.com/36) 리뷰