Back-End/Spring

[Spring] DI (Dependency Injection)

zsunny 2023. 4. 26. 13:33

스프링 빈은 기본적으로 '싱글톤'으로 만들어진다. 그 외 방법으로 인스턴스 반환을 하게 하고싶은 경우 scope에 설정해주어야 한다.

  • singleton : 스프링 컨테이너당 하나의 인스턴스 빈만 생성 (default)
  • prototype : 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성
  • request : HTTP Request별로 새로운 인스턴스 생성
  • session : HTTP Session별로 새로운 인스턴스 생성
<bean id="memberService" class="com.test.hello.service.MemberService" scope="여기에 설정" />

🌽 스프링 빈 설정 (Annotation)

  • 빈으로 사용될 클래스에 @Autowired annotation을 부여해 주면 자동으로 빈 등록
  • 이때 반드시 context.xml파일에 component-scan을 설정해주어야 함
// servlet-context.xml (Web 관련)
<context:component-scan base-package="com.test.board.controller" />

// root-context.xml (Non-Web 관련)
<context:component-scan base-package="com.test.board.model" />

🌽 Dependecy Injection

  • 객체 간의 의존관계를 자신이 아닌 외부의 조립기가 수행
  • 제어의 역행 이라는 의미로 사용
  • DI 통해 시스템에 있는 각 객체를 조정하는 외부 개체가 객체들에게 생성시에 의존관계를 주어짐
  • 느슨한 결합의 주요 강점
    • 객체는 인터페이스에 의한 의존 관계만을 알고 있으며, 이 의존 관계는 구현 클래스에 대한 차이를 모르는채 서로 다른 구현으로 대체 가능
  • Spring Container가 DI 조립기 제공

🍃 Spring 설정

📗 .xml

1. 빈 객체 생성 및 주입

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

2. 빈 객체 얻기

  • 설정 파일에 설정한 bean을 Container가 제공하는 주입기 역할의 api를 통해 주입 받음
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/test/board/controller/applicationContext.xml");
CommonService memberService = ctx.getBean("memberService", "MemberService.class");
property : get/set 메서드 주입
<bean id="dao" class="com.test.board.dao.UserDao">

<bean id="memberDao" class="com.test.board.dao.MemberDao">
    <property name= "get/set메서드명" value="문자열이파라미터" />
      <property name= "get/set메서드명" ref="객체가파라미터" />
</bean>
constructor-arg : 생성자 주입
<bean id="dao" class="com.test.board.dao.UserDao">

<bean id="memberDao" class="com.test.board.dao.MemberDao">
    <constructor-arg value="홍길동" />      // name 변수
    <constructor-arg value="30" />            // age 변수
      <constructor-arg ref="dao" />
</bean>

📘 Annotation

Annotation의 종류

  • @Repository : DAO 클래스에 사용, AOP 적용 대상을 선정하기 위해 사용
  • @Service : Service 클래스에 사용
  • @Controller : MVC Controller에 사용, 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정
  • @Component : 위의 Annotation을 구분해 적용하기 어려운 일반적 경우 사용
@Autowired

스프링 프레임워크에서 지원하는 Dependency 정의 용도의 Annotation으로 정밀한 DI가 필요한 경우에 유용하다.

🌽 Spring Bean의 생명 주기(Life Cycle)

빈 생성 -> 의존성 주입 -> init-method 실행 -> 빈 사용 -> destroy-method 실행 -> 빈 소멸