Million Dreams
100만개의 꿈을 꾸는 개발자 지망생
Spring (4)
스프링 컨테이너(Spring Container)를 만드는 2가지 방법 (XML, Annotation)

앞서 DI를 설명하면서 XML으로 빈을 구성해 컨테이너를 만드는 방법에 대해 간단히 설명한 바 있다.

 

기본적으로 XML파일로 컨테이너를 구성할 때는 XML파일에 Bean 태그를 통해 컨테이너 요소들을 설정하고,

컨테이너를 만들때는 GenericXmlApplication 객체를 통해 XML파일을 불러와 컨테이너를 구성한다. 

 

- GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:config.xml");

 

- 컨테이너를 구성했으면 getBeans()메소드를 사용해 xml에서 빈으로 구성해놓은 클래스들을 가져온다.

(이때, getBeans 메소드의 파라미터는 xml 파일내의 Bean 태그의 id와 같아야 한다.)

 

- getBean으로 Bean을 갖고오는데 성공했다면 Bean 클래스들의 실행하고 싶은 메소드들을 실행후,

close를 통해 닫아준다. (ctx.close())

 

-------------------------------------------------------------------------------------------------------

 

반면 Annotation 방식을 사용해 컨테이너를 구성하는 방법도 있다.

 

Annotaion 방식은 XML이 파일이 필요없고, 해당하는 컨테이너로 만들고 싶은 클래스 위에 @Configuration을 붙여주면 된다.

 

1
2
3
4
5
6
7
8
@Configuration
public class a {
 
@Bean
public User user1() {
return new User("aaaaa""1234");
}

(@Configuration을 사용해 Container를 구성한다.)

 

Container 내에는 @Bean을 사용할 수 있는데. @Bean의 역할은 빈 객체를 생성하는 메소드에 사용되어  메서드의 리턴 값을 빈 객체로 사용할 수 있다.

위의 예에서는 user1() 메서드가 생성하는 객체를 빈 객체로 사용하고 메소드 이름인 user1을 빈 객체의 이름으로 사용한다.

 

메인에서 사용할때는 XML때와 달리  AnnotationConfigApplicationContext 객체를 사용해 불러올 수 있다.

 

1
2
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(Config.class);

 

두가지 방식의 특징은 다음과 같다.

* XML 설정

- 설정 정보를 변경할 때에는 XML만 변경하면 된다.

- 많은 프레임워크/라이브러리 XML 스키마를 이용한 설정의 편리함을 지원한다.

- (IDE의 코드 자동 완성 기능이 빈약하면) XML 작성 과정이 다소 번거롭다.

- 코드를 실행해야 설정 정보 오류를 확인할 수 있다.

 

* Annotation 방식

- 컴파일러의 도움을 받기 때문에, 오타 등의 설정 정보 오류를 미리 알 수 있다.

- 자바 코드이기 때문에 IDE가 제공하는 코드 자동 완성 기능의 도움을 받을 수 있다.

- 설정 정보를 변경하려면 자바 코드를 재컴파일해주어야 한다.

- XML 스키마 기반의 설정을 지원하는 프레임워크/라이브러리 중 아직 자바 기반의 편리한 설정을 지원하지 않은 경우가 있다.

 

 

 

 

 

 

 

 

'Spring Framework' 카테고리의 다른 글

스프링(Spring Framework)이란?  (0) 2020.02.27
  Comments,     Trackbacks
DI(Dependency Injection)란? 2. Property 방식

앞서 DI에는 2가지 방식이 있다고 말했으며 생성자(Constructor) 방식에 대해서 소개한 바 있다.

이번에는 2번째 방식인 Property 방식인데

Property 방식은 <property> 태그를 사용하며, name 속성을 이용해 프로퍼티 이름을 지정한다.

Value 혹은 Ref 태그를 사용해 값을 설정할 수 있다.

 

1
2
3
<bean id=class=a>
<property name="anum" value="1" />
</bean>
1
2
3
<bean id=b class=b>
<property name="bnum" ref="a" />
</bean>

(property 방식 지정 예시)

 

Property 방식은 다른 이름으로 setter 방식이라고도 하는데 setproperty이름() 형식의 메서드를 이용해 값을 설정하는 것이 일반적이다.

 

ex) setAnum(1)

setBnum(a)

 

XML을 통해 DI 설정을 하였다면

컨테이너를 만드는 방법으로 GenericXmlApplicationContext 클래스를 사용한다.

 

1
2
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:config.xml");
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

GenericXmlApplicationContext 객체 생성 예시

(config.xml 파일을 참조해 컨테이너를 생성한다.)

 

ctx 말고도 Annotation 방식이 있는데 Annotation 방식은 뒷장에 설명할 예정이다.

 

  Comments,     Trackbacks
DI(Dependency Injection)란? 1. Constructor(생성자) 방식

스프링 프레임워크에는 DI란 개념이 있다.

의미를 직역하면 다음과 같다.

 

DI(Dependency Injection) : 의존성 주입

 

앞선 포스트에서 스프링 모듈들은 서로 의존관계에 있다고 언급한 바 있는데,

그 말처럼 스프링은 기본적으로 DI 기반으로 동작하기 때문에 구조에 대한 이해가 필요하다.

 

DI 설계 패턴의 기본적인 원리는 각각의 클래스가 실행을 위해 서로를 필요로 한다는 점을 볼 수 있다.

 

