<한줄요약>

Spring : 자바 객체를 담고 있는 컨테이너, 객체의 생성/사용/제거 등 관리

 

1. Spring이란?

 

-  JEE에서 사용하는 대부분의 기능 + @를 제공하는 경량화 Framework

-  Low level을 자동으로 처리해주어 개발자가 상위 logic에 집중할 수 있도록 한다

-  외부 lib를 쉽게 가져다 쓸 수 있다

 

 

2. Spring 구조

 

-  1. POJO

-  Plain Old Java Object

-  특정 시스템/기술에 종속적이지 않은 자바 객체. 

-  종속성이 없어 생산/이식이 용이하다

 

-  2. PSA

-  Portable Service Abstraction

-  기술에 일관된 방식을 사용해 접근 ( 추상화 )

-  Service Abstraction이란? 어떤 기능을 사용자에게 드러내지 않고 시스템이 자동으로 처리해주는 것

-  Portable Service Abstraction은? 비슷한 여러 기능을 하나로 통합해 사용자에게 제공하는 것

-  ex) DB에 접근하는 법은 JDBC를 비롯해 여러가지가 있지만, @Trancaction으로 트랜잭션 일괄 처리

 

-  3. IoC/DI

-  Inversion of Control (제어 반전)

-  객체의 생성, 의존 등 생명주기 관리를 개발자가 하는게 아닌, 컨테이너가 하게 된다

-  Depedency Injection

-  객체를 생성해두고, 외부에서 의존성을 설정하면 객체가 주입되도록 한다

-  직접 생성자를 호출하거나, 함수를 통해 받을 필요가 없다

 

-  4. AOP

-  Aspect Oriented Programming

-  관점 지향 프로그래밍

-  관점을 기준으로 모듈화, 핵심 로직과 공통(부가) 로직으로 분리한다

-  공통 사용 부분은 공통 모듈로 분리하고 필요할 때 호출해서 사용한다

-  ex) 로그를 남기고 싶을때, 로그 기록 모듈을 별도로 생성 후 로깅이 필요한 부분에서 호출

-  재사용성의 증가

 

 

3. IoC

 

-  Object간의 연결 관계를 런타임에 결정한다

-  DI : IoC의 여러 방법 중 하나

-  객체 간 결합도를 떨어트려 유지보수 용이성을 높인다

 

IoC의 종류

-  Dependency Lookup

-  직접 lookup해서 필요한 자원을 얻는 방식

-  type casting 필요

 

-  Dependency Injection

-  클래스 간 의존관계를 표기해두면(xml, @ annotaion 등) 자동으로 연결해주는 것

-  lookup 불필요

 

Container란?

-  객체의 생성, 소멸 등 생애주기를 관리

-  객체 사용에 필요한 기능들 제공

-  Dependency 제공

-  Thread 처리 등

 

IoC Container

-  코드 대신 컨테이너가 object의 생성, 사용, 제거를 담당

-  컨테이너가 obj를 제어하므로 IoC Container라 한다

 

Bean

-  spring이 생성,관리하는 객체

 

Spring DI Container (BeanFactory)

-  Bean의 생명주기를 관리, BeanFactory라고도 호칭한다

-  Bean을 등록, 생성, 조회

-  getBean()으로 조회 가능

 

ApplicationContext

-  BeanFactory의 기능을 확장한 것

-  spring의 여러 서비스 추가 제공

 

IoC 장점

-  객체 간 결합도 감소

-  결합도가 높으면? 한 class의 코드만 변경되도 다른 코드들까지 다 변경이 일어날 가능성이 높다

 

-  결합도의 감소 예시

 

-  1. class가 아닌 interface를 사용

-  interface만 동일하면 class는 얼마든 수정되도 상관 없다

-  interface가 수정될 때는 수정 필요

 

-  2. Factory 이용

-  팩토리가 클래스를 생성, interface가 변경되도 팩토리만 수정한다

-  class는 팩토리만 호출

-  팩토리에 의존하는 형태

 

-  3. Assembler 이용

