Spring4 ) #1: Hello World

사전 준비 사항: 아래 글을 읽었거나, 준비가 된 상태.

(준비) Gradle 설치하기 – Spring4
(준비) STS 및 Gradle Support plugin 설치

STS와 Spring4를 이용해 console에 “Hello World”라고 출력하는 간단한 프로그램을 만들어 보자. 이번에는 STS의 도움을 받지 않고, 수작업으로 해 보도록 하겠다. 처음 부터 자동으로 하게 되면, 뭐가 어찌 어찌 된 건지 알기 어렵기 때문이다.

1. Project 생성

“File > New > Other”를 클릭한다.

demo1

“General – Project”를 선택하고 (Next) click

demo2

Project name에 “demo1″이라고 입력하고, (Finish) 버튼 click한다. 그러면, 아래와 같이 일반 프로젝트가 텅빈 상태로 생성된다.

demo1-1

이제, 프로젝트 위에 마우스를 올려 놓고, 오른 마우스를 click하여 팝업메뉴가 나타나면, “New > Configure > Convert to Gradle Project” 를 클릭한다. 그러면, Console에 “BUILD SUCCESSFUL”이라는 메시지가 나타나고, 프로젝트 아이콘이 “G”가 붙은 폴더 아이콘으로 변경될 것이다.

demo1-3

2. 코드 작성

이제 코드를 작성해 보자. 먼저 demo1 Project를 선택하고, 오른 마우스를 클릭하여 나타나는 팝업 메뉴에서 “Property” 메뉴를 선택하자.

demo1-4

위와 같은 화면이 나타날 것이며, 왼쪽 리스트에서 “Java Build path”를 선택하여 나타난 오늘쪽 화면에서 “Source” tab를 선택하고, 다시 (Add folder) 버튼을 클릭한다. 새로운 팝업화면이 나타나고, 입력박스에 “src/main/java”를 입력한 후 (Finish) 버튼을 클릭한다. 그러면, 아래와 같은 화면으로 바뀔 것이다.

demo1-6

이번에는 gradle의 설정 파일인 build.gradle을 project folder에 아래와 같이 생성한다.

demo1-1

apply plugin: 'application'
mainClassName = 'demo.Application'
repositories {
	mavenCentral()
}
dependencies {
	compile("org.springframework:spring-context:4.1.2.RELEASE")
}

이 설정을 잠깐 살펴보면,
mainClassName이 ‘demo.Application’으로 되어 있으니, gradle로 실행을 하면, demo package의 Application이라는 class가 실행될 것이다.(아직 작성하지 않았다)

repositories에 mavenCentral()이 적혀 있으니, maven의 공식 repository를 사용한다는 뜻이고,

dependencies에 compile(‘org.springframework:spring-context:4.1.2.RELEASE’)라고 적혀 있으니, maven으로 보자면, 아래 모듈이 포함될 것이다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.1.2.RELEASE</version>
</dependency>

build.gradle의 변경 정보를 반영하기 위해, demo 프로젝트를 선택하고, 오른 마우스를 클릭하여 나타난 팝업메뉴에서 “Gradle > Refresh Dependencies” 메뉴를 클릭한다. 그러면, 아래와 같이 바뀔 것이다.

demo1-1

Maven project에서와 유사한 화면이다.  이제, 코드를 작성할 차례다. “src/main/java” folder에 demo라는 package를 만들고 아래와 같이 3개의 파일을 작성하자.

demo1-2

MessageService.java

package demo;

public interface MessageService {
	public String getMessage();
}

HelloWorldMessage.java

package demo;

public class HelloWorldMessage implements MessageService {
	public String getMessage() {
		return "Hello World";
	}
}

Application.java

package demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;

public class Application {

	@Bean
	MessageService helloWorldMessageService() {
		return new HelloWorldMessage();
	}
	
	public static void main(String[] args) {
		ApplicationContext context = 
			new AnnotationConfigApplicationContext(Application.class);
		MessageService service = context.getBean(MessageService.class);
		System.out.println(service.getMessage());
	}
}

파일들의 관계를 살펴보면, 이렇다.
MessageService.java는 interface이고, 이를 구현한 구현체는 HelloWorldMessage.java이다. 여기까지는 그 동안 보아왔던 일반적인 구조다. Application.java를 살펴보자. 눈에 띄는 것은 “@Bean”. 이것은 그동안 Spring XML 설정에서 작성해 왔던 <bean>과 같은 기능을 하는 Annotation이다. 이 덕분에, 아래 코드가 MessageService 대신, HelloWorldMessage class를 사용하게 된다.

