코린이의 기록

[Spring] Spring 4 - Maven 프로젝트 생성 본문

Framework/Spring

[Spring] Spring 4 - Maven 프로젝트 생성

코린이예요 2018. 5. 3. 12:05
반응형

※ 이 포스팅은 "초보웹 개발자를 위한 스프링4 프로그래밍 입문" 책을 기반으로 작성하였습니다.

0. Prerequisite

- JDK : Java6 이상 
- Maven or Gradle
- Java 개발 툴 : Eclipse or IntelliJ

의 개발 환경(참고)

JDK: 1.8.0_91
Tomcatapache-tomcat-7.0.79-windows-x64
Maven: apache-maven-3.2.5-bin
Eclipse Version: Mars.2 Release (4.5.2)

1. 메이븐 프로젝트 생성
메이븐(Maven)이란?
- 자바 개발에 필요한 여러가지 라이브러리, 의존 모듈 등을 설치 및 관리해주는 Tool로서 apache 라이선스로 배포되는 오픈소스 소프트웨어이다. pom.xml이라는 파일에 프로젝트에 필요한 것들을 설정해두면 Maven 이 자동으로 다운로드 및 경로 지정까지 알아서 해준다. 
참고: https://mvnrepository.com/

프로젝트 생성 기준 폴더를 생성한다.
ex.
C:\spring4/sp4-chap02/src/main/java
C:\spring4/sp4-chap02/src/main/resources
※ spring4/sp4-chap02 : 프로젝트 폴더
기준 경로에 프로젝트 폴더와 java 및 resources 폴더를 생성한 후에
 pom.xml 이라는 XML 설정 파일을 spring4/sp4-chap02 프로젝트 폴더 아래에 생성한다. 

1.1 메이븐 의존 설정 (pom.xml)

C:\spring4/sp4-chap02\pom.xml

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 5 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 6 <modelVersion>4.0.0</modelVersion> 7 <groupId>sp4</groupId> 8 <artifactId>sp4-chap02</artifactId> 9 <version>0.0.1-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.springframework</groupId> 14 <artifactId>spring-context</artifactId> 15 <version>4.1.0.RELEASE</version> 16 </dependency> 17 </dependencies> 18 19 <build> 20 <plugins> 21 <plugin> 22 <artifactId>maven-compiler-plugin</artifactId> 23 <version>3.1</version> 24 <configuration> 25 <source>1.8</source> 26 <target>1.8</target> 27 <encoding>utf-8</encoding> 28 </configuration> 29 </plugin> 30 </plugins> 31 </build> 32 </project>

line 7 ~ line 9 : 기본적으로 프로젝트에 대한 정보 (version, group ID, artifact ID 등) 과 
line 11 ~ line 17 : 해당 프로젝트에서 의존하는 모듈과 
line 19 ~ line 31 : 자바 컴파일러, 자바 버전(1.8)을 설정해주었다. utf-8 로 인코딩 설정을 해줌으로 써 자바 컴파일러가 코드를 읽을 때 UTF-8로 인코딩하여 읽는다. 

이렇게 설정된 pom.xml을 maven이 읽어서 설정된 의존 파일들(dependnecy)을 다운로드 받는다.  결과적으로 위에서 설정한 "spring-context-4.1.0.RELEASE.jar" 파일을 다운로드 받게 된다. 

1.2 메이븐 Repository
pom.xml에서 설정한 의존 모듈들은 메이븐 Repository에 저장되는데, 이 메이븐 repository는 원격 repository와 로컬 repository가 있다. 즉, 메이븐은 로컬 repository에 해당 파일이 있는지 확인 후 있으면 해당 파일을 사용하고, 없으면 원격 중앙 repository에서 해당 파일을 다운로드 받아 로컬 repository에 복사하여 사용한다. 
원격 repository :http://repo.maven.apache.org 
로컬 repository(Default) :C:\[사용자홈폴더]\.m2\repository
ex. spring-context 4.1.0 은 아래 repository에 다운로드 된다. 
C:\[사용자홈폴더]\.m2\repository\org\springframework\spring-context

로컬 repository를 확인하려면?
Windows -> Preferences -> Maven -> User Settings에서 Local Repository를 확인할 수 있다.

2. 메이븐 프로젝트 Import

Project Explorer에서 우측 마우스 클릭 -> import -> import 클릭

Maven -> Existing Maven Projects -> Next
Browse -> Project (sp4-chap02)클릭
Finish

프로젝트를 생성하면 위와 같은 프로젝트 구조를 확인할 수 있다. 
Maven Dependencies : pom.xml에 설정된 artifact가 이클립스 프로젝트의 클래스 패스로 잡혀있음을 확인할 수 있다. 

의존의 전이
Q. pom.xml에 설정한 의존  artifact는 spring-context하나인데 왜 여러개의 .jar가 생긴걸까?
A. 이유는 의존성이 전이 되었기 때문이다. spring-context가 의존하고 있는 다른 artifact가 있기 때문에 spring-context를 사용하기 위하여 이것이 의존하고 있는 다른 artifact까지 다운로드 하기 때문이다.
spring-context는 spring-aop, spring-beans, spring-core, spring-expression를 의존하고 있으며 spring-core는 commons-loggin을, spring-aop는 aopalliance를 의존하고 있다. 
3. 예제 코드 작성

