대충 정리

[대충 정리] sw아카데미 Spring 2일차

0taek 2023. 1. 25. 00:15

1. IoC(Inversion of Control)

- 제어의 역전이라고 한다.

- 하나의 설계 원칙이자 디자인 패턴으로도 불린다.

 

 

그전에 기존의 제어 흐름은?

- Order entety의 구조를 보았을 때, order가 사용할 클래스를 결정하고 해당 클래스의 객체를 생성한다.

- 즉 ,Order entety는 모든 종류의 작업을 사용하는 쪽에서 제어를 하는 구조이다.

 

Order Class 구조, 사용할 클래스를 결정하는 사실은 생성자에서 확인 가능하다.

 

Order 인스턴스 생성, 이 또한 인스턴스 생성 부에서 확인 가능하다.

 

- 제어의 역전이란 이런 제어의 흐름이 역전되는 것을 말한다.

- 즉, 제어의 역전(IoC)상황에서는 객체가 스스로 선택과 생성을 하지 않는다.

 

 

 

IoC 상황에서의 코드는?

orderService의 객체 생성 권한은 orderContext에 넘겨졌다. 반면에 orderContext의 인스턴스 생성은 본인이 수행.
order 클래스 객체 생성 권한 또한 orderService를 건너 orderContext에 넘겨졌다.

 

- 간단하게 order의 생성을 본인이 하느냐, orderService가 하느냐의 차이이다.

- OrderContext 클래스는 IoC 컨테이너이다.

 

프레임 워크에서 IoC는?

- 라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어한다.

- 프레임워크는 거꾸로 애플리케이션 코드가 프레임워크에 의해 사용된다. 

- 즉, 프레임워크의 개발자가 만든 애플리케이션 코드를 주로 사용하는 프로그래밍이다.

   (안드로이드에 대입해보면 맞는 것 같다.)

- Spring을 이용한 개발도 IoC 상황 속의 개발이다. 

 

 

IoC 컨테이너

- 다른 객체의 인스턴스 생성에 대한 제어권을 가지고 있는 것이 IoC 컨테이너이다.

- 즉, IoC가 가능한 공간을 뜻한다.

 

 

2. Domain Driven Design

 

Aggregate

- Entity들의 집합

- 그 집합 안에서도 루트가 존재, 이 또한 Entity

 

 

Repository

- Entity를 저장하는 장소

 

https://speakerdeck.com/naoty/repository-pattern-in-swift?slide=4
https://developer88.tistory.com/210
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs- patterns/infrastructure-persistence-layer-design

 

ApplicationContext

- IoC Container에게 특정 클래스들을 제공한다면, IoC Container는 의존관계 맺어주고 생명주기 관리 및 객체 인스턴스 생성

- 스프링에서는 이를 ApplicationContext 프레임 워크로 제공, 즉 ApplicationContext는 IoC Container이다.

- 인터페이스이다.

 

Bean

- IoC Container에 의해 관리되는 객체, 즉 Spring에 의하여 생성되고 관리되는 자바 객체

- Bean은 어노테이션에 의해 정의된다. 

 

https://codevang.tistory.com/258

여기서는 order 객체가 되겠다.

Configuration Metadata

- 실제 만들어야 할 bean의 정보를 받아오거나 등록하는 곳

- 즉, IoC Container 통해 관리되는 객체를 생성 및 구성

- 따라서 IoC Container 안에서 동작한다?? 이건 뇌피셜

- xml, java 파일로 작성 가능

- xml로 구현할 경우 GenericXmlApplicationContext 구현체를 사용한다.

- 자바로 구현할 경우 AnnotationConfigApplicationContext 구현체를 사용한다.

 

종합 활용 코드

기존의 OrderContext 클래스를 변환한 것, Annotation을 통해 Bean과 Configuration을 정의한다. 즉, Configuration Metadata이다.
ApplicationContext의 인스턴스는 AnnotationConfigApplicationContext 클래스이다.  생성자의 인자로 Configuration Metadata를 받는다.

 

ApplicaitonContext는 실제 만들어야할 Bean 정보를 Configuration Metadata (설정 메
타데이터)로부터 받아온다. 

 

위 코드에서, 참조 변수 applicationContext가 가리키는 인스턴스는 Configuration Metadata의 구현체 AnnotationConfigApplicationContext 이다.

application에 대한 인스턴스는 따로 없는걸까?

 

Dependency Injection(의존성 부여)

- IoC를 구현하는 하나의 디자인 패턴

- 생성자를 통해서 주입을 받는 패턴을 생성자 주입 패턴이라 그래요

- Constructer-based Dependency Injection (recommended)

- setter-based

 

후술할 Bean들이 해당 코드의 Bean에 대해 의존성을 가질 예정

 

이전의 Bean 메소드 표현법

 

해당 코드에서는 다른 Bean에 대한 의존성이 있다는 사실을 파악하기 힘들..정도는 아니지만 조금 불편하다.

 

스프링에서 어떤 Bean이 다른 Bean을 사용한다는 사실을 명시하면, 자동으로 해당 Bean을 찾아 인스턴스를 생성하여 넣어준다.

 

프로그래머도 해당 메소드가 다른 Bean에 대한 의존성이 있다는 사실을 파악할 수 있다.

getter 메소드로 가져올 것을 setter처럼 사용한다.

 

자동 생성은 Autowriting으로 파악할 수 있다.