관리 메뉴

VivaButton

[스프링부트, Spring Boot]의존성 주입 - Dependency Injection #3 본문

카테고리 없음

[스프링부트, Spring Boot]의존성 주입 - Dependency Injection #3

비바버튼 2019. 5. 2. 11:34
728x90

이전 포스팅에서는 스프링 프레임워크에 대해 간략하게 알아보고 넘어갔습니다. 이번에는 스프링의 핵심 기능 중 의존성 주입에 대해 알아보겠습니다.

DI (Dependency Injection)란?

의존성 주입은 프로그래밍에서 구성요소간 의존 관계가 소스코드 내부가 아닌 외부의 설정파일 등을 통해 정의되게 하는 디자인 패턴 중의 하나입니다.

DI의 장점에 대해 설명하기 전에 스프링과 자바에서 객체를 생성하는 방법을 먼저 알아보고 넘어가겠습니다. 

- 자바에서 일반적으로 객체를 생성하는 방법

A 클래스에서 B,C 객체를 직접 생성하였습니다.

- 스프링에서 객체를 생성하는 방법

자바에서는 A 클래스에서 B,C 객체를 직접 생성하였지만, 스프링에서는 IOC(Inversion Of Control) 컨테이너를 이용하여, 외부에서 객체를 생성하여, 외부에서 객체를 생성하여 A의 의존성을 주입하는 방식을 채택하였습니다.

IOC(Inversion Of Control) 컨테이너는 부품을 담고있는 컨테이너, 객체들을 하나의 부품이라고 생각하시면 이해가 되실겁니다. 컨테이너는 필요한 부품들을 A에 도킹해주는 역할을 합니다.

물론 자바에서의 객체 생성 방법을 사용 할 수도 있지만, 아래의 방법을 사용하는것이 목적에 부합합니다.

DI(Dependency Injection)의 장점

객체 사이의 의존 관계를 스프링 설정 파일에 등록 된 정보 <bean>을 바탕으로 컨테이너가 자동으로 처리해 줍니다. 따라서 의존성 설정을 바꾸고 싶을때 프로그램 코드를 수정하지 않고, 스프링 설정 파일 수정만으로 변경사항을 적용 할 수 있어서 유지보수가 용이해집니다.

예를 들어, ram이라는 인터페이스를 설정하고 4gb, 8gb, 16gb를 두었을 때 

단순히 참조하는 4gb -> 16gb로만 바꾸어 준다면 간단하게 부품을 갈아낄 수 있고 유지보수에 많은 공수를 들이지 않을 수 있는 것입니다.

- 스프링 DI 설정방법

1. XML 설정파일 이용 방법

Main.Class

// xml 파일 위치 저장

String configLocation = "classpath:applicationCTX.xml";

// context 생성

AbstractApplicationContext ctx = new GenericXmlApplicationContext(configLocation);

// 빈 주입

Student student1 = ctx.getBean("student1", Student.class);

ctx.close(); 

applicationCTX.xml

<bean id="student1" class="com.javalec.ex.Student">

     <constructor-arg value="홍길동" />

     <constructor-arg value="10" />

     <constructor-arg>

          <list>

             <value>수영</value>

             <value>요리</value>

         </list>

      </constructor-arg>

      <property name="height" value="187"</property>

</bean>

property로는 setter 값을 넣어주고, constructor에는 생성자의 값을 넣어줍니다.

2. Java anotation 이용 방법

Main.Class

// context 생성

AbstractApplicationContext ctx = new GenericXmlApplicationContext(ApplicationConfig.Class);

// 빈 주입

Student student1 = ctx.getBean("student1", Student.class);

ctx.close(); 

ApplicationConfig.class

@Configuration

public class ApplicationConfig {

        @Bean

        public Student student1(){

                   ArrayList<String> hobbys = new ArrayList<String>();

                   hobbys.add("수영");

                   hobbys.add("요리");

                  Student student = new Student("홍길동"20, hobbys);

                  student.setHeight(180);

                  student.setWeight(80);

                  return student;

         }

}

@Configuration , @Bean 어노테이션을 사용하여 스캔