본문 바로가기
교재 실습/자바 웹 개발 워크북

150. Gradle 적용

by Jint 2022. 11. 13.

이번 절에서는 실습 웹 프로젝트 'SPMS'에 Gradle을 적용해 본다. Gradle을 사용한 의존 라이브러리 관리 방법을 경험해 본다.

 

1. Gradle 적용 준비

Git 저장소에서 가져온 'Lesson08'프로젝트(교재에서 제공하는 프로젝트)의 step01 폴더에 들어 있는 소스를 실습 프로젝트 'web08' 폴더로 복사한다(그림 1). step01 폴더의 파일은 이전 장에서 실습한 웹 프로젝트 파일(web07 프로젝트)를 Gradle 구조에 맞게 준비한 것이다.

그림 1 (web08 프로젝트의 소스 폴더 구조)

 

- 프로젝트의 자바 소스 폴더 구조

web08 프로젝트는 Gradle 프로젝트이기 때문에 7장에서 만든 프로젝트의 폴더 구조와 다르다. web08 프로젝트의 소스 폴더 구조는 다음과 같다.

가) src/main/java는 Gradle 프로젝트에서 자바 소스를 두는 폴더이다. spms 자바 패키지가 이 폴더에 있다.

나) src/main/resources는 기타 설정 파일을 두는 폴더이다. Log4J를 설정하는 log4j.properties 파일을 이 폴더에 두어야 한다.

다) src/main/webapp는 웹 콘텐츠 파일(.html, .css, .gif, .css, .jsp 등)을두는 폴더이다. 이전 강의에서 만든 웹 프로젝트의 WebContent 폴더(예 : web07/WebContent)와 같다.

그 외 src/test/java와 src/test/resources 폴더는 테스트와 관련된 자바 소스 파일과 기타 파일을 두는 폴더이다. 현재 테스트 관련 파일이 없기 때문에 이 폴더는 비어 있다.

 

2. Gradle 설정에 의존 라이브러리 추가

실습 소스를 복사해 온 다음에 'Project Explorer' 뷰나 'Package Explorer' 뷰로 web08 프로젝트를 살펴보면 자바 소스에 오류가 있다고 표시된다(그림 2).

그림 2 (web08 프로젝트의 소스 오류)

마이바티스와 Reflections API 등 관련 클래스 및 인터페이스를 찾을 수 없어 발생한 오류이다. 이러한 오류는 Gradle 설정 파일에서 의존 라이브러리를 추가하면 간단히 해결할 수 있다.

web08/build.gradle 파일을 열고 다음과 같이 의존 라이브러리를 추가한다.

//참고링크 : https://webfirewood.tistory.com/129
//참고링크 : https://linkeverything.github.io/study/springboot/add-library/

plugins {
	id 'org.springframework.boot' version '2.3.1.RELEASE'
	id 'io.spring.dependency-management' version '1.0.9.RELEASE'
	id 'java'
}

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

