-
[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명")
반응형'Server > Spring' 카테고리의 다른 글
[Spring] jpa, Hibernate, mybatis 란? 그리고 SQL Mapper와 ORM (0) 2020.04.19 [Spring] 설정 및 구현 - 생명주기, MVC (0) 2020.04.12 [Spring] Intellij tomcat war 배포 - window에서 filezilla를 이용해 sftp 서버배포 (0) 2020.03.20 [Spring] 이클립스로 스프링 프로젝트 생성하기 (0) 2020.03.15 [spring] Lombok annotation (0) 2020.02.20