프레임워크 강의-3

robin Han·2023년 3월 15일
0

Spring

목록 보기
3/13
post-thumbnail

Dependency Injection

  • 의존성 관계를 주입
  • 오브젝트 간의 의존관계 생성
  • 런타임시 의존 관계 부여
  • 결합도 낮춤

여러개의 컴포넌트를 통합할때 의존관계를 주입시켜서 디자인패턴을 효과적으로 사용

오브젝트 간의 의존 관계를 만들어서 객체간의 결합도를 낮춘다.

IoC (Inversion of Control)

역전 제어를 뜻하는데 , DI를 사용하면 의존관계를 주입하기때문에, 컴포넌트를 구성하는 인스턴스를 개발자의 소스코드가 아닌, DI container가 처리하기때문이다

IoC Container

  • 인스턴스 생명주기를 관리하고 DI를 처리

IoC: Inversion of Control,
제어의 역전, 소스코드가 아닌 컨테이너가 관리하기때문에 제어 역전
IoC/DI Container: 제일 핵심이 되는 Spring bean을 관리해준다 의존관계 처리,인스턴스 라이프사이클 관리, 객체 생성및 관리

DI를 사용안할때

Class MemberService {
	MemberDAO memberDaO = new MemberDAO();
}

new 연산자를 사용해서 객체를 생성, Main이 Service를 생성하고, Service가 DAO를 생성하여 인스턴스 이용

DI를 사용할때 new
해당 클래스에서 이용되는 인스턴스들은 DI 컨테이너에서 의존성을 주입시킴, 생성해준다.


인터페이스 기반의 컴포넌트화

스프링 빈: 스프링 컨테이너가 관리하는 객체
IOC 컨테이너: 스프링빈의 생성, 관계, 조립, 생명주기를 관리한다.

스프링 컨테이너의 종류

Bean Factory:

빈의 생성, 빈의 의존 관계 관리등의 DI의 기본 기능을 제공
빈이 많지 않고 경량 컨테이너로 작업할때 활용

Application Context:

일반적인 스프링 컨테이너
Bean Factory 에서 상속 받은 하위 인터페이스 확장된 기능 제공 ex.) AOP

WebApplication Context:

웹 애플리케이션을 위한 context 파일
-2 가지 종류의 WAC.

ContextLoadlistener:

  • Persistence (DAO), service 관련 스프링 빈들을 등록
  • 웹 애플리케이션 전체에서 사용할 WAC 객체 생성
  • root-context.xml 파일에 설정

DispatcherServlet:

  • 컨트롤러와 같은 서블릿 관련 빈 등록
  • 해당 서블릿 마다 WAC 객체 생성
  • servlet-context.xml 파일에 설정

DI 주입 설정

주입 방식
XML : Xml 파일을 사용해서 Bean 요소 정의
Annotation: @Component 에너테이션이 부여된 클래스를 DI 컨테이너가 Bean으로 자동 등록
Java : @Configuration 애너테이션을 클래스에 , @Bean 을 매서드에 사용해서 Bean등록

XML 이용한 DI

생성자 기반 (Constructor)

constritor-arg 태그 사용해서, ref 속성 이용

설정자 기반 (Setter)

property 요소에 name 속성과 ref 속성 이용


------- 생성자 시반 (Constructor) -----------
<bean id="memberService" class="org.tukorea.di.service.MemberServiceImpl"> 				<constructor-arg ref="memberDAO"/>
</bean>

--------- 설정자 기반( Setter)--------------------
<bean id="memberService" class="org.tukorea.di.service.MemberServiceImpl"> 
	<property name= "memberDAO" ref="memberDAO"/>
</bean>

Bean 태그 속성

id : 오브젝트를 유일화 하는 ID
name : 오브젝트 이름
class : 패키지명 과 클래스명
scope : 오브젝트의 스코프 지정
parent : 설정을 물려받을 오브젝트 명
abstract :

  • true = 인스턴스를 만들지 않고 공통 설정을 정의
  • false(default) = 인스턴스를 만들고 싶은때
    singleton
  • true(default): getBean 매서드로 얻는 인스턴스는 싱글턴
  • false: getBean 매서드로 얻는 인스턴스 매번 인스턴스화
    lazy-init
  • true: 인스턴스 생성을 지연 시킴
  • false(default): BeanFactory 시작시 인스턴스 생성

Annotation 이용한 DI

XML에서의 Bean 들을 정의 하고 사용하는것이 아닌 소스코드에서 ' @ ' 형테로 표현.
애플리케이션이 클수록 XML 설정이 복잡해진다.

@Autowired

컨테이너가 빈과 다른 빈과의 의존성을 자동으로 연결해준다
@Autowired 설정을 위해 context:annotation-config 설정이 필요하다, componentscan 쓰면 생략가능하다.

@Component

컨테이너가 인젝션을 위한 인스턴스를 설정하는 수단
context:component-scan base-package="패키지 이름"

주요 스키마 : ApplicationContext.xml
bean : 빈 설정
context : 빈 검색 어노테이션 설정
util : 프로퍼티 파일 유틸리티 기능
jee : lookup 설정
lang : 스크립트 언어 설정
aop : AOP 설정
tx : 트랜잭션
mvc :spring mvc 설정

context:annotation-config

XML 파일에 이미 등록된 빈들의 애노테이션 기능을 적용

두 태그로 생략가능
mvc: annotation-driven
context:component-scan

component-scan base-package = '패키지명'

특정 패키지 안에 클래스를 검색해서 빈을 자동으로 찾아서 DI 컨테이너 등록
annotation-config 선언 필요없다.

@Controller : MVC 프레젠테이션 층
@Service : 비즈니스 로직 Service
@Repository : DAO 데이터 엑세스
@Configuration : Bean 정의 JavaConfig

Java를 이용한 DI 설정 방법

XML 설정이 아닌, 자바 코드로 빈을 설정한다.
다른 라이브러리를 사용하여 DI할때, 소스가지고있지않기 때문에 애노테이션 이용 불가 XML 설정해야 한다.
따라서 XML + 애노테이션 or Java + Annotation

@Configuration

빈 설정 메타 정보를 가지고 클래스 선언

@Bean

클래스 내의 매서드를 정의하여 새로운 빈객체를 정의할때 사용


------XML방식 ApplicationContext.xml ----- 
<bean id="DAO" class="persistence.DAOImpl"></bean> 
<bean id="Service" class="service.ServiceImpl">
	<property name="memberDAO" ref="DAO">
</bean>

--------Java방식 JavaConfig.java----------
@Bean 
public DAO memberDao(){
	return new MemberDAOImpl();
}
@Bean
pulblic MemberService memberService(){
	return new MemberServiceImpl(memberDAO());
} 

---------Service Bean 생성------------
memberService = (MemberService)ctx.getBean(MemberService.class);
memberService = (MemberService)ctx.getBean("service");

--------------Application Context 설정 main.java XML----------
ctx = new AnnotationConfigApplicationContext(application.xml)
ctx = new AnnotationConfigApplicationContext(JavaConfig.class)

Bean 생성후 초기화

  • XML
  • Annotation
  • Java
  • Interface

IntializeBean , DisposableBean 을 활용하여 Interface적으로 빈을 생성과 종류시킨다.
인터페이스 매서드를 실행 시켜서.

0개의 댓글