3.1 파일 생성
아래 Main.java, Greeter.java 파일과 applicationContext.xml 설정파일을 생성한다.

- sp4-chap02/src/main/java/Main.java : main() 메소드를 통해서 spring과 Greeter 메소드를 실행하는 클래스
- sp4-chap02/src/main/java/Greeter.java : 콘솔에 메시지를 출력하는 클래스
- sp4-chap02/src/main/resource/applicationContext.xml : 스프링 설정 파일

프로젝트 마우스 우측 클릭 -> new -> class (혹은 other -> class)

chap02 패키지를 새성하고 Class이름을 설정해준다.

같은 방법으로 main.java를 생성한다.

다음은 Resource폴더에서 applicationContext.xml 파일을 생성한다. 
resources폴더 오른쪽 마우스 우측 -> new -> other -> XML File

3.2 코드 작성

Greeter.java

1 package chap02; 2 3 public class Greeter { 4 5 private String format; 6 7 public String greet(String guest) { 8 return String.format(format, guest); 9 } 10 11 public void setFormat(String format) { 12 this.format = format; 13 } 14 }

line 7: greet() 메소드 : guest변수의 string을 받아서 새로운 format의 string을 return 하는 메소드이다. 여기서 format은 setFormat 메소드에서 설정한다.
line 11: setFormat() 메소드 : private String으로 정의한 format 변수를 set하는 메소드이다. greet 메소드에서 사용할 문자열 포멧이다. 

applicationContext.xml

1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans.xsd"> 7 8 <bean id="greeter" class="chap02.Greeter"> 9 <property name="format" value="%s, 안녕하세요!" /> 10 </bean> 11 12 </beans>

line 8 ~ line 10: 한 개의 객체를 생성하고 초기화 한다. 여기서 Bean은 스프링이 생성하는 객체를 의미한다. 
id: Bean을 구분하는 식별자
class: Bean 객체 생성 시 사용할 클래스
property: 스프링은 property tag의 name속성에 이름에서 앞글자를 대문자로 바꾼 후 set 메소드를 사용한다. 즉 name="format"으로 설정되어 있는데, Format으로 바꾼 후 setFormat 메소드를 사용한다.
위 스프링 설정 값을 자바 코드로 바꾸면 아래와 같다.
Greeter greeter = new Greeter();
greeter.setFormat("%s, 안녕하세요!");

Main.java

1 package chap02; 2 3 import org.springframework.context.support.GenericXmlApplicationContext; 4 5 public class Main { 6 7 public static void main(String[] args) { 8 GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml"); 9 Greeter g = ctx.getBean("greeter", Greeter.class); 10 String msg = g.greet("스프링"); 11 System.out.println(msg); 12 ctx.close(); 13 } 14 }

line 3: GenericXmlApplicationContext를 import 하는 이유는 XML파일로부터 설정 정보를 읽어와 빈 객체를 생성하고 관리하는 기능을 제공하기 위함이다. 
line 8:  GenericXmlApplicationContext 객체를 생성하여 이전에 설정한 applicationContext.xml 파일 경로를 지정해준다. 이는 applicationContext.xml에서 설정한 bean 설정을 읽어서 내부적으로 Greeter 객체를 생성하고 초기화하기 위함이다. 
line 9: getBean 메소드는 "greeter"라는 이름의 식별자를 가진, 그리고 Greeter.class 타입의 객체를 찾는다. 스프링 설정 파일(applicationContext.xml)에서 id="greeter"이고 class="chap02.Greeter"를 설정했다. 해당 bean 객체를 찾아서 생성한다. 
line 10: line9에서 객체를 찾았으니, 해당 객체의 메소드 greet()를 실행한다. 그리고 그 메소드의 파라미터로 "스프링"이라는 string 값을 넘겨주고 있다. 다시한번 더 설명하면 greet 메소드에서는 string 파라미터를 받아서 특정 포맷으로 바꾼 string을 리턴해주는데, 그 포맷은 "%s 안녕하세요!"였다. 
즉 String.format("%s, 안녕하세요!", "스프링"); 이 된다.

3.3 실행 결과
프로젝트 우측 클릭 -> Run As -> Java Application

4월 12, 2018 8:45:22 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
정보: Loading XML bean definitions from class path resource [applicationContext.xml] 
4월 12, 2018 8:45:22 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh 
정보: Refreshing org.springframework.context.support.GenericXmlApplicationContext@79fc0f2f: startup date [Thu Apr 12 20:45:22 KST 2018]; root of context hierarchy 
스프링, 안녕하세요! 
4월 12, 2018 8:45:23 오후 org.springframework.context.support.GenericXmlApplicationContext doClose 
정보: Closing org.springframework.context.support.GenericXmlApplicationContext@79fc0f2f: startup date [Thu Apr 12 20:45:22 KST 2018]; root of context hierarchy


개인적으로 궁금했던 것들
- .java 파일 생성시 패키지를 지정해주어야하는 이유?
- 왜 직접 클래스를 사용하여 객체를 생성하지 않고 spring 설정(applicationContext.xml)에서 bean으로 설정하는지?


반응형
Comments