본문 바로가기
CS

스프링 부트

by 원만사 2020. 8. 22.
반응형

1. 스프링 부트

 웹 애플리케이션에서 스프링을 사용할 때는 다양한 모듈들의 설정을 적용 후 사용해야 한다. 따라서 시작하는 입장에서는 많은 설정들이 부담스럽고 실제로 구현해야 하는 비즈니스 로직과는 관련 없이 스프링 설정 오류 때문에 초반에 많은 시간을 허비하기도 한다.

 -> 이러한 문제를 해결하기 위해서 스프링 부트를 만들었다. 스프링 부트는 커맨드 도구를 제공하고 톰캣(Tomcat)이나 제티(Jetty) 같은 웹 애플리케이션 서버를 내장해서 실행을 간소화했다.

 

1.1 스프링 부트의 프로젝트 레이아웃

 자바 기반에서 개발을 진행할 때 결과 파일 포맷은 크게 두 가지로 구분할 수 있다.

(1) JAR - 로컬에서 실행

(2) WAR - 웹 애플리케이션 컨테이너에서 실행

 각 파일들은 프로젝트 파일들을 압축한 압축 파일이다. 각 압축 파일들이 JVM과 웹 애플리케이션 컨테이너가 인식하도록 하기 위해서 내부 폴더 규격이 다르다. 특히 WAR는 정적 자원들(JSP, HTML, CSS)과 자바 클래스 파일들이 함께 있으므로 WEB-INF 폴더를 기준으로 클래스 폴더들이 위치하고 있다.

 

 스프링 부트는 기본적으로 Runnable JAR로 실행되므로 WAR 규격에 맞춰서 WEB-INF 폴더를 만들거나 webapp 폴더를 만들지 않고 웹 자원들을 사용하기 위한 몇 가지 규약을 제공한다.

 

웹 자원 경로
정적 HTML 파일 src/main/resources/static
src/main/public
웹 페이지 대표 아이콘(Favicon) src/main/resources/favicon.ico
템플릿 src/main/resources/templates
(템플릿 엔진)
html - Thymeleaf
tpl - Groovy
ftl - Freemarker
vm - velocity

 이와 같이 웹 자원들을 해당 규약에 맞는 곳에 두면 웹을 위한 별도의 폴더를 만들지 않고 사용할 수 있다.

 

1.2 스프링 부트 실행하기

 Maven이나 Gradle과 같은 빌드 도구를 사용해서 스프링 부트를 사용할 수 있다. Gradle은 기존 Maven의 단점을 다수 개선한 빌드 툴이다. Maven의 XML 기반 pom 파일 대신 Groovy DSL을 사용해 가독성뿐만 아니라 직접 빌드 스크립트를 짜거나 플러그인을 호출하며, 빌드 과정을 프로그래밍하듯 할 수 있다. 

 

[빌드 관리 도구란?]

· 프로젝트에 작성한 java 코드와 프로젝트 내에 필요한 각종 파일들을 JVM이나 WAS가 인식할 수 있도록 해키징 해주는 빌드 과정을 자동화해주는 도구라고 할 수 있다.

· 개발에 필요한 다양한 외부 라이브러리들을 번거롭게 모두 다운받을 필요 없이, 빌드 도구 설정 파일에 필요한 라이브러리 종류와 버전들, 종속성 정보를 명시하여 필요한 라이브러리들을 설정 파일을 통해 자동으로 다운로드해주고 이를 간편히 관리해주는 도구이다.

 

[Maven]

· JAVA용 프로젝트 관리 도구

· 빌드 중인 프로젝트, 빌드 순서, 다양한 외부 라이브러리 종속성 관계를 pom.xml 파일에 명시한다.

· Maven은 외부저장소에서 필요한 라이브러리와 플러그인들을 다운로드 한 다음, 로컬 시스템의 캐시에 모두 저장한다.

 

[Gradle]

· Groovy 언어를 사용한 Domin-Specific-Language를 사용한다(Maven보다 코드가 훨씬 간결)

