티스토리 뷰

개요

오늘날 Spring Framework을 빼고 Java EE를 논한다는 것은 불가능에 가까울 정도로 Spring은 독보적인 위치의 프레임워크로 군림하고 있다. Spring의 핵심 개념인 DIIoC를 이해하려면 이론 뿐만 아니라 반복적인 연습과 소스 코드 분석이 필수이다. 이번 글에서는 Eclipse에서 Maven, Spring 3 기반의 Hello, World! 프로젝트를 작성해 보고자 한다. 준비물로 JDKEclipse IDE for Java Developers가 설치되어 있어야 한다. 설치 방법은 지난 글을 참고한다.

Hello, World! 프로젝트 생성

첫 시작으로 Eclipse를 실행하고 프로젝트를 생성할 차례이다.

  • 메뉴에서 File -> New -> Other -> Maven -> Maven Project를 선택하고 Next 버튼을 클릭한다.
  • Select project name and location 화면이 나온다. Create a simple project (skip archetype selection)을 체크하고 Next 버튼을 클릭한다.
  • Group Id에는 com.jsonobject를, Artifact Id에는 spring-helloworld를 입력하고 Finish 버튼을 클릭한다.
  • Maven Project를 생성하는 과정에서 Could not calculate build plan 오류가 발생할 수 있는데 원인은 다양하지만 Eclipse를 종료하고 %HOMEPATH%(Windows 기준) 경로에 위치한 .m2 폴더를 삭제한 후에 재시작하면 대부분 해결된다.

프로젝트 빌드

프로젝트가 생성되었으면 본격적인 클래스 작성에 앞서 Spring Framework의 라이브러리 의존성 정보를 추가할 차례이다.

  • pom.xml 파일을 열고 /project/dependencies 엘러먼트에 아래 내용을 추가한다. 저장 후 프로젝트명을 마우스 우클릭하고 Run As -> Maven install을 실행한다.
<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.2.11.RELEASE</version>
  </dependency>
</dependencies>
  • 빌드시 ArtifactDescriptorException: Failed to read artifact descriptor for 오류가 발생할 수 있는데 이 경우 프로젝트명을 마우스 우클릭하고 Maven -> Update Project -> Force Update of Snapshots/Releases -> OK을 실행하면 해결된다.

@Configuration 클래스 작성

가장 먼저 컨테이너에 의해 생성될 Bean을 정의할 Configuration 클래스를 생성할 차례이다.

  • File -> New -> Class 메뉴를 실행하여 ApplicationConfig 클래스를 생성하고 아래와 같이 작성한다.(클래스명은 어떤 이름을 주어도 상관 없다.)
package com.jsonobject.example.spring;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class ApplicationConfig {

    @Bean
    public String helloWorld() {
        return "Hello, World!";
    }
}
  • 클래스에 @Configuraition 어노테이션을 명시하여 Bean을 정의한 클래스임을 선언한다. Bean이라는 용어를 처음 접하면 헷갈릴 수 있는데 Bean은 단순한 Object에 불과하다. 다만 일반적인 Object와 다른 점은 new 연산자를 사용하여 생성하지 않고 Spring FrameworkIoC Container에 의해 생성되어 생명주기가 관리된다는 것이다. 이 클래스는 바로 이러한 컨테이너에 의해 생성되어 관리될 Bean을 정의한 메타데이터의 역할을 한다.
  • 추가로 클래스에 @ComponentScan 어노테이션을 명시하면 컨테이너 시작시 @Component 어노테이션이 명시된 클래스를 찾아내어 Bean을 생성한다.(@Component 외에 @Repository, @Service가 명시된 클래스 또한 찾아낸다.)
  • 메써드에 @Bean 어노테이션을 명시하면 반환하는 클래스 타입으로 메써드명의 이름을 가진 Bean을 생성한다. Bean 생성의 순서를 따지면 @Component -> @Bean 순서로 Bean이 생성된다.

@Component 클래스 작성

Bean으로 생성될 @Component 클래스를 작성할 차례이다. 아래와 같이 HelloWorldService 클래스를 작성한다.

package com.jsonobject.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class HelloWorldService {

    @Autowired
    private String helloWorld;

    public String getMessage() {
        return helloWorld;
    }
}
  • 클래스에 @Component 어노테이션을 명시하면 앞서 설명했듯이 Configuration 클래스의 Bean으로 별도 선언하지 않아도 컨테이너 시작시 자동으로 Bean을 생성한다. 별도의 옵션을 주지 않을 경우 클래스명의 첫 문자만 소문자로 바뀌어 Bean이 생성된다. 위의 경우 helloWorldService라는 이름으로 Bean이 생성된다. 애플리케이션 개발시 Service, DAO 등의 싱글턴 성격의 클래스에 주로 사용한다.
  • 클래스의 멤버에 @Autowired 어노테이션을 명시하면 멤버명과 동일한 이름을 가진 Bean이 자동으로 주입된다. 위의 경우 앞서 Configuration 클래스에서 선언한 helloWorld 이름의 Bean이 주입된다.

main() 메써드 작성

package com.jsonobject.example;

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

public class Application {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
        HelloWorldService helloWorldService = (HelloWorldService) context.getBean("helloWorldService");
        System.out.println(helloWorldService.getMessage());
    }
}
  • AnnotationConfigApplicationContext 클래스를 사용하여 Spring FrameworkIoC Container를 시작한다. 앞서 작성한 Configuration 클래스를 생성자의 파라메터로 전달하여 실행하면 앞서 선언한 Bean들이 생성된다.
  • ApplicationContext 인터페이스가 제공하는 getBean() 메써드를 사용하여 생성된 Bean을 획득할 수 있다. 위의 경우 Hello, World!가 콘솔 화면에 출력된다.

참고 글


댓글
댓글쓰기 폼