티스토리 뷰

Spring

스프링을 활용한 의존성주입 - 1

엔꾸꾸 2019. 4. 28. 19:50

스프링을 활용한 의존성주입 - 1

  • 스프링을 활용한 의존성 주입에 대해 살펴보자.
  • 본 포스트는 Java Config 기반의 코드를 베이스로한다.
class HelloService {

}

class HelloController {
     HelloService helloService;

   ...
   ...
}
  • 다음과 같은 의존관계에 있는 경우 스프링을 활용하여 어떻게 의존성을 주입을 해야할까 ?
  • HelloController는 HelloService와 의존관계에 있다.

IoC 컨테이너

  1. 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으로 등록하는 방법은 크게 세가지로 나뉜다.

  1. XML을 활용한 빈등록 방법
  2. JavaConfig를 활용한 빈 등록방법
  3. 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에는 크게 두가지 속성이 존재한다.
  1. value
  2. name

해당속성의 값이 등록할 빈의 이름이된다.

자, 그럼 빈을 등록할때 빈의 이름을 결정하는 방법은 총 세가지가 되는것이다.

  1. @Bean 등록시 메서드의 명으로 정의
  2. @Bean(name=”빈이름”)
  3. @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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함