[SpringBoot] Springboot 프로젝트 만들어보기
FRAMEWORK/Spring

[SpringBoot] Springboot 프로젝트 만들어보기

반응형

시작하기 전에

하기 포스팅은 "스프링부트 시작하기(김인우 저)" 책을 공부하며 적은 포스팅입니다.

 

SpringBoot의 장점

Spring 프레임워크는 웹 어플리케이션에서 사용되는 많은 기능을 제공합니다. 다만, 해당 기능을 제대로 사용하기 위해서는 많은 작업이 필요합니다. 따라서, 개발자는 프로젝트의 비즈니스 로직을 고민하는 것 외에 프레임워크 사용을 위해 아래와 같은 여러 작업을 진행해야 했습니다.

  • 라이브러리 추가 및 의존성 관리
  • 스프링 프레임워크가 처리할 작업 인지할 수 있도록 구성 및 설정 파일 작성

 

이런 불편함을 해소하기 위해 나온 것이 SpringBoot입니다. SpringBoot의 주요 장점은 아래와 같습니다. 하기 장점들을 통해 쉽고 빠르게 개발을 할 수 있게 되었습니다.

  • 프로젝트에 따라 자주 사용되는 라이브러리들이 미리 조합되어 있음
  • 복잡한 설정 자동으로 처리
  • 내장 서버를 포함하고 있어 Tomcat과 같은 서버를 추가 설지하지 않아도 됨
  • Tomcat이나 Jetty와 같은 WAS(Web Application Server)에 배포하지 않고도 실행할 수 있는 JAR 파일로 웹 어플리케이션 개발

SpringBoot로 프로젝트 생성하기

먼저, SpringBoot 프로젝트를 생성해보겠습니다.

 

1. File > New > Spring Starter Project를 선택하여 새 스프링 부트 프로젝트를 생성합니다. 이때, New에 나온 항목 중 Spring Starter Project가 없다면, Other...를 눌러 검색하여 찾아주면 됩니다.

 

Spring Starter Project는 윈도우의 설치 마법사와 같이 손쉽게 SpringBoot 기반 프로젝트를 생성해줍니다. 

Spring Starter Project가 없으면 Other...을 눌러 Spring Starter Project를 검색하고 Next > 클릭

2. 설치 마법사에서 프로젝트명, 빌드 관리 도구 및 자바 버전, 패키지 등 프로젝트 기본사항을 설정합니다. 노트북에 깔린 JDK 버전이 11인 관계로, Java Version은 11로 되어 있습니다. "스프링부트 시작하기" 책에서는 Gradle을 빌드 관리 도구로 사용하기 때문에, Maven으로 설정되어 있다면 Gradle로 바꾸었습니다.

 

스프링 프레임워크는 웹 프로젝트를 만들 때 다양한 라이브러리를 하나하나 추가해야 했습니다. SpringBoot 역시 개발자가 해당 프로젝트에 필요한 의존성을 찾아 추가해야 하지만, 일반적으로 사용하는 의존성 그룹을 보여주어 해당 부분을 쉽게 추가할 수 있게 되어 있습니다.

 

웹 프로젝트를 만들 것이기 때문에 Spring Web 의존성을 체크하고, 개발 생산성 향상을 위한 Spring Boot DevTools 의존성을 체크합니다. 

왼쪽 사진은 프로젝트 기본사항 설정, 중간/오른쪽 사진은 의존성 및 스프링부트 버전 설정

프로젝트에 필요한 의존성을 추가하면 Gradle을 이용하여 여러 라이브러리들을 자동으로 다운로드하고, 해당 내역이 이클립스 콘솔창에 표시됩니다. Maven이나 Gradle와 같은 빌드 관리 도구가 없었을 때에는 프로젝트에 필요한 라이브러리들을 각각 찾아 프로젝트에 포함시켜야 했습니다. 하지만, 빌드 관리 도구를 사용하면 단순히 의존성만 추가함으로써 쉽게 의존성 관리 및 라이브러리 다운이 가능합니다.

 