· Gradle은 프로젝트의 어느 부분이 업데이트 되었는지 알기 때문에, 빌드에 점진적으로 추가할 수 있다.

· 업데이트가 이미 반영된 빌드의 부분은 더 이상 재실행되지 않는다(따라서 Maven에 비해 빌드 시간이 훨씬 단축될 수 있다.)

 

[Maven vs Gradle]

 Maven에서 JUnit에 몇가지 플러그인(Maven CheckStyle, FindBugs 및 PMD)을 추가하면 다음과 같이 할 수 있다.

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
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>2.12.1</version>
    <executions>
        <execution>
            <configuration>
                <configLocation>config/checkstyle/checkstyle.xml</configLocation>
                <consoleOutput>true</consoleOutput>
                <failsOnError>true</failsOnError>
            </configuration>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>findbugs-maven-plugin</artifactId>
    <version>2.5.4</version>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-pmd-plugin</artifactId>
    <version>3.1</version>
    <executions>
        <execution>
            <goals>
                <goal>check</goal>
            </goals>
        </execution>
    </executions>
</plugin>
cs

 Gradle에서는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
apply plugin:'java'
apply plugin:'checkstyle'
apply plugin:'findbugs'
apply plugin:'pmd'
version ='1.0'
repositories {
    mavenCentral()
}
dependencies {
    testCompile group:'junit', name:'junit', version:'4.11'
}
cs

훨씬 간결해지고 가독성도 높아졌다.

 


스프링 부트는 기본적으로 JAR 형태로 동작한다. 그래서 main 메소드를 이용해서 실행한다. main 메서드가 실행되면 내장된 톰캣이 실행되고 웹을 통해 접근할 수 있다.

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

@SpringBootApplication이 없다면 컨트롤러 클래스들을 읽을 수 있도록 스캔 패키지를 지정하는 ComponentScan과 설정임을 나타내는 @Configuration 그리고 미리 정의된 xxxConfiguration 클래스들을 읽을 수 있도록 하는 @EnableAutoConfiguration 어노테이션이 필요하다.

1
2
3
@ComponentScan(basePackages = "info.thecodinglive.controller")
@Configuration
@EnableAutoConfiguration
cs

 

이 세 가지 어노테이션을 @SpringBootApplication 으로 대체할 수 있다.

 

2. 템플릿 엔진

 자바 웹 개발 시에는 JSP로 페이지를 만드는데, 서버 쪽 내용을 표현하기 위해 스크립트릿(<% %>) 태그 안에 로직을 작성한다. 그런데 이렇게 하면 스크립트릿과 html 태그가 혼재된 상태가 되고, 조건문이나 반복문이 들어가면 html 태그들을 반복해서 붙여 넣기 해야 해서 추후에 수정이 어렵다. 

 이런 문제들을 해결할 수 있는 게 템플릿 엔진(Template Engine)이다. 간단히 말해서 템플릿 엔진이란, 서식과 데이터를 결합한 결과물을 만들어 주는 도구이다. 서식은 html과 같은 마크업에 해당하고 데이터는 데이터베이스에 저장된 데이터를 뜻한다.

 

[템플릿 엔진의 필요성]

1. 많은 코드를 줄일 수 있다. 

    - 대부분의 템플릿 엔진은 기존의 HTML에 비해서 간단한 문법을 사용한다.

2. 재사용성이 높다.

    - 웹페이지 혹은 웹앱을 만들 때 똑같은 디자인의 페이지에 보이는 데이터만 바뀌는 경우가 굉장히 많다.

3. 유지보수에 용이하다.

    - 하나의 Template을 만들어 여러 페이지를 렌더링하는 작업에는 또 다른 이점이 있다.

 

[문법]

 다른 블로그 참고

 

※ 참고 : https://jisooo.tistory.com/entry/Spring-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Maven%EA%B3%BC-Gradle-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0

반응형

'CS' 카테고리의 다른 글

PCB  (0) 2020.08.29
Process / Thread  (0) 2020.08.28
REST  (1) 2020.08.22
Gradle  (0) 2020.08.22
SOLID 원칙  (1) 2020.08.14

댓글