개발/SPRING & JPA

[토비] 8.4 스프링의 기술

Leedo1982 2021. 5. 23. 13:02

POJO의 조건

  • 특정 규약(contract)에 종속되지 않는다.
  • 특정환경에 종속되지 않는다.

스프링에는 POJO 프로그래밍을 손쉽게 할 수 있도록 지원하는 세가지 가능 기술을 제공한다.

세가지 기술은 바로 Ioc/DI , AOP, PSA(portable Service Abstraction) 다. 사실은 객체지향의 설계와 개발원리를 잘 적용하다보면 자연스럽게 먼들어지는 것들이다. 다만 스프링은 그것을 통일성 있게, 더 세련된 방법으로, 자바엔트프라이즈 개발의 전 영역에 걸쳐 효과적으로 적용될 수 있도록 프레임워크 형태로 제공하고 있다.

  1. 제어의 역전(IoC) / 의존관계 주입(DI)
    왜 두개의 오브젝트를 분리해서 만들고, 인터페이스를 두고 느슨하게 연결한 뒤 실제 사용할 대상은 DI를 통해 외부에서 지정하는 걸까? 강한 결합을 쓰는 방법보다 나은점은 무었일까?

가장 간단한 답변은 "유연한 확장이 가능하게 하기 위해서" 라고 할수 있다. 유연한 확장은 OCP 의 '확장에는 열려 있다' 또는 '변경에는 닫혀있다'로 설명 가능하다. 폐쇄관점에서 볼때 장점은 '재상용이 가능하다' 라고 볼수 있다

A → B 의 의존관계를 갖는 구조일때, 확장은 B가 자유롭게 변경될 수 있음을 의미한다. 즉, B가 변경돼도 A는 아무런 영향을 받지않고 그대로 유지 가능하다는 뜻이기도하다. B 관점에서는 유연한 확장이고 A 관점으로 보자면 변경없이 재상용이 가능하다고 볼 수 있다.

