프로젝트 폴더(C:\spring5fs\sp5-chap02)에 pom.xml 파일을 작성한다.
메이븐 프로젝트에 대한 설정 정보를 관리하는 파일로서 프로젝트에서 필요로 하는 의존 모듈이나 플러그인 등에 대한 설정을 담는다.
메이븐은 의존하는 대상뿐만 아니라 의존대상이 다시 의존하는 대상도 함께 다운로드한다.
의존(<dependency>)에서 설정한 아티팩트가 다시 의존하는 파일도 다운로드된다.
메이븐 프로젝트를 이클립스에 임포트 한다.
1. [File]→[Import...] 에서 Maven/Existing Maven Projects 선택
2. Root Directory를 메이븐 프로젝트 폴더로 설정
3. pom.xml을 선택 후 [Finish]
프로젝트 폴더(C:\spring5fs\sp5-chap02)에 build.gradle 파일을 작성한다.
그레이들 프로젝트에 대한 설정 정보를 관리하는 파일로서 프로젝트에서 필요로 하는 의존 모듈이나 플러그인 등에 대한 설정을 담는다.
gradle을 각 개발자나 CI서버에 깔지 않고, 프로젝트에 함께 포함시켜 배포할 수 있게 해준다.
즉, 그레이들 설치 없이 그레이들 명령어를 실행할 수 있다.
1. [File]→[Import...]에서 Gradle/Exisiting Gradle Projects 선택
2. 그레이들 프로젝트 폴더를 root directory로 설정 후 [Finish]
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;
}
}
package chap02;
import org.springframework.context.annotation.*;
// 이 클래스를 스프링 설정 클래스로 지정
@Configuration
public class AppContext {
@Bean
public Greeter greeter() {
Greeter g = new Greeter();
g.setFormat("%s, 안녕하세요!");
return g;
}
}
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();
}
}
스프링은 객체를 생성하고 초기화하는 기능을 제공하며, 이 때 생성한 객체를 빈(Bean) 객체라고 부른다.
@Bean 애노테이션을 메서드에 붙이면 해당 메서드가 생성한 객체를 스프링이 관리하는 빈 객체로 등록하게 된다.
@Bean 애노테이션을 붙인 메서드는 객체를 생성하고 알맞게 초기화해야 한다. 위 코드에서는 12행에서 Greeter 객체를 초기화하고 있다.
@Bean 애노테이션을 붙인 메서드의 이름은 빈 객체를 구분할 때 사용하며, 빈 객체를 참조할 때 사용된다.
* 애노테이션 : 코드사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에 추가적인 정보를 제공하는 메타데이터이다.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppContext.class);
자바 설정에서 정보를 읽어와 빈 객체를 생성하고 관리하는 클래스이다. AnnotationConfigApplicationContext 객체를 생성할 때 AppContext 클래스를 생성자 파라미터로 전달하여 @Bean 설정 정보를 읽어오게 하여 Greeter 객체를 생성하고 초기화한다.
Greeter g = ctx.getBean("greeter", Greeter.class);
AnnotationConfigApplicationContext가 자바 설정을 읽어와 생성한 빈(bean) 객체를 검색할 때 사용된다.
첫 번째 파라미터는 @Bean 애노테이션의 메서드 이름(빈 객체의 이름)이며, 두 번째 파라미터는 빈 객체의 타입이다.
최종적으로 greeter() 메소드를 사용해서 만든 Greeter 객체를 리턴한다.
앞서 스프링의 핵심 기능은 객체를 생성하고 초기화 하는 것이라 하였다. 최상위 인터페이스인 BeanFactory는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어 컨테이너(Container)라고도 부른다. 하지만 실제로 빈의 생성과 관계설정 외에 추가적인 기능이 필요한데, 그것을 ApplicationContext에서 구현하였기 때문에 주로 ApplicationContext를 사용하며 또한 컨테이너라고 부른다.
AnnotationConfigApplicationContext 클래스는 ApplicationContext 인터페이스를 알맞게 구현한 클래스 중 하나이며 자바 애노테이션을 이용한 클래스로부터 객체 설정 정보를 가져온다.
// 1. 설정 정보를 이용해서 빈 객체를 생성한다.
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(AppContext.class);
// 2. 빈 객체를 제공한다.
Greeter g = ctx.getBean("greeter", Greeter.class);
별도 설정을 하지 않을 경우 스프링은 한 개의 빈 객체만을 생성하며, 이때 빈 객체는 '싱글톤(singleton) 범위를 갖는다'고 표현한다. 싱글톤은 단일 객체(single object)를 의미하는 단어로서 스프링은 기본적으로 한 개의 @Bean 애노테이션에 대해 한 개의 빈 객체를 생성한다.
1. 메이븐과 그레이들의 프로젝트 설정파일의 이름은 각각 무엇인가?
답: pom.xml, build.gradle
2. 메이븐은 의존하는 대상뿐만 아니라 의존 대상이 다시 의존하는 대상도 함께 다운로드한다.
이렇게 의존 대상이 다시 의존하는 대상까지도 의존 대상에 포함하는 것을 ( )라고 한다.
답: 의존 전이
3. @Configuration 애노테이션은 해당 클래스를 ( ) 클래스로 지정한다.
답: 스프링 설정
4. @Bean이 붙은 메서드는 해당 메서드가 생성한 객체를 ( )이 관리하는 ( )로 등록하겠다는 것을 의미한다.
답: 스프링, 빈 객체/싱글톤 객체
5. getBean() 메서드의 첫 번째 파라미터와 두 번째 파라미터는 무엇인가?
답: @Bean애노테이션의 메서드 이름/빈 객체의 이름, 빈 객체의 타입
6. ApplicationContext(또는 BeanFactory)는 빈 객체의 생성, 초기화, 보관, 제거 등을 관리하고 있어서 ( )라고도 부른다.
답: 컨테이너(Container)
7. 별도 설정을 하지 않을 경우 스프링은 한 개의 빈 객체만을 생성하며, 이때 빈 객체는 '( )범위를 갖는다'라고 표현한다.
답: 싱글톤
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;
}
}
package chap02;
import org.springframework.context.annotation.*;
// 이 클래스를 스프링 설정 클래스로 지정
@Configuration
public class AppContext {
@Bean
public Greeter greeter() {
Greeter g = new Greeter();
g.setFormat("%s, 안녕하세요!");
return g;
}
}
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();
}
}
글톤(singleton)
Corner Spring #2
Editor : 파오리
[스프링2] 6장. 빈 라이프사이클과 범위 (0) | 2022.10.13 |
---|---|
[스프링2] 5장. 컴포넌트 스캔 (0) | 2022.10.13 |
[스프링2] 4장. 의존 자동 주입 (0) | 2022.10.13 |
[스프링2] 3장. 스프링 DI (0) | 2022.10.06 |
[스프링2] 1장. 들어가며 (1) | 2022.09.29 |