pom.xml은 메이븐 프로젝트에 대한 설정 정보를 관리하는 파일로서 프로젝트에서 필요로 하는 의존 모듈이나 플로그인 등에 대한 설정을 담는다.
메이븐은 한 개의 모듈을 아티팩트라는 단위로 관리한다.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>sp5</groupId>
<artifactId>sp5-chap02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency>
위 설정은 spring-context라는 식별자를 가진 5.0.2.RELEASE라는 버전의 아티팩트에 대한 의존(dependency)을 추가하는 것이다. 여기서 의존을 추가한다는 것은 일반적인 자바 어플리케이션에서 클래스 패스에 spring-context 모듈을 추가한다는 것을 뜻한다.
메이븐은 코드를 컴파일하거나 실행할 때 <dependecy>로 설정한 아티팩트 파일을 사용한다. 아티 팩트 파일은 다음 과정을 거쳐 구한다.
- 메이븐 로컬 리포지토리에서 [그룹ID][아티팩트ID]\버전] 폴더에 아티팩트ID-버전.jar 형식의 이름을 갖는 파일이 있는 검사하고, 존재하면 이 파일을 사용한다.
- 로컬 리포지토리에 파일이 없으면 메이븐 원격 중앙 리포지토리로부터 해당 파일을 다운로드하여 로컬 리포지토리에 복사한 뒤 그 파일을 사용한다.
spring-context를 사용하려면 spring-aop, spring-beans등 다른 아티팩트도 추가로 필요하다. 따라서 메이븐은 spring-context에 대한 의존 설정이 있으면 spring-context가 의존하는 다른 아티팩트도 함께 다운로드한다.
메이븐은 의존하는 대상뿐만 아니라 의존 대상이 다시 의존하는 대상도 함께 다운로드한다. 이렇게 의존 대상이 다시 의존하는 대상까지도 의존 대상에 포함하기 때문에 이를 의존 전이(Transitive Dependencies)라고 한다.
src/../chap02/Greeter.java
package chap02;
public class Greeter {
private String format;
public String greet(String guest) {
return String.format(format, guest);
}
public void setFormat(String format) {
this.format = format;
}
}
src/../AppContext.java
package chap02;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppContext {
@Bean
public Greeter greeter() {
Greeter g = new Greeter();
g.setFormat("%s, 안녕하세요!");
return g;
}
}
@Configuration 애노테이션은 해당 클래스를 스프링 설정 클래스로 지정한다.
스프링은 객체를 생성하고 초기화하는 기능을 제공하는데, 코드가 한 객체를 생성하고 초기화하는 설정을 담고 있다. 스프링이 생성하는 객체를 빈(Bean) 객체라고 부르는데 이 빈 객체에 대한 정보를 담고 있는 메서드가 greeter() 메서드이다. @Bean 애노테이션을 메서드에 붙이면 해당 메서드가 생성한 객체를 스프링이 관리하는 빈 객체로 등록한다.
@Bean 애노테이션을 붙인 메서드의 이름은 빈 객체를 구분할 때 사용한다.
src/../Main/java
package chap02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
AppContext.class);
Greeter g = ctx.getBean("greeter", Greeter.class);
String msg = g.greet("스프링");
System.out.println(msg);
ctx.close();
}
}
ApplicationConfigApplicationContext 클래스는 자바 설정에서 정보를 읽어와 빈 객체를 생성하고 관리한다.
AnnotaitionConfigApplicationContext는 객체를 생성할 때 앞서 작성한 AppContext 클래스를 생성자 파라미터로 전달한다. AnnotationConfigApplicationContext는 AppContext에 정의한 @Bean 설정 정보를 읽어와 Greeter 객체를 생성하고 초기화 한다.
getBean()메서드는 AnnotationConfigApplicationContext가 자바 설정을 읽어와 생성한 빈 객체를 검색할 때 사용된다. 첫 번째 파라미터는 @Bean 애노테이션의 메서드 이름인 빈 객체의 이름이며, 두 번째 파라미터는 검색할 빈 객체의 타입이다.
스프링의 핵심 기능은 객체를 생성하고 초기화하는 것이다. 이와 관련된 기능은 ApplicationContext라는 인터페이스에 정의되어 있다.
BeanFactory 인터피에스는 객체 생성과 검색에 대한 기능을 정의 한다. 예를 들어 생성된 객체를 검색하는데 필요한 getBean() 메서드가 BeanFactory에 정의되어 있다. 객체를 검색하는 것 이외에 싱글톤/프로토타입 빈인지 확인하는 기능도 제공한다.
ApplicationContext 인터페이스는 메시지, 프로필/환경 변수 등을 처리할 수 있는 기능을 추가로 제공한다.
ApplicationContext(또는 BeanFactory)는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어서 ApplicationContext나 BeanFactaory 등을 컨테이너(Container)라고도 부른다.
스프링은 기본적으로 한 개의 @Bean 애노테이션에 대해 한 개의 빈 객체를 생성한다.