티스토리 뷰
스프링을 활용한 의존성주입 - 1
- 스프링을 활용한 의존성 주입에 대해 살펴보자.
- 본 포스트는 Java Config 기반의 코드를 베이스로한다.
class HelloService {
}
class HelloController {
HelloService helloService;
...
...
}
- 다음과 같은 의존관계에 있는 경우 스프링을 활용하여 어떻게 의존성을 주입을 해야할까 ?
- HelloController는 HelloService와 의존관계에 있다.
IoC 컨테이너
- IoC(Inversion Of Control) - 제어의 역전
먼저 스프링을 활용한 의존성 주입을 알아보기전에 IoC에 대해 알아보자.
보통 일반적인 애플리케이션의 경우 객체들의 의존관계를 개발자의 코드에 의해 제어를 하게된다.
다음 코드를 한번 살펴보자
class HelloController {
HelloService helloService;
public HelloController(HelloService helloService) {
this.helloService = helloService ;
}
}
class HelloControllerTest {
@Test
public void hello() {
HelloService helloService = new HelloService();
HelloController helloController = new HelloController(helloService);
}
}
일반적으로 다음과 같이 개발자의 코드에 의해 제어가 이루어진다.
하지만 스프링은 이러한 코드가 불필요하다.
IoC 란 객체들의 의존관계를 스프링에게 위임함으로써 불필요한 코드들을 제거해준다.
스프링은 IoC컨테이너라고도 한다.
Bean 등록
-
스프링 IoC컨테이너에서 관리하는 객체들을 Bean이라고 한다.
-
Bean으로 관리되는 객체들을 스프링으로부터 의존성을 주입받을 수 있다.
-
스프링의 Bean의 조건
- 우선 간단히 설명하도록 하겠다.
- POJO (Plain Old Java Object) 일명 포조라고한다.
- 특정 기술에 의존적이지않은 순수한 자바객체를 의미한다.
-
Bean으로 등록하는 방법은 크게 세가지로 나뉜다.
- XML을 활용한 빈등록 방법
- JavaConfig를 활용한 빈 등록방법
- Annotation을 활용한 빈 등록방법
위의 세가지 방법이 존재하나 일반적으로 스프링 MVC의 경우에는 1번과 3번이 가장 많다.
최근에는 스프링부트를 활용한 프로젝트가 많아지고 XML을 활용한 설정보다는 JavaConfig를 많이 사용하는 추세인듯하다.
- JavaConfig의 장점 ?
- JavaConfig를 활용하면 설정부분에서 에러가 발생시 디버깅을 통해 에러 추적이 용이하다.
- IDE의 자동완성을 제공받을 수 있다.
필자는 JavaConfig를 좀더 선호한다.
세가지 방법을 모두 살펴보도록 하겠다.
XML을 활용한 Bean등록 방법
<?xml version=1.0 encoding="UTF-8">
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloService" class="me.june.service.HelloService"></bean>
<bean id="helloController" class="me.june.controller.HelloController"></bean>
</beans>
- 다음과 같이 XML의 bean 태그를 활용하여 HelloService와 HelloController를 빈으로 등록해 주었다.
- 간력히 설명하자면 …
- id: 해당 빈의 고유식별 명 을 의미한다.
- class: 빈 으로 등록할 클래스를 의미한다.
JavaConfig를 활용한 Bean등록 방법
@Configuration
class WebConfig {
@Bean
public HelloService helloService() {
return new HelloSerivce();
}
@Bean
public HelloController helloController() {
return new HelloController();
}
}
- @Configuration
- 해당 클래스가 설정클래스라고 알려준다.
- @Bean
- 해당 메서드가 리턴하는 객체를 Bean으로 등록해준다
- 기본값으로 메서드명이 해당 빈의 이름이된다.
@Bean 애노테이션을 한번 살펴보자
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Autowire;
import org.springframework.core.annotation.AliasFor;
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
@AliasFor("name")
String[] value() default {};
@AliasFor("value")
String[] name() default {};
/** @deprecated */
@Deprecated
Autowire autowire() default Autowire.NO;
boolean autowireCandidate() default true;
String initMethod() default "";
String destroyMethod() default "(inferred)";
}
- @Bean에는 크게 두가지 속성이 존재한다.
- value
- name
해당속성의 값이 등록할 빈의 이름이된다.
자, 그럼 빈을 등록할때 빈의 이름을 결정하는 방법은 총 세가지가 되는것이다.
- @Bean 등록시 메서드의 명으로 정의
- @Bean(name=”빈이름”)
- @Bean(value=”빈이름”)
- 눈으로 확인하는건 생략하도록 하겠다.
이제 다음방법으로 넘어가도록 하자
애노테이션을 활용한 빈 등록방법
-
애노테이션을 활용한 빈 등록방법을 사용하려면 컴포넌트 스캔설정을 해주어야한다.
-
컴포넌트 스캔 설정이란 ?
- 특정 어노테이션들 @Controller, @Service , @Component.. 등 이 붙은 클래스들을 Bean으로 등록하는데
- 해당 클래스들이 어디에 존재하는지 패키지 범위를 지정해주는것이다.
먼저 XML 설정에서의 컴포넌트 스캔 설정 방법을 살펴보자.
- 앞서 설명한 XML 설정파일에 다음과 같이 추가해주면 된다.
- 각 패키지 구분은 . 으로 구분한다
- 즉 me > june 패키지 하위의 모든 컴포넌트 들을 빈으로 등록하겠다는 설정이다.
- 해당 설정을 통해 빈으로 등록된 객체들을 기존 방식과 동일하게 사용이 가능하다.
<context:component-scan base-package="me.june" />
다음으로 JavaConfig 설정에서의 컴포넌트 스캔 방법을 살펴보자.
- @Configuration 애노테이션으로 설정클래스라는것을 명시해준다.
- @ComponentScan 애노테이션의 basePackages 속성에 해당 패키지를 명시해준다.
- 앞서 설명한 XML과 동일한 설정이 적용된다.
@Configuration
@ComponentScan(basePackages = "me.june")
class WebConfig {
}
- 이로써 스프링의 Bean 등록 방법을 간략히 살펴보았다.
- 앞서 설명한 3가지 방법이 가장 많이 쓰이는듯하다.
다음으로 포스트에서는 스프링을 활용하여 의존성 주입하는 방법을 살펴보도록 하자.
'Spring' 카테고리의 다른 글
Spring - PSA (0) | 2019.05.19 |
---|---|
스프링 AOP - 2 (0) | 2019.05.12 |
스프링 AOP -1 (0) | 2019.05.04 |
스프링을 활용한 의존성주입 - 2 (0) | 2019.05.01 |
DI - 의존성주입 (0) | 2019.04.28 |