ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 스프링 프레임워크란? DI 의존주입이란? 의존주입방법
    Server/Spring 2020. 4. 1. 19:31

    🔥목차🔥

    🍓 1. 스프링 프레임워크 란?

    🍓 2. DI (Dependency Injection)

               -1) DI 를 이용한 프로그래밍 방법

               -2) 의존객체를 주입하는 다양한 방법

               -3) 스프링설정파일분리

               -4) 의존객체를 자동으로 주입하는 방법

               -5) 다수의 빈(Bean)객체 중 의존 객체의 대상이 되는 객체를 선택하는 방법

     

     

    🍓 1. 스프링 프레임워크란?

    스프링 프레임워크

     

    주요기능

    DI, AOP, MVC, JDBC 등을 제공

     

    - DI : 주입기능,

    - AOP : 관점지향 프로그래밍

    - IOC : Inversion of Control

    스프링에서 객체를 생성하고 조립하는 컨테이너로, 컨테이너를 통해 생성된 객체를 빈이라고 부른다.

    - 컨테이너 : 스프링에서 객체를 생성 및 조립

    - 빈 : 컨테이너를 통해 생성된 객체

         1) 객체생성 및 속성 데이터 작성 (xml  문서)

         2) 스프링 컨테이너에서 객체 생성 및 조립 (스프링 컨테이너, 빈 생성 및 조립)

         3) 애플리케이션 구현 (java 문서)  

    - maven : build tool 

     

     

     

    스프링 프레임워크 : 개발자들이 개발을 하기 위한 업무를 추상적으로 정의해놓은 틀

    틀이 있어 본연의 업무에 집중할 수 있어 작업의 효율을 높일 수 있다.

     

    제공하는 모듈 (=틀, 라이브러리)

    제공하는 모듈

    기능

    spring-core

    스프링의 핵심인 DI & Ioc 제공

    spring-aop

    AOP 구현 기능 제공

    spring-jdbc

    DB 쉽게(=적은 양의 코드) 다룰 수 있는 기능 제공

    spring-tx 

    스프링에서 제공하는 트랜젝션 관련 기능 제공

    spring-webmvc

    스프링에서 제공하는 컨트롤러와 뷰를 이용한 스프링 MVC 구현 기능 제공

    이용방법 :  모듈에 대한 의존설정을 개발 프로젝트에 XML 파일 등을 이용해 개발자가 직접

     

    전체 프로젝트 구조

     

     

     

     

    🍓 2. DI (Dependency Injection)

     - 1) DI 를 이용한 프로그래밍 방법

    의존주입 방법론이다. (spirng만의 방법은 아님)

     

    구현방법은 @Autowired와@Resource 어노테이션을 이용해서 쉽게구현할수있다.

     

    ex)

    배터리 일체형

    배터리 분리형

    공통점 : 둘다 배터리에 의존한다. 배터리 의존을 주입.

    차이점 : 분리형이 일체형보다 유연하다.

     

    2. 스프링 DI 설정 방법

     

     

    생성할 때 주입

    모든 service에 dao를 넣어주고 있음

     

    StudentDao.java

     

    StudentDao studentDao = new StudentDao( );

    Service service= new Service(StudentDao);

     

    =같다

     

    applicationContext.xml

    <bean id="studentDao " class="ems.member.dao.StudentDao" />

     

    <bean id="service" class="ems.member.service.Service">

       <construct-arg ref="studentDao" />

    </bean>

     

    construct-arg태그를 통해 생성자 생성

     

     

     

     

    - 2) 의존객체를 주입하는 다양한 방법

    ① 생성자를 이용한 의존 객체 주입

    ② setter를 이용한 의존 객체 주입

     

    ③ List 타입 의존 객체 주입

     

     

    ④ Map 타입 의존 객체 주입

     

     

     

    - 3) 스프링설정파일분리

    원인 : 하나의 xml 파일에 너무 많은 파일이 담기면 가독성 및 관리 떨어짐

    목적 : 가독성 up, 유지 보수 up

    1. 스프링 설정 파일 분리

    2. 빈(Bean)의 범위

     

    - 4) 의존객체를 자동으로 주입하는 방법

    ① 의존객체 자동 주입이란?

    스프링 설정 파일에서 의존 객체를 주입할 때

    <constructor-org> 또는 <property> 태그로 의존 대상 객체를 명시하지 않아도

    스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서

    의존 대상 객체가 필요한 객체에 주입해 주는 기능이다.

     

    구현 방법은

    @Autowired 와 @Resource 어노테이션을 이용해서 쉽게 구현할 수 있다.

     

    ② @Autowired

    appCtxUseAutoWired.xml에

    <constructor-org> 또는 <property> 태그 없이

    <context:annotation-config /> 와

    xsi:schemaLocation=""에 spring-beans.xsd, context, context/spring-context.xsd 추가

     

    <?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:context="http://www.springframework.org/schema/context"
    	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 
     		http://www.springframework.org/schema/context 
     		http://www.springframework.org/schema/context/spring-context.xsd">
    
    	<context:annotation-config />
    
    	<bean id="wordDao" class="com.word.dao.WordDao" />
        
    	<bean id="registerService" class="com.word.service.WordRegisterServiceUseAutowired" />
    	
    	<bean id="searchService" class="com.word.service.WordSearchServiceUseAutowired" />
    	
    </beans>

     

     

    생성자 생성에 사용시

    @AutoWired
    public WordSearchService (WordDao wordDao){
      this.wordDao = wordDao;
    }

     

    프로퍼티 또는 메서드에도 넣어줄 수 있다.

    @AutoWired
    private WordDao wordDao;
    
    public WordRegisterServiceUseAutowired() {
    		// TODO Auto-generated constructor stub
    	}
    
    @AutoWired
    public void setWordDao( WordDao wordDao){
    
        this.wordDao = wordDao;
    
    }

     

    단, 프로퍼티 또는 메서드에서 사용시에는 

    반드시 default 생성자를 명시해줘야한다.

     

     

    why?  객체가 생성돼야지 프로퍼티에서 WordDao를 끌어올 수 있고

    this.wordDao = wordDao; 에 WordDao를 넣어줄 수 있기 때문이다.

     

     

     

    ③ @Resource

     

     

     

    - 5) 다수의 빈(Bean)객체 중 의존 객체의 대상이 되는 객체를 선택하는 방법

    ① 의존객체 선택

     

    -3), 4) , 5) 비교

     

    3) 에서는 개발자가 직접 주입했음.

    <bean id="service" class="ems.member.service.Service">

       <construct-arg ref="studentDao" />

    </bean>

     

    4) 에서는 

    <context:annotation-config />
    com.word.dao.WordDao" />    
    com.word.service.WordRegisterServiceUseAutowired" />

     

    @AutoWired
    public WordSearchService (WordDao wordDao){
      this.wordDao = wordDao;
    }

    빈객체의 이름을 이용해서 주입했음

     

    5) 여기에서는

    다수의 빈을 사용할 경우

    @AutoWired 가 많을 경우

    어떤 빈을 사용할지 선택해줌

     

    Exception 왜?

    자동 주입 대상 객체를 판단하지 못해

     

    해결방법?

    <qualifier value = "" /> 태그를 사용해서 명시

     

     

     

     

    ②의존객체 자동 주입 체크

    자동 의존 객체가 존재하지 않으면 Exception발생한다.

    그러나, Exception 발생하기 않도록 하고 싶다면? @Autowird (required = false)

    => 해당 방법은 잘 쓰이지 않는다. 사용하지 마세요.

     

    ③ @Inject

    @Autowird와 유사. (required = false)는 사용 불가. 

     

     

    @Autowird VS  @Inject

    @Autowird가 더 많이 쓰인다.

     

    @Autowird

    @Qualifier("qualifier value 명")

     

    @Inject

    @Named(value="사용하려는 빈객체의 id명")

     

     

     

     

     

     

     

     

    반응형
Designed by Tistory.