3. 설치 마법사를 통해 프로젝트를 생성하면, 아래 사진과 같은 구조로 프로젝트가 생성됩니다. 몇 가지의 패키지와 폴더, 파일들이 생성되는데, 이는 일반적인 Gradle 프로젝트 구조입니다.

Gradle 프로젝트 구조

4. 코드 한 줄 쓰지 않은채, 먼저 프로젝트가 정상적으로 생성되었는지 테스트하도록 하겠습니다. 프로젝트를 클릭하고, 툴바 중 초록색 재생 버튼(사실상 버튼 옆의 ▼)을 클릭합니다. 해당 버튼을 누른 뒤 Run As > Spring Boot App를 클릭하면 프로젝트를 실행할 수 있습니다.

Spring Boot App 실행

Spring Boot 프로젝트를 실행하면 아래와 같이 로그가 콘솔에 찍힘을 확인할 수 있습니다. 아래 로그 중 빨간 박스 표시가 된 부분이 뜨면 프로젝트가 정상적으로 생성된 것입니다.

Spring Boot 실행 시 로그

  • embedded.tomcat.TomcatWebServer: Tomcat started on port(s): 8080 (http) with context path ''
  • sample.SampleApplication: Started SampleApplication in 1.214 seconds (JVM running for 1.771)

위 두 개 로그는 sample 프로젝트가 tomcat으로 실행되었으며, 8080 포트를 사용한다는 것을 알려줍니다. 그리고, 실행되는 데 1.214 초가 걸렸음을 의미합니다. 앞서 개발환경을 설정할 때 Tomcat을 따로 설치하지 않았습니다만, SpringBoot는 tomcat 서버를 내장하고 있어 무리 없이 프로젝트가 실행됨을 알 수 있습니다.

왜 브라우저에서 error가 날까?

http://localhost:8080를 호출하면 아래와 같은 에러 페이지가 출력됩니다. 이는 잘못된 것 같아 보일 수 있지만, 정상적인 결과입니다. 이는 현재 프로젝트를 생성만 하여, SpingBoot 프로젝트 생성 시 자동으로 진행되는 프로젝트의 실행에 관한 기능만 설정되었기 때문에 발생한 일입니다. 즉, 화면에 보이는 부분은 자동으로 만들어지지 않기 때문에 따로 코드를 작성하여야 해당 페이지가 제대로 뜨게 됩니다. 

브라우저에서 실행하기

SpringBoot Hello World !

프로젝트를 생성까지만 하면, 웹 프로젝트임에도 웹에서 확인이 되지 않으므로, 화면에 간단하게 출력이 되도록 구성을 해보도록 하겠습니다.

 

1. sample 패키지 안에 controller 패키지를 생성합니다. sample 패키지를 우클릭한 후 New > Package를 클릭합니다. New Java Package 창에서 Name을 sample.controller로 지정하여 controller를 생성합니다.

Controller 패키지 생성

2. controller 패키지를 우클릭한 후 New > Class를 선택합니다. New Java Class 창에서 Name을 HelloController로 설정하여 HelloController.java 파일을 생성합니다.

Class 파일 생성

3. HelloController.java 내에 아래와 같이 작성하여 http://localhost:8080 호출 시, SpringBoot Hello World!가 띄워질 수 있도록 합니다.

package sample.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
	
	@RequestMapping("/")
	public String hello() {
		return "SpringBoot Hello World!";
	}
}
  • @RestController 어노테이션을 이용하여 해당 클래스가 REST 컨트롤러 기능을 수행할 수 있도록 합니다. 
  • @RequestMapping 어노테이션은 해당 메소드를 실행할 수 있는 주소를 설정합니다. 여기서는 "/"에 대해 설정했으므로 http://localhost:8080/ 호출 시 해당 메소드가 실행됩니다.
  • public String hello()SpringBoot Hello World! 메시지를 화면에 전달해주는 역할을 합니다. 해당 메소드 바로 위에 있는 @RequestMapping 어노테이션에서 설정한 주소가 호출되면 해당 주소와 연관된 메소드가 실행됩니다. 

