[Spring] 의존성 주입(DI), Annotation 기반 설정과 빈 객체 스캔

geesuee·2021년 10월 1일
3

Spring & Spring Boot

목록 보기
1/7
post-thumbnail

1. 🍃Spring이란?

자바 개발자들에게 봄이 찾아왔다..🌸(과연....학습에도 꽃길..? 거대한 스프링 생태계 ㄷㄷ)
: 소규모 애플리케이션 또는 기업용 애플리케이션을 자바로 개발하는데 있어 유용하고 편리한 기능을 제공하는 프레임워크

ㄴ 대표적인 자바 개발 프레임워크



2. 의존성 주입(Dependency Injection)

  • 어떤 객체가 사용하는 의존 객체를 직접 만들어서 사용하는 것이 아니라, 주입 받아 사용하는 방법
  • 객체 사이의 의존 관계가 객체 자신이 아닌 외부 조립기에 의해 설정됨
  • IoC(Inversion of Control) 컨테이너의 역할 : A 객체가 필요로하는 의존 관계 객체 B를 직접 생성하여 A 객체로 주입(설정)

사실 이 말만 보고는 대체 뭔소린지 이해가 안갔다..ㅎ 하나씩 찬찬히 더 정리해보기로..ㄱㄱ


먼저,

의존성이란, 객체가 다른 객체를 참조하는 것


하나의 자동차 객체를 만든다고 생각해보자,
자동차를 만들기 위해서는 타이어, 핸들, 브레이크, 엔진 등등 다양한 부품이 필요하다.
자동차라는 객체를 만들기 위해서는 타이어 객체, 핸들 객체, 브레이크 객체가 만들어져 있어야하고,
자동차 객체는 위의 부품 객체들을 참조하여 만들어진다.
= 자동차 객체와 부품 객체들 간에 의존성이 존재한다.



의존성이 무엇인지 알았다면,

의존성 주입이란,

의존 관계에서 특정 객체가 의존 객체를 직접 생성하는 것이 아니라

외부에서 의존 객체를 생성하여 해당 객체에 장착하는 것

자동차 객체를 만들 때 자동차 객체 안에서 타이어 객체, 핸들 객체를 생성하여 사용하는 것이 아니라
빈으로 만들어져있는 각각의 부품 객체를 주입 받아 사용하는 것이다.

스프링 IoC(Inversion of Control) 컨테이너가 빈을 생성 및 관리하고, 의존 관계에 따라 의존 객체를 주입 시킨다.

잠깐🖐, 스프링 IoC 컨테이너란?

  • Inversion of Control Container
  • BeanFactory 빈의 집합소
  • 애플리케이션 컴포넌트의 중앙 저장소
  • 빈 인스턴스 생성, 의존 관계 설정, 빈 제공
  • 빈 설정 소스로부터 빈 정의를 읽어들이고, 빈을 구성(생성 및 의존성 주입)하고 제공함

잠깐🖐🖐, 스프링 Bean이란?

  • 스프링 IoC 컨테이너가 관리하는 객체
  • 스프링이 제어권을 가지고 생성, 객체 간 관계를 관리하는 객체
  • 이 전에 단순 java Class로 존재하던 domain들을 Bean으로 생성하여 사용 가능
  • 장점1 : IoC 컨테이너가 알아서 의존성을 관리해줌
  • 장점2 : 스코프 설정에 따라 싱글톤(항상 같은 객체,1개 생성 후 공유), 프로토타입(매번 다른 객체)을 선택하여 일괄적으로 사용 가능
  • 장점3 : 라이프사이클 인터페이스, 객체 간 의존 관계와 객체들의 생명주기를 스프링 기반으로 간편하게 개발 및 유지 보수 가능


그렇다면, 의존성 주입은 어떻게?

의존성 주입 방법

Contructor Injection(생성자 활용 주입)

  • 의존하는 빈 객체를 컨테이너로부터 생성자의 파라미터를 통해 전달받는 방식
  • 클래스를 초기화 할 때 컨테이너로부터 의존 관계에 있는 빈 객체를 생성자를 통해 할당받는 방법
  • <constructor-arg> (아래 코드에 다양한 사용 방식 명시)
  • car 객체가 tire 객체를 참조
    <constructor-arg ref="tire" /> 혹은 <constructor-arg><ref bean="tire" /></constructor-arg>