configurations {
	compileOnly {
			extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	
	//스프링 라이브러리
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	
	//MyBatis
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
	
	//Log4j
	implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
	implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
	
	//Reflections
	implementation 'org.reflections:reflections:0.9.5-RC2'
	
	//Servlet API
	compileOnly 'javax.servlet:javax.servlet-api:3.0.1'
	
	//JSTL
	implementation 'javax.servlet:jstl:1.2'
	
	implementation 'org.springframework.kafka:spring-kafka'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.h2database:h2'
	runtimeOnly 'mysql:mysql-connector-java'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation('org.springframework.boot:spring-boot-starter-test') {
		exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
	}
	testImplementation 'org.springframework.kafka:spring-kafka-test'
	testImplementation 'org.springframework.security:spring-security-test'
}

test {
	useJUnitPlatform()
}

 

3. Gradle 빌드

이제 Gradle 설정에 따라 빌드를 수행해 본다. 프로젝트 컨텍스트 메뉴에서 'Gradle'을 선택한 뒤 하위 메뉴에서 'Refresh Gradle Project'를 클릭하여 Gradle 빌드를 실행한다(그림 3, 그림 4).

그림 3 (web08 프로젝트의 Gradle 빌드 실행)
그림 4 (web08 프로젝트의 Gradle 빌드 실행 결과)

 

이후 부터는 교재에서의 내용이다.

 

2. Gradle 설정에 의존 라이브러리 추가

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'

compileJava.options.encoding = 'UTF-8'
sourceCompatibility = 1.7
version = '1.0'

eclipse {
  wtp {
    facet {
      facet name: 'jst.web', version: '3.0' // Servlet Spec Version 지정
      facet name: 'jst.java', version: '1.7' // Java Version 지정, 1.7 ...
    }
  }
}

jar {
  manifest {
    attributes 'Implementation-Title': 'Gradle Quickstart', 
                'Implementation-Version': version
  }
}

repositories {
  mavenCentral()
}

dependencies {
  providedCompile 'javax.servlet:javax.servlet-api:3.0.1'
  compile 'jstl:jstl:1.2'
  compile 'org.reflections:reflections:0.9.9-RC1'
  compile 'log4j:log4j:1.2.17'
  compile 'mysql:mysql-connector-java:5.1.30'
  compile 'org.mybatis:mybatis:3.2.6'
  compile 'org.springframework:spring-context:4.0.3.RELEASE'
  compile group: 'commons-collections', 
        name: 'commons-collections', 
        version: '3.2'
  testCompile group: 'junit', 
            name: 'junit', 
            version: '4.+'
}

test {
  systemProperties 'property': 'value'
}

uploadArchives {
  repositories {
    flatDir {
      dirs 'repos'
    }
  }
}

- providedComplie - 컴파일에서 사용, 배포에서 제외

'providedComplie' 명령을 사용하여 의존 라이브러리를 등록하면, 해당 라이브러리는 컴파일할 때 사용되지만 배포 파일에는 포함되지 않는다. 앞의 Gradle 설정 파일에서 서블릿 API를 등록할 때 이 명령어를 사용하였다.

providedCompile 'javax.servlet:javax.servlet-api:3.0.1'

'javax.servlet'은 라이브러리 그룹 이름이고, 'javax.servlet-api'는 라이브러리 이름이다. '3.0.1'은 라이브러리 버전이다. 여기서 주목해야 할 것은 의존 라이브러리를 설정할 때 사용한 명령어가 'compile'이 아니라 'providedCompile'이라는 것이다.

서블릿 API 라이브러리에 대해 이렇게 설정한 이유는 웹 애플리케이션이 서블릿 컨테이너(예 : 톰캣 서버)에 배치되면 그 서버에서 제공하는 서블릿 API를 사용할 것이기 때문이다. 그래서 컴파일할 때만 사용하라고 'providedCompile' 명령으로 설정하였다.

 

- compile - 컴파일에서 사용, 배포에 포함

'compile' 명령으로 설정된 의존 라이브러리는 컴파일할 때 사용되고, 배포 파일(.war)에도 포함된다. 다음 의존 라이브러리들은 'compile' 명령을 사용하여 등록하였다.

compile 'jstl:jstl:1.2'
compile 'org.reflections:reflections:0.9.9-RC1'
compile 'log4j:log4j:1.2.17'
compile 'mysql:mysql-connector-java:5.1.30'
compile 'org.mybatis:mybatis:3.2.6'

추가한 의존 라이브러리는 JSTL과 Reflections API, Log4J, MySQL JDBC 드라이버, mybatis 프레임워크 라이브러리이다. 이런 라이브러리는 톰캣 서버에서 제공하지 않기 때문에 웹 애플리케이션을 배치할 때 함께 배포해야 한다. 그래서 'compile' 명령어를 사용한 것이다.

compile 'org.springframework:spring-context:4.0.3.RELEASE'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'

스프링 프레임워크 라이브러리는 당연히 'compile' 명령을 사용하여 추가하였고, commons-collections와 junit 라이브러리는 Gradle 프로젝트를 생성할 때 자동으로 추가된 라이브러리라서 나중에 사용될 것을 대비해 그냥 두었다.

 

- testCompile - 단위 테스트 실행 시에 사용, 배포에서는 제외

junit 라이브러리는 단위 테스트를 실행할 때만 사용될 라이브러리이므로 'testCompile' 명령을 사용하였다.

 

3. Gradle 빌드

Gradle 빌드 작업은 다음 순서로 지정한 다음 빌드를 실행한다.

:clean

:eclipse

:build

▶ clean, 먼저 기존의 빌드 결과물을 삭제한다. 즉 web08/build 폴더를 삭제한다.

▶ eclipse, 이클립스 관련 파일들(.project, .classpath, .setting/* 등)을 다시 생성한다.

▶ build, 준비가 끝났으면 컴파일 및 배포 파일을 생성한다.

 

4. 톰캣 서버에 웹 애플리케이션 배치 및 실행

톰캣 서버에 웹 프로젝트 'web08'을 배치하고 실행한다. Servers 뷰의 톰캣 실행환경에 web08 프로젝트를 추가한다(그림 5).

그림 5 (톰캣 실행 환경에 web08 프로젝트 추가)

톰캣 서버를 시작시킨다. 웹 브라우저에서 http:localhost:9999/web08/project/list.do 페이지를 요청한다. 프로젝트 목록에서 신규 프로젝트 등록, 변경, 삭제를 테스트하면 이전과 마찬가지로 정상적으로 수행한다.

이제 예제 프로젝트(SPMS)에 Gradle 적용을 완료하였다. 다음 절에서는 SPMS 프로젝트에 스프링 IoC 컨테이너를 적용해 본다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글