MessageService service = context.getBean(MessageService.class);

context.getBean()에 넘겨진 MessageService.class를, spring은 구현체를 return하려고 하는데, return type이 MessageService인 설정(@Bean)을 찾아서 있으면 그것을 return하게 되는 것이다. @Bean의 영향은 잠시 뒤에 알아보도록 하자.

이제, 실행을 해볼 차례다.
demo 프로젝트를 마우스로 선택하고, 오른 마우스 버튼을 클릭 하여 나타나는 팝업 메뉴에서 “Run as > Gradle build” 메뉴를 클릭하면, 아래 화면이 나타난다. 다만, 앞으로 하게될 설정을 하고, 실행을 하게 되면, 이 화면은 나타나지 않는다. 다시 나타나게 하려면, “Run as > Gradle build…”를 선택하면 된다.

demo1-3

위 화면에 “run”을 입력하고 (Run) 버튼을 클릭하면, 실행이 된다. 결과는 console화면에서 확인할 수 있다. 아래와 같은 결과를 볼 수 있다면, 정상적으로 실행된 것이다.

[sts] -----------------------------------------------------
[sts] Starting Gradle build for the following tasks: 
[sts]      run
[sts] -----------------------------------------------------
:compileJava
:processResources UP-TO-DATE
:classes
:run11월 22, 2014 12:49:18 오전 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5e9f23b4: startup date [Sat Nov 22 00:49:18 KST 2014]; root of context hierarchy

Hello World

BUILD SUCCESSFUL

Total time: 0.567 secs
[sts] -----------------------------------------------------
[sts] Build finished succesfully!
[sts] Time taken: 0 min, 0 sec
[sts] -----------------------------------------------------

이제, @Bean의 역할을 체험할 차례다. Application.java에서 “@Bean”을 삭제하고 실행해 보라. 아래와 같은 어마무시한 에러 문자를 확인할 수 있을 것이다.

demo1-5

끝~

(준비) STS 및 Gradle Support plugin 설치

STS 설치하기

Spring Framework으로 개발한다고 하면, 그냥 Eclipse 보다는 spring.io에서 배포하고 있는 STS(Spring Tool Suite)를 사용하는 것이 좋겠다. Spring을 위한 Project 생성을 별도로 제공하고 있기 때문이다.

STS는 아래 사이트에서 다운로드 받아 압축만 풀면 끝이다. 쉽다.

http://spring.io/tools/sts

STS

Gradle Support plugin 설치하기

앞서, Gradle에 대해 간략하게 알아보았다(Gradle 설치하기 – Spring4). 이번에는 STS(Spring Tool Suite)에 Gradle support plugin을 설치하도록 하자. 재밌게도, Spring core는 gradle로 build를 하고 있다고 하는데, 정작 STS(3.6.2.RELEASE)에는 maven이 기본 설치되어 있는 반면에 gradle은 설치되어 있지 않다.

그러나, 역시 설치는 쉽다. STS를 실행하면 나타나는 Dashboard 화면을 보자. 닫아 버렸다면, 아래 메뉴를 클릭해서 다시 열 수 있다.

Help > Dashboard

gradle-1

위 Dashboard 화면에서 “IDE EXTENSIONS”를 click한다. 그러면 아래 하면이 나타날 것이다.

gradle-2

위 화면에서 “Gradle Support”를 선택하고 (Install) 버튼을 클릭한다. 그러면, 아래와 같이 다른 Plugin 설치하는 것과 동일한 화면이 나타난다.

gradle-3

주의할 것은 위 화면이 처음 나타날 때, 목록에 아무것도 안보이는 현상이 나타나기도 한다. 버그인가 본데, 이런 현상이 나타나면, 화면 크기를 줄이거나 늘리면 정상적으로 표시된다. 이제 나머지 과정은 다른 Plugin과 동일하다.

STS가 Restart 되었다면, Gradle이 정상적으로 설치되었는 지 확인해 보도록 하자. 아래 메뉴를 click 해 보자

File > New > Other...

그래서 아래와 같이 화면에 Gradle이 표시되면 정상적으로 설치된 것이다.

gradle-확인