뮁이의 개발새발

[Spring] 의존성 주입 (Dependency Injection) 본문

Back-end

[Spring] 의존성 주입 (Dependency Injection)

뮁뮁이 2021. 10. 31. 21:17

[싱글톤 빈]

- 스프링 빈은 기본적으로 싱글톤으로 만들어짐.

그러므로, 컨테이너가 제공하는 모든 빈의 인스턴스는 항상 동일함.

컨테이너가 항상 새로운 인스턴스를 반환하게 만들고 싶을 경우 scope를 prototype으로 설정해야 함.

	<bean id="memberService" class="com.mueng.test.service.MemberServiceImpl" scope="prototype"/>

[빈의 생성 범위]

http://ryuinblog.blogspot.com/2018/07/springframework-autowire-autowired.html

 

[스프링 빈 설정: XML]

- 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"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
		
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	
	 <bean id="ds" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="java:comp/env/jdbc/ssafy"></property>
	</bean>
	<bean id = "sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="ds"></property>
		<property name="typeAliasesPackage" value="com.ssafy.item.model"></property>
		<property name="mapperLocations" value="classpath:mapper/*.xml">
		</property>
	</bean>
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactoryBean"></constructor-arg>
	</bean>
	
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="ds"></property>
	</bean>
	
	
	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>

 

[Annotation]

- 어플리케이션의 규모가 커지면 XML 파일을 관리하는 것이 번거로움

- 빈으로 사용될 클래스에 특별한 annotation을 부여해 주면 자동으로 빈 등록 가능

@Autowired
private MemberDao memberDao;

- Annotation으로 빈을 설정 할 경우 반드시 component-scan을 설정 해야 함.

<context:component-scan base-package='com.test.hello."/>

 

[스테레오 annotation 종류]

@Repository : Data Access Layer의 DAO 또는 Repository 클래스에 사용./ DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해 사용.

@Service : Service Layer의 클래스에 사용.

@Controller: Presentation Layer의 MVC Controller에 사용. / 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정.

@Component : 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정.

 

[DI]

- 객체간의 의존관계를 자신이 아닌 외부의 조립기가 수행

- 제어의 역행(inversion of Control, IoC)이라는 의미로 사용.

- DI를 통해 시스템에 있는 각 객체를 조정하는 외부 객체가 객체들에게 생성시에 의존관계를 주어짐

- 느슨한 결합의 주요 강점: 객체는 인터페이스에 의한 의존 관계만을 알고 있으며, 이 의존 관계는 구현 클래스에 대한 차이를 모르는 채 서로 다른 구현으로 대체가 가능.

 

------------------Spring--------------------

[xml 설정]

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">

- 기본 속성

  • name : 주입 받을 곳에서 호출 할 이름  설정
  • id : 주입 받을 곳에서 호출 할 이름 설정(유일 값).
  • class : 주입 할 객체의 클래스

[빈 의존 관계 설정]

1. constructor 이용

<constructor-arg> : <bean>의 하위태그로 설정한 bean 객체 또는 값을 생성자를 통해 주입하도록 설정.

- 설정 방법: <ref>, <value>와 같은 하위태그를 이용하여 설정하거나 또는 속성을 이용하여 설정.

public Player(int num, String name){
	this.num = num;
	this.name = name;
}
<bean id = "payer1" name="p1,py1" class="com.test.di.Player">
	<constructor-arg value ="31"/>
	<constructor-arg name="name" value ="김민정"/>
</bean>

* 순서대로 작성하면 됨. 순서를 지키지 않을 시, 속성(type, index, name)을 이용하여 match 시켜준다.

 

2. Property 이용

<property>: <bean>의 하위태그로 설정한 bean 객체 또는 값을 property를 통해 주입하도록 설정.

- 설정 방법: <ref>, <value>와 같은 하위태그를 이용하여 설정 하거나 속성을 이용하여 설정

  • 하위태그 이용

- 객체 주입 시: <

'Back-end' 카테고리의 다른 글

[VueJS] 기본 개념 및 요점정리  (0) 2021.11.15
[my batis] 기본 개념 및 Spring 연동  (0) 2021.11.08
[MVC 패턴] 기초개념  (0) 2021.10.18
[HttpSession] 기초 개념  (0) 2021.10.14
[Cookie] 기초 개념 및 구현  (0) 2021.10.14
Comments