<bean id="tire" class="model.domain.Tire">
	<constructor-arg name="productNo" value="001" />
	<constructor-arg name="manufacturer" value="NEXEN" />
  	<constructor-arg>
		<value>58000</value>
	</constructor-arg>
</bean>

<bean id="car" class="model.domain.Car">
	<constructor-arg value="001" />
  	<constructor-arg name = "productName" value="sportage" />
  	<constructor-arg name = "manufacturer" value="KIA" />
	<constructor-arg ref="tire" />
</bean>

Setter Injection(Setter 활용 주입)

  • 의존하는 빈 객체를 컨테이너로부터 setter() 메소드를 통해 전달받는 방식
  • 의존하는 객체를 전달 받을 멤버 변수의 setter() 메소드 작성
  • <property> (아래 코드에 다양한 사용 방식 명시)
  • 마찬가지로 객체인 경우 <ref>, 문제열 혹은 기본 데이터의 경우 <value> 사용
    (이 외 <list>, <set>, <map>, <properties>도 가능)
<bean id="tire" class="model.domain.Tire">
	<property name="productNo" value="001" />
	<property name="manufacturer" value="NEXEN" />
  	<property>
		<value>58000</value>
	</property>
</bean>

<bean id="car" class="model.domain.Car">
	<property value="001" />
  	<property name = "productName" value="sportage" />
  	<property name = "manufacturer" value="KIA" />
	<property ref="tire" />
</bean>


3. Annotation 기반 설정과 빈 객체 스캔

JPA에서도 그랬듯, 애노테이션은 @ 하나로 오만가지 코드를 대체한다. 아 달다~🍬

스프링에서 @를 사용하려면,

스프링 설정 소스에 스펙을 지정해주어야 한다.

  • 스프링 컨테이너(applicationContext.xml)에 디폴트 beans 외에 context configuration 설정

  • Source에 애노테이션 설정
    <context:annotation-config />

  • Source에 애노테이션을 사용할 package 명시 = 빈 객체 스캔
    <context:component-scan base-package="model.domain" />

    잠깐🖐, 빈 객체 스캔이란?
    스프링 빈 객체를 xml과 같은 스프링 설정 파일에 명시적으로 선언하지 않고
    빈으로 사용될 클래스에 애노테이션을 부여, 애노테이션이 붙은 클래스들을 자동으로 찾아 빈으로 등록하는 방식
    빈 스캐닝 하기 위해서 설정 파일에 스캐닝 할 파일이 있는 패키지명을 설정해주어야 함



자바 소스에 @ 설정

스프링 관련 애노테이션은 정말 정말 많을테지만,
이번 포스팅에는 그 중 빈을 등록하고 의존성을 주입하는 기본 애노테이션만 소개하겠다!
(왜냠 아직 그것 밖에 안 배웠따..ㅎ)

  • @Component / @Component("id")
    : 해당 애노테이션이 붙은 클래스를 스프링 빈으로 등록
    id값을 지정해주면 해당 id로 빈이 등록됨
    디폴트는 클래스 이름에서 맨 앞 대문자만 소문자로 바꿔 id값 설정 (public class Car(){} -> Bean id="car")

  • @Scope
    : 스프링 빈 생성 범위/개수 설정 (singleton or prototype)

  • @Autowired
    : 변수/생성자/메소드에 다 설정 가능, 해당 타입에 맞는(byType) 스프링 빈 객체를 찾아 주입(의존 관계 설정)

  • @Resource
    : @Autowired와 유사, 이름을 기준으로(byName) 스프링 빈 객체를 찾아 주입(의존 관계 설정)




오늘은 여기까지,
이 후 학습 내용은 다음 TIL 시간에!

profile
기록하는 오늘의 노력🌻

1개의 댓글

comment-user-thumbnail
2021년 10월 8일

ㅋㅋㅋㅋㅋ 박진영 짤 너무 웃기네요

답글 달기