메이븐과 그레이들 두 가지를 모두 소개하고 있지만 책의 뒷부분은 거의 메이븐으로 되어있는 것 같아 나도 메이븐으로 진행하였다.
찾아보니 메이븐보다 그레이들이 훨씬 유지보수도 쉽고 성능도 좋다고 한다.. 다음에는 그레이들을 사용해 봐야겠다.
pom.xml은 메이븐 프로젝트에 대한 설정 정보를 관리하는 파일이다.
소스를 다 적기엔 너무 길기 때문에 주요한 내용만 정리해보도록 하겠다.
<artifactId>sp5-chap02<artifactId>
프로젝트의 식별자 지정
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.6.RELEASE</version>
</dependency>
</dependencies>
dependencies는 의존 관리를 위한 설정 정보를 작성하는 곳이다.
의존을 추가한다는 것은 자바 어플리케이션 클래스 패스에 spring-context 모듈을 추가한다는 것을 의미한다. 메이븐은 코드를 컴파일하거나 실행할 때 메이븐 로컬 리포지토리에 dependency로 설정한 아티팩트 파일이 있는지 검사하고, 있을 경우 해당 파일을 사용하고 없을 경우에는 메이븐 중앙 원격 리포지토리에서 해당 파일을 다운로드하여 로컬 리포지토리에 저장 후 사용한다.
프로젝트에서 사용할 spring-context 모듈의 버전을 설정해 주었다.
책이랑 동일한 버전으로 작성하니 버전 문제가 조금 있어서 나는 5.1.6 RELEASE를 사용하였다.
cf. 의존 전이
메이븐 프로젝트를 컴파일 해보면 내가 dependency에 추가한 아티팩트 파일 말고도 온갖 파일이 우수수 다운로도 되는걸 볼 수 있다.
왜 이럴까?
내가 다운로드한 파일이 의존하는 파일들을 또 다운로드하고 그 파일이 의존하는 파일들을 또 다운로드하고 ... 이렇게 되기 때문이다.
이걸 의존 전이라고 부른다.
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.verion}</source>
<target>${java.verion}<</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
${java.version} 기준으로 자바 소스 컴파일
마찬가지로 버전 문제 때문에 나는 메이븐 플러그인 3.7.0 대신 3.8.1을 사용했다.
pom.xml과 기본 폴더 구조를 생성했으면 이클립스에서 메이븐 프로젝트로 임포트 하면 된다.
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;
}
}
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;
}
}
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();
}
}
AnnotationConfigApplicationContext 자바 설정에서 정보 읽어와 빈 객체를 생성하고 관리함
AnnotationConfigApplicationContext 객체를 생성할 때 AppContext 클래스를 생성자 파라미터로 전달한다. 이때 @Bean 설정 정보를 읽어와 Greeter 객체를 생성하고 초기화한다.
getBean() 메서드는 AnnotationConfigApplicationContext가 자바 설정을 읽어와 생성한 빈 객체를 검색할 때 사용된다. getBean() 메서드의 첫 번째 파라미터는 빈 객체의 이름, 두 번쨰 파라미터는 검색할 빈 객체의 타입이다.
스프링의 핵심 기능은 객체를 생성하고 초기화 하는 것
이와 관련된 기능은 ApplicationContext라는 인터페이스에 정의되어 있으며 AnnotationConfigApplicationContext 클래스는 이 인터페이스를 알맞게 구현한 클래스 중 하나다.
ApplicationContext(또는 BeanFactory)는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어 스프링 컨테이너라고도 불린다.
스프링은 기본적으로 하나의 @Bean 애노테이션에 대해 한 개의 빈 객체만을 생성한다. 이때 빈 객체는 싱글톤 범위를 갖는다고 표현한다. 따라서 다음과 같이 코드를 작성하여도, g1과 g2는 같은 객체임을 확인할 수 있다.
package chap02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main2 {
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();
}
}