4. 3번에서 작성한 소스 코드를 저장하고 프로젝트를 재실행하면, 브라우저에서 http://localhost:8080 호출 시 아래와 같이 출력되는 것을 확인할 수 있습니다.

http://localhost:8080과 http://localhost:8080/은 동일

이 때, 프로젝트 생성 후 돌렸던 SpringBoot App은 꼭 종료하고 실행해야 합니다. 그렇지 않으면, 8080 포트에 이미 프로세스가 떠 있다는 경고 메시지를 받게 됩니다.

기존 프로세스 콘솔창 상단 오른쪽의 ■ 버튼을 클릭해서 Shutting down 로그 확인 후 새로 돌려야 함 

SpringBoot 프로젝트 구조 알아보기

이번에는, 위에서 만든 프로젝트를 가지고 SpringBoot 프로젝트 구조를 알아보도록 하겠습니다.

프로젝트의 논리적 구조(eclipse에서 보여지는 프로젝트 구조)

프로젝트의 주요 파일 및 구조

프로젝트의 주요 파일 및 구조 의미
src/main/java 자바 소스 디렉토리
SampleApplication.java 어플리케이션을 시작할 수 있는 mani 메소드가 존재하는 스프링 구성 메인 클래스
templates 스프링부트에서 사용 가능한 여러 가지 뷰 템플릿(Thymeleaf, Velocity, FreeMarker 등) 파일 위치
static 스타일 시트, 자바스크립트, 이미지 등 정적 리소스 디렉토리
application.properties 어플리케이션 및 스프링 설정 등에서 사용할 여러 프로퍼티(property) 정의
Project and External Dependencies Gradle에 명시한 프로젝트의 필수 라이브러리 모음
src JSP 등 리소스 디렉토리
build.gradle Gradle 빌드 명세, 프로젝트에 필요한 라이브러리 관리, 빌드 및 배포 설정

SpringBoot 어플리케이션에는 이 외에도 몇 가지 폴더와 파일이 있습니다. test 폴더에는 JUnit을 이용한 테스트 클래스가 있으며, Gradle 폴더 및 gradlew, gradlew.bat은 Gradle 설정 및 실행 관련 스크립트 정보를 가지고 있습니다.

 

SampleApplication 클래스

SampleApplication은 스프링부트 어플리케이션의 구성과 실행을 담당하는 중요한 클래스입니다. SpringBoot의 장점 중 하나인 자동 구성최소한의 설정으로 바로 실행할 수 있는 어플리케이션을 만들어준다는 것을 의미합니다. SampleApplication.java 파일은 아래와 같이 구성됩니다.

