본문 바로가기

프로그래밍/Spring & MyBatis

Spring + Gradle 연동하기

두번째 과제는 


Spring + Gradle 연동하기


이다.


표현이 조금 애매하긴 한데, 결국 Gradle(이하 그래들)로 빌드 해서 Hello World 찍는 과제였다.


교육기간중에 그래들은 사용해 본적이 없어서 멘땅에 헤딩하는 기분으로 접근을 시작했다.


(안드로이드 교육을 받으면서 잠깐 보기는 했다. 그때는 그래들이 뭔지도 몰랐지만...)


우선 그래들을 다운받았다.


https://gradle.org/gradle-download/




메이븐과 마찬가지로 적당한 폴더에 압축을 풀고 사용하기 위함이다.


물론 나는 STS 를 사용하기 때문에 대쉬보드에 검색하면 쉽게 설치가 가능하다.



이렇게 대쉬보드에서 확장 플러그인을 쉽게 설치 할 수 있다.



검색해서 체크하고 우측하단의 인스톨만 클릭하면 된다.


나는 이미 설치가 되어 있어서 검색해도 안나오더라.



아무튼 다시 나처럼 수동으로 그래들을 설치하였다면,


위와같이 설정창에서 그래들의 위치를 직접 설정해 줘야 한다.


메이븐과 달리 로컬 저장소도 직접 설정할 수 있다.



그래들 프로젝트를 새로 생성하였다.



대충 프로젝트 이름을 입력하고,


샘플 프로젝트를 지정한 다음 Finish를 누르면 끝


이런 구조의 프로젝트가 생성된다.


그래들에서 가장 중요한 파일은 build.gradle 인것 같다.


이 파일은 메이븐에서 pom.xml과 비슷하다.


대략 어떻게 빌드를 해야하는지에 대한 설계도 정도 인것 같다.


여기서 라이브러리 주입을 하는 것도 같았다.


build.gradle


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
62
63
64
65
66
67
68
69
70
71
72
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'
 
sourceCompatibility = 1.8
targetCompatibility = 1.8
 
version = '1.0'
 
//버전 관리
def version = [
    spring: '4.3.4.RELEASE',
    servletAPI: '3.1.0',
    commonsCollections: '3.2.1',
    junit: '4.12',
    slf4j: '1.7.12'
]
 
//프로젝트를 빌드하고 나면 프로젝트 정보도 같이 지워지는데, Gradle 프로젝트임을 인식 시켜준다
//프로젝트 우클릭시 [run as] - [gradle build]가 표시되도록 해준다
eclipse {
    project.natures "org.springsource.ide.eclipse.gradle.core.nature"
    wtp {
        facet {
            facet name: 'jst.web', version: '3.1' // Servlet Spec version 지정
            facet name: 'jst.java', version: '1.8' //Java version 지정
        }
    }
}
 
//jar 파일에 대해서 설정한다
jar {
    manifest {
        attributes 'Implementation-Title''Gradle Quickstart',
                   'Implementation-Version': version
    }
    //manifest : MANIFEST.MF 파일에 들어갈 속성=값 정보를 설정한다. 이 파일은 jar 파일 안에 META-INF에 들어간다.
    
}
 
//의존 라이브러리를 가져올 저장소 설정
repositories {
    mavenCentral()
    //mavenCentral() : Maven 중앙 서버를 저장소로 지정한다. 서버의 기본 URL은 http://repo1.maven.org/maven2/이다.
}
 
//의존성 라이브러리 주입
//여기에 의존성 추가해준 라이브러리들이 자동으로 빌드된다.
dependencies {
    providedCompile "javax.servlet:javax.servlet-api:${version.servletAPI}"
    compile "org.springframework:spring-webmvc:${version.spring}"
    compile "org.slf4j:slf4j-api:${version.slf4j}"
    compile group: 'commons-collections', name: 'commons-collections', version: "${version.commonsCollections}"
    testCompile group: 'junit', name: 'junit', version: "${version.junit}"
}
 
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' //인코딩을 UTF-8로 통일 
 
