SpringFramework - DI, Ioc

BbongGu·2023년 4월 17일

SpringFramework

목록 보기
1/3

DI - Dependency Injection (의존성 주입)

Spring을 사용할 때 얻을 수 있는 장점

  1. 자바로 Enterprise Application을 만들 때 포괄적으로 사용하는 Programming 및 Configuration Model을 제공해 주는 Framework로 Application수준의 인프라 스트럭쳐를 제공
  2. 개발자가 Logic에 전념할 수 있도록 기본처리를도와줌

IoC (Inversion of Control, 제어의 역행)

  • 객체지향 언어에서 Object간의 연결 관계를 런타임에 결정
  • 객체 간의 관계가 느슨하게 연결됨(losse coupling)
  • IoC의 구현 방법 중 하나가 DI(Dependency Injection)

Container

  • 객체의 생성, 사용, 소멸에 해당하는 라이프사이클을 담당
  • Dependency 객체 제공
  • Thread관리
  • 기타 환경 설정
  • 필요성
    • 비즈니스 로직 외에 부가적인 기능들에 대해서는 독립적으로 관리되도록 하기 위함
    • 서비스 look up 이나 Configuration에 대한 일관성을 갖기 위함
    • 서비스 객체를 사용하기 위해 각가가 Factory 또는 Singleton패턴을 직접 구현하지 않아도 됨
  • BeanFactory, ApplicationContext가 있음

Bean(빈)

  • 스프링이 IoC방식으로 관리하는 오브젝트
  • 스프링이 직접 그 생성과 제어를 담당하는 오브젝트만을 Bean이라고 부른다

BeanFactory(빈 팩토리)

  • 스프링이 IoC를 담당하는 핵심 컨테이너
  • Bean을 등록, 생성, 조회, 반환하는 기능을 담당.
  • 일반적으로 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 이용한다.

ApplicationContext

  • BeanFactory를 확장한 IoC컨테이너이다.
  • Bean을 등록하고 관리하는 기본적인 기능은 BeanFactory와 동일하다.
  • BeanFactory라고 부를 때는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고, 애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기하는 것이라고 보면된다.

사용방법

  1. XML
	<!--BoadDaoImpl class에 dataSource, dbUtil을 넣음 -->
	<bean id="boardDao" class="com.ssafy.board.model.dao.BoardDaoImpl">
		<constructor-arg ref="dataSource"></constructor-arg>
		<constructor-arg ref="dbUtil"></constructor-arg>
	</bean>
	<bean id="boardService" class="com.ssafy.board.model.service.BoardServiceImpl">
		<constructor-arg ref="boardDao"></constructor-arg>
	</bean>
	<bean id="boadController" class="com.ssafy.board.controller.BoardController">
		<constructor-arg ref="boardService"></constructor-arg>
	</bean>
  1. XML + Annotation
<!-- XML에서 Annotation을 사용하겠다고 선언함 -->
<context:component-scan base-package="com.ssafy" />
  1. Annotation
@Configuration
@ComponentScan(basePackages = {"com.ssafy"})
public class Config {
	@Bean
	public DataSource dataSource() {
		SimpleDriverDataSource s = new SimpleDriverDataSource();
		s.setDriverClass(com.mysql.cj.jdbc.Driver.class);
		s.setUrl("jdbc:mysql://127.0.0.1:3306/ssafyweb?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8");
		s.setUsername("ssafy");
		s.setPassword("ssafy");
		return s;
	}
}

Annotation 방식은 Spring이 알아서 Annotation을 읽어들여 Bean 객체로 만든다.

@Component("BoardServiceImpl")
public class BoardServiceImpl implements BoardService {

	private BoardDao boardDao;
	
	public BoardServiceImpl() {
		
	}
	@Autowired
	public BoardServiceImpl(@Qualifier("BoardDao") BoardDao boardDao) {
		super();
		this.boardDao = boardDao;
	}
}

Autowired란

필요한 의존 객체의 “타입"에 해당하는 빈을 찾아 주입한다.

  • 생성자
  • setter
  • 필드

위의 3가지의 경우에 Autowired를 사용할 수 있다. 그리고 Autowired는 기본값이 true이기 때문에 의존성 주입을 할 대상을 찾지 못한다면 애플리케이션 구동에 실패한다.

profile
개발새내기

0개의 댓글