/* SampleApplication.java */
package sample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SampleApplication {

	public static void main(String[] args) {
		SpringApplication.run(SampleApplication.class, args);
	}

}
  • @SpringBootApplication
    • @SpringBootApplication 어노테이션은 SpringBoot 어플리케이션의 핵심 어노테이션으로, Spring의 3가지 어노테이션으로 구성되어 있습니다.
    • @EnableAutoConfiguration
      • SpringBoot의 장점 중 하나인 자동 구성을 할 수 있게 도와주는 어노테이션입니다. @EnableAutoConfiguration 어노테이션을 사용하면, Spring의 다양한 설정이 자동으로 완료됩니다.
    • @ComponentScan
      • 기존 Spring은 빈(bean) 클래스를 사용하기 위해 XML에 빈을 각각 선언해야 했습니다. 하지만, @ComponentScan 어노테이션을 사용하면 컴포넌트 검색 기능을 활성화자동으로 여러 컴포넌트 클래스를 검색하고 검색된 컴포넌트 및 빈 클래스를 Spring 어플리케이션 컨텍스트에 등록하는 역할을 합니다.
      • 예를 들어, @RestController 어노테이션을 사용하여 스프링 MVC 컨트롤러를 만들 수 있습니다. 이는 컴포넌트 자동 검색 및 구성에 의해 해당 컴포넌트를 사용할 수 있도록 한 것입니다.
    • @Configuration
      • @SpringBootApplication 어노테이션에는 @Configuration 어노테이션이 직접적으로 포함되어 있지는 않습니다. 다만, @SpringBootConfiguration 어노테이션이 포함되어 있고, 해당 어노테이션에 @Configuration이 포함되어 있습니다.
      • @Configuration이 붙은 자바 클래스는 자바 기반 설정 파일임을 의미합니다. 따라서, @Configuration을 쓰면 해당 자바 클래스가 설정 파일임으 스프링 프레임워크에 알려줍니다.
      • Spring 3.x 버전까지는 자바 기반의 설정 파일이 아닌 XML 기반 설정에 오랜 시간을 투자해야 했습니다. 다행히, Spring 4.x 버전이 출시되면서, 자바 기반 설정이 가능해졌습니다.
  • SpringApplication.run() 메소드
    • SpringBoot 프로젝트의 장점 중 하나가 Tomcat과 같은 WAS(Web Application Server)에 배포하지 않고도 실행할 수 있는 JAR 파일로 웹 어플리케이션을 개발할 수 있다는 점이었습니다.
    • main 메소드는 SpringBoot의 SpringApplication.run() 메소드를 사용하여 SpringBoot 어플리케이션을 실행시킵니다.
    • 위에서 sample 패키지를 구성할 때에 XML 파일을 따로 만들지 않았습니다. 심지어, 웹 어플리케이션에 꼭 있어야하는 web.xml도 사용하지 않았습니다. 이렇게, SpringBoot로 생성된 어플리케이션은 순수 자바만을 이용해서 개발할 수 있도록 해줍니다.

build.gradle

build.gradle은 Gradle로 생성된 프로젝트의 빌드를 관리하는 파일입니다. build.gradle은 다음과 같이 구성되어 있습니다.

/* build.gradle */
plugins {
	id 'org.springframework.boot' version '2.4.1'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
	useJUnitPlatform()
}
  • plugins
    • 프로젝트를 빌드하기 위한 작업(예: 컴파일, jar 파일 생성)을 해주는 플러그인들을 적는 부분입니다.
    • 각 플러그인들은 필요한 과정들을 task로 가지고 있어 필요한 과정을 내부에서 진행합니다.
  • repositories
    • SpringBoot 프로젝트에서 사용하는 라이브러리를 받아오는 저장소를 설정합니다.
    • 기본적으로는 위와 같이 기본 저장소인 Maven Repository는 mavenCentral()로 설정하면 됩니다.
    • 외부 저장소를 넣어 사용할 수도 있습니다. 이 때에는 maven { url "http://repo.spring.io/snapshot" }과 같이 외부 저장소 주소를 설정하면 됩니다. 이렇게 설정하면, 기본 저장소에 없는 라이브러리도 사용할 수 있습니다.
  •  dependencies
    • 프로젝트에서 필요한 라이브러리 의존성을 설정하는 부분입니다.
    • SpringBoot starter로 프로젝트를 생성할 때 주입한 의존성이 해당 내용에 나타납니다. 따라서, 처음에 선택한 SpringBoot Web('org-springframework.boot:spring-boot-starter-web')와 SpringBoot DevTools('org.springframework.boot:spring-boot-devtools')에 대한 의존성이 나타나 있습니다.
    • 프로젝트를 진행하며 필요한 라이브러리들을 추가해주면, Gradle이 알아서 필요한 라이브러리들을 다운로드합니다.
반응형