Notice
Recent Posts
Recent Comments
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
10-11 00:15
Archives
Today
Total
관리 메뉴

Developer_Neo

[Spring] - IOC/DI, AOP, PSA란? 본문

Spring

[Spring] - IOC/DI, AOP, PSA란?

_Neo_ 2022. 8. 12. 11:47
반응형
스프링 Framework의 3대 핵심 개념을 알아보자

 

1. IOC/DI (Inversion of Control/Dependency Injection)

1 - 1. IOC (Inversion of Control)

제어의 역전이라는 의미이다. 즉, 애플리케이션 흐름의 주도권을 Spring이 갖는다라는 것이다.

위의 말을 풀어서 설명하면, 우리가 알고리즘 문제를 풀때 DFS, BFS에 해당하는 메서드를 따로 작성하고 자바를 기준으로 main문에 적어서 작동시킨다. 하지만 IOC는 이것이 아니라 우리가 DFS, BFS에 해당하는 메서드를 적어 놓기만 하면, 알아서 해당 메서드 호출 주도권을 우리가 아닌 프로그램이 가진다라는 것이다.
또, 클래스 측면에서 보면, 하위 클래스에서 구현한 메서드들이 상위클래스에게 제어권이 있다라는 것이 있다.

컨테이너, 프레임워크 역할과 변경에 유연한 코드 구조라는 목적을 가지고 있는 객체 지향 프로그래밍에 적합한 구조이기 때문에 Spring Framework에서 사용.

※ 일반적인 제어의 흐름은 우리가 작성한 코드를 우리가 순차적으로 실행시키게 한다.

- 서버 컨테이너 기술, 디자인 패턴(메소드 패턴), 객체 지향 설계 등에 적용하게 되는 일반적인 개념
- 객체 생명 관리, 흐름 제어를 제 3자에게 위임하는 프로그래밍 모델

 

1 - 2. DI (Dependency Injection)

의존 관계 주입이라는 의미로 IoC 개념을 조금 구체화 시킨 것

외부로부터 제공(주입)받고 이를 통해 다른 객체들과 동적으로 의존관계가 만들어지는 것이 핵심이다.

Spring Framework에서 적용한 것으로 생각해보면, 생성자를 통해서 어떤 클래스의 객체를 전달 받는 것DI다.

느슨한 결합인 클래스들 간의 강한 결합을 피하기 위한 것

느슨한 결합 : 어떤 클래스가 인터페이스 같이 일반화된 구성 요소에 의존하고 있는 경우.

애플리케이션 코드 내부에서 직접적으로 new 키워드를 사용할 경우, SOLID의 DIP인 의존 관계 역전 원칙에 위반된다. 왜냐하면 new로써 생성한 구체화된 클래스에 의존하고 있는 형식이 되기 떄문이다. 따라서  좋은 객체지향 설계가 아니라서 이것을 피하기 위해 DI가 적용되었다라고 생각해도되겠다.

-Spring Framework가 DI인 의존성 주입을 대신 해주는데, 이에 우리가 의존성 주입이 될 수 있도록 코드를 작성해주어야한다. (ex) 생성자로써 의존성 주입받게 한다..)

[참고]
생성자 주입은 빈이 등록될 때 객체를 생성하는 것으로 어쩔 수 없이 생성자가 호출되어야하기 때문에 빈 등록하면서 의존관계 주입이 일어난다.

setter주입은 빈을 등록해 객체를 생성했다면, 이후 의존관계 주입의 단계에서 이루어진다.

 

토비의 스프링에서 말하는 DI 3가지 조건

1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 즉, 인터페이스에만 의존하고 있어야 한다.
2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.
3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다

 


2. AOP (Aspect Oriented Programming)

2022.08.06 - [Spring] - [Spring 입문] - AOP

 

[Spring 입문] - AOP

AOP란? Aspect Oriented Programming(관점 지향 프로그래밍)이다. 여러 객체에 공통적으로 적용할 수 있는 기능을 따로 정의해서, 다른 객체에 삽입해 코드의 재사용성을 높여주는 프로그래밍 기법 공통

devloper-dreaming.tistory.com

앞에서 다루었던 내용이 있다. 이에 조금만 더 자세히 들어가보자.

 

핵심 관심사항만 있는 코드들 전부에 각 각 공통 관심사항을 넣기에 매우 번거롭기에, 공통 관심사항과 핵심 관심사항을 분리하기 위해 사용하는 것

이라고 말했었다 더 구체적으로 말하면, 애플리케이션의 핵심 업무 로직에서 로깅이나 보안, 트랜잭션 같은 공통 기능 로직들을 분리하는 것이라고 한다.

 

AOP가 적용된 Spring Framwork의 어노테이션 -> @Transcational

 

Proxy 패턴을 발전시켜 만들어 졌다라고 합니다...

https://sabarada.tistory.com/97

 

AOP 사용으로 얻을 수 있는 이점

1. 코드의 간결성 유지
2. 객체 지향 설계 원칙에 맞는 코드 구현
3. 코드의 재사용

3. PSA (Portable Service Abstraction)

환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조

"잘 만든 인터페이스 하나가 열 클래스 부럽지 않다"

또 다르게 이야기하면, 클라이언트가 추상화 된 상위 클래스를 일관되게 바라보며 하위 클래스의 기능을 사용하는 것

클라이언트 : 우리가 작성한 코드를 사용하는 곳.. 아니면 서버라고 특정한 곳의 기능을 사용하는 쪽.

서비스 추상화(Service Abstraction) : 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것

위에서 언급만 했던 @Transactional 어노테이션을 보면, Spring Framework사용시 이것만 적고 안의 내용들을 모른다.
이때 이것이 해당 어노테이션이 추상화가 잘되어 있어서 기술을 내부에 숨겼다. 그리고 이 어노테이션만 사용하게 하였으니, 개발자에게 편의성을 제공해주는 것이다,

한마디로 정리하면 잘 만든 인터페이스라고 한다. - 백기선 님-

- Spring Web MVC, Spring Transaction, Spring Cache 등의 다양한 PSA를 제공

※ Java에서 코드로 추상화를 표현할 수 있는 대표적인 방법이 바로 추상 클래스와 인터페이스

 

https://dev-coco.tistory.com/83#%--%EC%-E%--%--%EB%A-%-C%EB%--%A-%--%EC%-D%B-%ED%--%B-%ED%-E%--%EC%-D%B-%EC%-A%A-%--%ED%--%--%EB%--%--%EA%B-%--%--%EC%--%B-%--%ED%--%B-%EB%-E%--%EC%-A%A-%--%EB%B-%--%EB%-F%BD%EC%A-%--%--%EC%--%-A%EB%-B%A-%--

 

 

 

반응형
Comments