//test 정보를 설정한다
test {
    systemProperties 'property''value'
}
 
//아카이브파일(.jar) 배포를 설정한다
uploadArchives {
    repositories {
       flatDir {
           dirs 'repos'
       }
    }
}
 
cs



역시 설명을 위해 주석을 과하게 달아 놓았기 때문에 더이상의 자세한 설명은 생략한다.


HomeInitializer.java


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
package com.imex.Test;
 
import javax.servlet.Filter;
 
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
 
public class HomeInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
 
    //root application context 에서 제공된 환경설정, 구성요소 등을 명세하는 메소드
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }
 
    //dispatcher servlet application context 에서 제공된 환경설정, 구성요소 등을 명세하는 메소드
    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return new Class<?>[] {HomeConfig.class};
    }
    
    //요청을 위한 문자 인코딩을 명세하는 메소드
    @Override
    protected Filter[] getServletFilters() {
        // TODO Auto-generated method stub
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceEncoding(true);
        
        return new Filter[] {characterEncodingFilter};
    }
 
    //DispatcherServlet을 위한 맵핑을 명세하는 메소드
    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[] {"/"};
    }
    
    //spring MVC 의 흐름
    /*
     * 1. 어떤 요청이 들어오면 DispatcherServelt(Front Controller)이 해당 요청을 받는다.
     * 2. HandlerMapping을 통해 해당 Request에 맞는 Controller를 찾아 맵핑 시킨다.
     * 3. 맵핑된 Handler의 메소드를 호출한다.
     * 4. Request를 처리 후 타입에 맞는 결과를 리턴하거나 종료된다.
     */
 
    
 
}
 
cs



HomeConfig.java


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
package com.imex.Test;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
 
@Configuration
@EnableWebMvc
public class HomeConfig extends WebMvcConfigurerAdapter{
 
    //Bean: 스프링 컨테이너에 의하여 관리되기 위한 객체를 생성하는 메소드를 가리킵니다. 
    @Bean
    public HomeController homeController(){
        return new HomeController();
    }
 
    //컨트롤러에서 리소스를 인식하기 위한 함수
    //addResourceHandlers: 특정한 URL 경로 패턴을 가지는 자원들을 서비스 하기 위한 핸들러를 추가합니다.
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
        //즉, /resources/~ 라는 경로를 가진 자원들을 처리하도록 설정 하고 있습니다.
    }
    
    //컨트롤러에서 jsp와 맵핑하기 위한 함수
    //ViewResolver: view들을 이름을 가지고 구별하여 구현하기 위한 인터페이스 입니다.
    @Bean 
    public ViewResolver getViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
        
    }
    
    
}
 
cs



HomeController.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.imex.Test;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class HomeController {
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(){
                        
        return "home";
    }
}
 
cs



home.jsp


1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Spring Gradle Test</title>
</head>
<body>
    <h1>Spring Gradle Test</h1>
    <p>Hello World ~~~!!!</p>
</body>
</html>
cs




정상적으로 Hello World 를 찍었다.


과제를 완료하였으니 보고를 하였다.


그러자 기습적인 질문을 받게 되었다.


메이븐과 그래들로 각각 빌드를 하였을때 war 파일은 어디에 생성 되는가?


그래들을 처음(?) 접한 나로써는 대답할 길이 없었고, 부랴부랴 검색을 하여 그 답을 찾았다.


War 파일 생성 위치

1. Maven

Maven의 경우, 해당 project의 workspace -> target folder 내부에 생성된다


2. Gradle

Gradle의 경우, build 시에 war 를 추가 해 주어야 war 파일이 생성되고,

해당 project의 workspace -> build -> libs folder 내부에 생성된다


덤으로 빌드 하는 방법은 아래와 같다.



프로젝트를 우클릭하여 Context 메뉴를 불러온다.


Run As -> Gradle Build... 을 선택한다.



위와같이 타이핑하고 Apply -> Run 을 클릭한다.



출처: http://aristatait.tistory.com/66 [aristataIT]