[대충 정리] sw아카데미 Spring 2일차
1. IoC(Inversion of Control)
- 제어의 역전이라고 한다.
- 하나의 설계 원칙이자 디자인 패턴으로도 불린다.
그전에 기존의 제어 흐름은?
- Order entety의 구조를 보았을 때, order가 사용할 클래스를 결정하고 해당 클래스의 객체를 생성한다.
- 즉 ,Order entety는 모든 종류의 작업을 사용하는 쪽에서 제어를 하는 구조이다.
- 제어의 역전이란 이런 제어의 흐름이 역전되는 것을 말한다.
- 즉, 제어의 역전(IoC)상황에서는 객체가 스스로 선택과 생성을 하지 않는다.
IoC 상황에서의 코드는?
- 간단하게 order의 생성을 본인이 하느냐, orderService가 하느냐의 차이이다.
- OrderContext 클래스는 IoC 컨테이너이다.
프레임 워크에서 IoC는?
- 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.
- 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다.
- 즉, 프레임워크의 개발자가 만든 애플리케이션 코드를 주로 사용하는 프로그래밍이다.
(안드로이드에 대입해보면 맞는 것 같다.)
- Spring을 이용한 개발도 IoC 상황 속의 개발이다.
IoC 컨테이너
- 다른 객체의 인스턴스 생성에 대한 제어권을 가지고 있는 것이 IoC 컨테이너이다.
- 즉, IoC가 가능한 공간을 뜻한다.
2. Domain Driven Design
Aggregate
- Entity들의 집합
- 그 집합 안에서도 루트가 존재, 이 또한 Entity
Repository
- Entity를 저장하는 장소
ApplicationContext
- IoC Container에게 특정 클래스들을 제공한다면, IoC Container는 의존관계 맺어주고 생명주기 관리 및 객체 인스턴스 생성
- 스프링에서는 이를 ApplicationContext 프레임 워크로 제공, 즉 ApplicationContext는 IoC Container이다.
- 인터페이스이다.
Bean
- IoC Container에 의해 관리되는 객체, 즉 Spring에 의하여 생성되고 관리되는 자바 객체
- Bean은 어노테이션에 의해 정의된다.
여기서는 order 객체가 되겠다.
Configuration Metadata
- 실제 만들어야 할 bean의 정보를 받아오거나 등록하는 곳
- 즉, IoC Container 통해 관리되는 객체를 생성 및 구성
- 따라서 IoC Container 안에서 동작한다?? 이건 뇌피셜
- xml, java 파일로 작성 가능
- xml로 구현할 경우 GenericXmlApplicationContext 구현체를 사용한다.
- 자바로 구현할 경우 AnnotationConfigApplicationContext 구현체를 사용한다.
종합 활용 코드
ApplicaitonContext는 실제 만들어야할 Bean 정보를 Configuration Metadata (설정 메
타데이터)로부터 받아온다.
위 코드에서, 참조 변수 applicationContext가 가리키는 인스턴스는 Configuration Metadata의 구현체 AnnotationConfigApplicationContext 이다.
application에 대한 인스턴스는 따로 없는걸까?
Dependency Injection(의존성 부여)
- IoC를 구현하는 하나의 디자인 패턴
- 생성자를 통해서 주입을 받는 패턴을 생성자 주입 패턴이라 그래요
- Constructer-based Dependency Injection (recommended)
- setter-based
해당 코드에서는 다른 Bean에 대한 의존성이 있다는 사실을 파악하기 힘들..정도는 아니지만 조금 불편하다.
프로그래머도 해당 메소드가 다른 Bean에 대한 의존성이 있다는 사실을 파악할 수 있다.
getter 메소드로 가져올 것을 setter처럼 사용한다.