개념적인 설명 말고 구체적으로 DI 의 활용 방식을 살펴보면
- 핵심기능 변경 : A → B 구조에서 A의 기능을 일부 B 에 의임한다면 B의 구현방식에 따라 B1,B2,B3으로 바꾸는것이다. 이렇게 실제 의존하는 대상이 가진 핵심기능을 DI 설정을 통해 변경하는 것이 대표적인 DI 활용방법이다.
- 핵심기능의 동적인 변경 : 일반적인 DI를 이용한 변경방법과 달리, 동적으로 매번 다르게 변경할 수 있다. 런타임 시에 동적인 방식으로 연결되지만 한번DI 되면 바뀌지 않는 정적인 관계를 맺어주는 것이다.
- 부가기능의 추가 : 핵심기능은 그대로 둔채로 부가기능을 추가하는 것이다. 실제 사용할 오브젝트는 외부에서 주입하는 DI 주입하는 DI를 적용해두면 데코레이터 패턴을 쉽게 적용할 수 있다.
- 인터페이스의 변경 : 때로는 사용하려고 하는 오브젝트가 가진 인터페이스가 클라이언트 호환되지 않는 경우가 있다. A가 C 오브젝트를 사용하려 한다고 해보자. 하지만 A는 원래 B 인터페이스를 사요하도록 만들어져 있고 C 는 B 인터페이스를 구현하지 않았다. 이때 A가 DI를 통해 B의 구현 오브젝트를 받도록 만들어져 있다면 B 인터페이스를 구현했으면서 내부에서 C 를 호출해주는 기능을 가진 어뎁터 오브젝트를 만들어 A 에 DI 해주면 된다.
- 프록시 : 필요한 시점에서 실제 사용할 오브젝트를 초기화하고 리소스를 준비하게 해주는 지연된 로딩을 적용하려면 프록시가 필요하다. 원격 오브젝트를 호출할 때 마치 로컬에 존재하는 오브젝트처럼 사용할 수 있게해주는 원격 프록시를 적용하려고 할때도 프록시가 필요하다. 두가지 방법 모두 DI를 필요로 한다.
- 템플릿과 콜백 : 템플릿/콜백 패턴은 DI 의 특별한 적용방법이다. 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리해서 템플릿과 콜백으로 만들고 이를 DI 원리를 응용해 적용하면 코드를 간결하게 만들 수 있다.
- 싱글톤과 오브젝트 스코프 : DI를 프레임워크로 이용한다는건 DI 대상 오브젝트를 컨테이너가 관리한다는 의미다. 오브젝트 생성부터 관계설정, 이용, 소멸에 이르기까지 모든과정을 DI 컨테이너가 주관하기 대문에 그 오브젝트의 스코프를 자유롭게 제어할 수 있다.
- 테스트 : 여타 오브젝트와 협력해서 동작하는 오브젝트를 효과적으로 테스트하는 방법은 가능한 한 고립시키는 것이다.
2. 애스펙트 지향 프로그래밍(AOP)
AOP는 OOP 처럼 독립적인 프로그래밍 패러다임이 아니다. 서로 배타적이 아니라는 말이다. AOP 는 객체지향 기술의 한계와 단점을 국복하도록 도와주는 보조적인 프로그램이 기술이다.
- AOP 적용기법
AOP 를 자바 언어에 적용하는 기법은 크게 두가지로 분류할 수 있다.
- 첫번째는 스프링과 같은 다이내믹 프록시를 사용하는 방법이다.
이 방법은 기존 코드에 영향을 주지 않고 부가기능을 적용하게 해주는 데코레이터 패턴을 응용한 것이다.
- 두번째는 자바언어의 한계를 넘어 언어의 확장을 이용하는 방법이다.
AspectJ 라는 유명한 오픈소스 AOP툴이 있다. AspectJ 는 프록시 방식의 AOP 에서는 불가능한 다양한 조인포인트를 제공한다. 메소드 호출뿐 아니라 인스턴스 생성, 필드액세스, 특정 호출 경로를 가진 메소드 호출 등에도 부가기능을 제공할 수 있다.
- AOP 적용단계
AOP는 하나의 모듈이 수많은 오브젝트에 보이지 않게 적용되기 때문에 주의해서 사용해야 한다.
- AOP 적용 1단계 : 미리 준비된 AOP 이용
처음에는 스프링이 미리 만들어서 제공하는 AOP 기능을 그대로 가져다 적용하는 것으로 시작ㅎ라.
- AOP 적용 2단계 : 전담팀을 통한 AOP 적용
아직까지는 개발자 개개인이 AOP 기능을 직접 이용하게 해서는 안된다. 대신 애플리케이션 전체적으로 이용 가능한 것을 소수의 AOP 담당자 관리하에 적용해볼 수 있다.
- AOP 적용 3단계 : AOP 의 자유로운 이용
1,2 단계를 통해 어느정도 친숙해지고, 장단점, 응용전략, 위험성 등을 어느정도 인지했다면 개발자 스스로 AOP를 활용할 수 있는 단계로 넘어갈 수 있다.
3. 포터블 서비스 추상화(PSA)
환경과 세부기술의 변화에 관계없이 일관된 방식으로 기술에 접근할 수 있게해주는 PSA다.
스프링의 서비스 추상화의 개념과 장점을 잘 이해한다면 때에 따라 직접 서비스 추상화 기법을 적용할 필요도 있다. 필요하면 스프링이 그랫던 것처럼 직접 추상 레이어를 도입하고 일관성있는 API 를 정의해서 사용하면 된다.
서비스 추상화를 위해 필요한 기술은 DI뿐이다. 결국 DI 응용방법의 한가지이므로 DI를 적극 활용해서 개발한다면 서비스 추상화는 자연스럽게 만들어 쓸 수 있다.

'개발 > SPRING & JPA' 카테고리의 다른 글

JVM 구조  (0) 2021.05.30
[Spring] bean lifecycle  (0) 2021.05.25
[Spring-Core] Bean Overview  (0) 2021.04.19
[Spring-Core] 1.2 Container Overview  (0) 2021.04.16
[Spring-Core] 1.1 Introduction to the Spring IoC container and Beans  (0) 2021.04.16