가령 A라는 클래스는 파라미터를 받아 콘솔에 그 파라미터의 값을 출력하는 기능을 하는 print()라는 메소드를 가진 클래스라고 하자.

하지만, 그 print 메소드가 다른 클래스 B를 필요로 한다고 한다면, A와 B는 의존관계에 있다고 할 수 있다.

 

의존관계를 만드는 방법은 크게 2가지 방법이 있을 수 있다.

1. 직접 의존 객체를 만드는 방법

2. 외부에서 파라미터를 전달받는 방법

 

먼저 1번 방법을 살펴보면

A 클래스내에 직접 new 생성자로 의존하는 클래스 B를 생성해 사용하는 방식이다.

1
2
3
4
5
6
7
8
9
10
package test;
 
public class A {
    private B b = new B();
    
    public void B(String question, String answer) throws IOException {
      ...
      ...
    }
}

그러나 이 상황에서 B의 하위 클래스인 C의 클래스를 사용해야 한다고 가정하면,

 

1
2
3
4
5
6
7
8
9
10
package test;
 
public class A {
    private B b = new B();
 
-> private B b = new C();
    
    public void B(String c, String d) throws IOException {
      ...
      ...
    }
}
 

이런식으로 바꿔줘야 한다.

 

만약에 이럴 경우 B클래스를 사용해 짜두었던 코드들을 모두 C에 해당하는 내용으로 변경해야 하기 때문에 코딩의 양이 증가한다 할 수 있다.

 

이와 달리 DI 방식은 의존 객체를 외부에서 조립하기 때문에 이같은 상황을 방지할 수 있다.

 

DI 방식 또한 크게 2가지가 있다.

1. Constructor(생성자) 방식

2. Property 방식

 

DI방식은 이처럼 의존하는 객체를 클래스 내에서 직접 만드는 것이 아니라 외부에서 주입하는 것이기 때문에 의존 주입이라는 표현을 쓰며 객체를 연결한다는 의미로 Wiring 이라는 표현으로도 사용된다.

 

의존 주입을 위해서는 객체를 생성하고 연결시켜주는 조립기 클래스가 따로 필요하다.

여기서는 임의로 Assembler라는 이름의 클래스로 만들어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Assembler {
    private A a;
    private B b;
    
    
    public Assembler() {
        a = new A();
        b = new B();
    }
    
    public A a() {
        return a;
    }
    
}

이제 Assembler를 사용하면 이런식으로 클래스를 불러와 사용하는 것이 가능하다.

1
2
3
Assembler assembler = new Assembler();
    
    A a = assembler.a();

즉, 코드의 변경 사항이 있어도 클래스 내부에서 직접 수정하는 것이 아니라, 조립기의 내용을 수정함으로써 DI로 전달받는 코드는 영향을 받지 않게 된다.

 

 

 

  Comments,     Trackbacks
스프링(Spring Framework)이란?

참고 사이트 : https://spring.io/

 

Spring

Level up your Java code and explore what Spring can do for you.

spring.io

· 자바개발자로서 거의 필수적으로 배워야 할만큼 다양한 영역에서 사용되는 프레임워크(국내에선 업계 표준 프레임워크 수준)다. 

 

· 스프링 프레임워크는 기능에따라 다양한 모듈로 나뉘어 있어서 각 모듈의 역할을 기본적으로 알고 있어야 활용할 수 있다.

 

※ 주요 모듈 목록은 다음과 같다.

  • spring-beans : 컨테이너 객체 생성
  • spring-context : 객체생성, 라이프 사이클 처리, 스키마 확장 등
  • spring-aop : AOP(Aspect Oriented Programming) 기능 제공
  • spring-web : 웹 개발 필요 기반 기능 제공 
  • spring-webmvc : 스프링 기반 MVC 프레임워크 (컨트롤러 뷰 구현 등을 제공)
  • spring-websocket : MVC에서 웹소켓 연동처리 지원
  • spring-oxm : XML과 자바 객체간 매핑 처리 지원
  • spring-tx : 트랜잭션 관리 지원
  • spring-jdbc : JDBC 프로그래밍 지원
  • spring-orm : 하이버네이트, JPA, MyBatis 등 연동 지원
  • spring-jms : JMS(Java Message Server)와 연동 지원
  • spring-context-support : 각종 부가기능(스케줄링, 메일 발송, 캐시 연동, 벨로시티 등) 지원

위와 같은 모듈들은 각자 서로 유기적으로 연결되어 있는 의존관계(Dependency)에 있는데

서로 역할에 따라 어떻게 의존하고 있는지 알면 Spring의 구조와 프로세스를 이해하기 쉽다.

 

(완전한 모듈 목록은 https://github.com/spring-projects/spring-framework에서 볼 수 있다.)

 

- Spring 프로젝트는 일반적으로 Maven Project를 사용하며, Maven Project에서 모듈을 사용하려면

XML 파일에서 다음과 같이 선언해주면 된다.

 

1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.0.4.RELEASE</version>
</dependency>

(위 소스는 spring-context 모듈을 XML에 선언한 예시이다.)

 

앞으로 새로운 것을 배울 때마다 관련 내용 정리해서 포스팅 할 예정.

 

 

 

 

  Comments,     Trackbacks