-  runtime에 클래스 관계를 설정, 객체를 주입해준다

-  Spring Container에서 Bean으로 객체를 생성하면, 이를 getBean으로 가져다 쓰는 식

 

 

4. DI

 

Bean 생성 방법

-  1. XML 파일

-  자기 정보를 기술

-  기본적으로 singleton이다.

-  singleton이 아니게 하려면 scope="prototype"설정

-  <bean>태그 사용

<bean id="world" class="com.hello.world" />
//not singleton
<bean id="world" class="com.hello.world" scope="prototype" />

 

-  2. annotation

-  자동으로 bean 등록, 주입

-  xml에 component-scan으로 검색할 패키지를 설정

//context 추가 필요
<context:component-scan base-package="com.hello.*" />

-  @annotation을 설정해두면 자동으로 검색, bean으로 생성한다

표기 의미, 종류
@Repository DAO와 같은, 데이터베이스 접근 클래스에 사용
@Service service 클래스에 사용
@Controller servlet같은 controller에 사용
@Component 그 외 나머지에 사용

 

Dependency Injection (DI)

-  객체 간 의존관계를 외부에서 대신 수행한다

-  IoC의 구현방법, 결합도가 느슨하다

 

DI 종류

-  외부 assembler에서 의존성 주입

 

-  1. xml 이용

-  주입할 객체를 xml파일에 설정

<bean id="world" class="com.test.hello.world" />
//not singleton
<bean id="world" class="com.test.hello.world" scope="prototype" />

-  class가 ~hello.world인 클래스를 주입받는 bean 객체 생성

-  world라는 id로 호출 가능하다

 

-  객체의 획득은 Container의 함수로 제공받는다

ApplicationContext context = new ClassPathXmlApplicationContext("com/test/hello/applicationContext.xml");
CommonService world = context.getBean("world", world.class);

 

-  bean 생성시 생성자에 인자가 필요할 경우, constructor-arg태그를 사용한다

-  다른 bean을 인자로 받을 경우 value 대신 ref 사용, 인자는 해당하는 id값이다

<bean id="world" class="com.test.hello.world">
	<constructor-arg value="50" />
</bean>
//위에서 생성한 world bean을 생성자의 인자로 받는 새 객체
<bean id="world2" class="com.test.hello.world2">
	<constructor-arg ref="world" />
</bean>

 

-  생성한 객체에 값을 주입할 경우, property 태그를 사용한다

-  단, 해당 이름의 setter가 설정되 있어야한다. setArg1이 있을 경우 name="arg1"로 사용 가능

-  동일하게 value, ref 사용

//50을 arg1로, world객체를 arg2로 받는 객체
//world2 클래스 내부에 setArg1, setArg2 함수 필수
<bean id="world2" class="com.test.hello.world2">
	<property name="arg1" value="50" />
	<property name="arg2" ref="world" />
</bean>

 

-  주입할 값에 따라 <list> <map> 등 태그 존재

//인자로 list를 받는 객체
<bean id="world2" class="com.test.hello.world2">
	<property name="argList">
		<list>
			<value type="java.lang.Integer">50</value> // int 50 저장
			<ref bean="world" />
		</list>
    </property>
</bean>

//인자로 map를 받는 객체
<bean id="world2" class="com.test.hello.world2">
	<property name="argMap">
		<map>
			<entry key="key1" value="val1" />
			<entry key="key2" value-ref="world" />
		</map>
    </property>
</bean>

 

-  2. annotation 사용

-  @Autowired

-  타입에 맞춰 주입해준다

-  동일한 type이 여러개일 경우 @Qualifier("name") Annotation을 추가해 구분

 

-  @Resource

-  타입에 맞춰 주입해준다

-  동일한 type이 여러개일 경우 @Resource(name="name1") 으로 구분

 

-  @Inject

-  이름으로 주입해준다(Spring 3 지원)

-  표준 Annotation으로, Spring 종속적이지 않다

-  javax.inject-x.x.x.jar 필요

 

+ Recent posts