스프링 트라이앵글(Spring Triangle) - IoC, AOP, PSA

Dayeon myeong·2021년 1월 30일
2

스프링의 3대 요소(Spring Triangle)

이 글은 토비의 스프링과 인프런 예제로 배우는 스프링 입문, 스프링 프레임워크 핵심기술을 보고 정리한 글입니다.

1. 제어 역전 (IoC, Inversion of Control)

라이브러리와 다르게 모든 프레임워크에는 IoC 개념이 적용되어있다.

이 IoC라는 것은 제어의 역전이라는 말로 개발자가 아닌 툴이 제어권을 가져 클래스가 의존 객체를 직접 만드는 것들이 아니라 주입받아서 사용한다는 것을 말한다.

그리고 스프링 프레임워크에서 IoC 컨테이너에 있는 ApplicationContext와 BeanFactory(ApplicationContext는 BeanFactory를 상속받는다.) 인터페이스 덕분에 Bean으로 지정한 모든 클래스를 인스턴스로 등록해주어 다른 클래스에서 의존관계가 필요하다면 이 Bean(스프링 IoC 컨테이너가 관리 하는 객체)으로 등록된 인스턴스들을 전달해주어 의존성 주입(Dependency Injection)이 가능해진다.

IoC 컨테이너는 빈 설정 소스로부터 빈 정의를 읽어들이고, 의존관계를 설정하여 빈을 구성하고 제공해주는데 기본적으로 빈을 싱글톤으로 제공해주기때문에 제공된 빈은 항상 같은 객체일 것이며 인스턴스가 과다하게 생성되어 서버에 부담을 주는 일을 막을 수 있다.
또한 모든 Bean 들의 생명 주기(Life Cycle)를 IoC 컨테이너가 직접 관리해주기때문에 스프링 자체의 라이프사이클 콜백(인터페이스라고 보면 됨)을 이용해서 부가적인 가능도 가능하다.

+ 프레임워크와 라이브러리

프레임워크는 뼈대/틀을 가지고 다양한 형태의 결과를 만드는 것을 뜻하고, 제어의 역전 IoC 개념이 적용된 대표 기술이다. 이 프레임워크는 어떤 프로그램을 쉽게 만들기 위한 요소들을 제공해줌으로써 소프트웨어의 생산성과 품질을 높일 수 있게 된다.
그리고 라이브러리는 소프트웨어를 개발하기 쉽게 어떤 기능을 제공하는 도구들의 모음을 말한다.
이 둘의 차이는 바로 "제어 흐름에 대한 주도권이 누구에게 있는가"이다.
애플리케이션의 흐름 flow 를 누가 쥐고 있냐는 말인데,
라이브러리를 사용하는 애플리케이션 코드는 애플리케이션 흐름을 직접 제어하고 라이브러리는 동작 중에 필요한 기능이 있을때 가져다 쓰는 개념이다.
반면, 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용되는 것으로 프레임워크가 흐름을 주도하면서 개발자가 애플리케이션을 사용하도록 한다.( = 제어의 역전 IoC 개념이 적용되어있다.)

2. 관점 지향 프로그래밍 (AOP, Aspect Oriented Programming)

AOP는 관점 지향 프로그래밍으로 여러 개의 핵심 비즈니스 로직 외에 공통으로 처리되어야 하는 로그 출력, 보안처리, 예외 처리와 같은 코드를 모아서 처리를 편리하게 해준다.
대표적으로 @Transactional 로 트랜잭션 처리를 공통으로 넣어줄 수 있다.

AOP 구현 방법에는
1. 컴파일 이용방법
2. 바이트 코드 조작
3. 프록시 패턴
방법이 있는데 이 중 스프링은 프록시 패턴을 기반으로하여 AOP를 지원하고 있다. 프록시를 통해 핵심 로직을 구현한 객체에 접근하게 되면 핵심 로직을 실행하기 전,후에 공통된 기능을 적용하는 방식으로 AOP를 구현한다.

모든 요청(request)는 서블릿(Servlet)에 도달하기 전에 필터(Filter)가 먼저 해당 요청을 가로채 필터링하고 필터링된 출력값이 서블릿으로 간다. 그리고 서블릿을 거쳐 내부 로직을 처리하는 중에 입/출력단에서 다시 한번 인터셉터(Interceptor)가 동작하는데,이 필터와 인터셉터 계층에게 공통기능을 맡김으로서 개발자가 원하는 특정 로직에 공통 기능을 적용할 수 있다.

+ 서블릿

웹 프로그래밍에서 클라이언트 요청을 처리하고 처리 결과를 클라이언트에게 전송하는 기술로, 자바로 구현된 CGI(common gateway interface, 웹서버와 프로그램 간의 교환 방식)
프로그램에 html의 get,post 방법으로 클라이언트의 데이터를 서버로 전달하고 프로그램이 출력 결과를 클라이언트에게 전달하는 것.
MVC 패턴 중 controller로 이용된다.

AOP 용어

  • Advice : 언제 공통 기능을 적용할 지를 정의.(메서드를 호출하기 전/후)
  • Weaving : Advice를 핵심 로직 코드에 적용하는 것을 말함.
  • Jointpoint : Aspect를 적용할 타겟
  • Pointcut : Jointpoint 의 부분 집합으로 실제로 Advice가 적용되는 Jointpoint 를 나타낸다. 스프링에서는 정규표현식이나 AspectJ 문법을 이용하여 정의.
  • Aspect : 여러 객체에 공통으로 적용되는 기능을 트랜잭션이나 보안 등이 Aspect의 예시
  • Around, Before,After,,,

3. 추상화 서비스(PSA, Portable Service Abstraction)

외부 라이브러리들을 POJO로 사용할 수 있도록 일종의 껍데기를 씌워 추상화한 것으로, 스프링에서 추상화된 서비스들을 자바 언어로 자유롭게 사용할 수 있게 된다. 편의성을 제공해주고 완전히 다른 기술 스택으로도 애플리케이션이 작동할 수 있도록 해주어 코드를 바꿀 일이 줄어들게된다.

ex)
1. org.mybatis.spring은 mybatis를 스프링에서 POJO로 사용할 수 있게끔 추상화한 패키지이다.
2. spring mvc에서의 service abstraction : @Controller,@RequestMapping,,,
3. @Transactional : 트랜잭션의 대표 속성 all or nothing 기능을 이 어노테이션으로 트랜잭션 처리가 가능.
4. 스프링 캐시 @Cacheable , @CacheEvict,,,
5. 네티, 톰캣,제티,언더토우,,
6. Servlet, Reactive,,,

+ POJO

Plain Old Java Object, 순수한 자바로 작성된 객체

profile
부족함을 당당히 마주하는 용기

1개의 댓글

comment-user-thumbnail
2022년 6월 9일

잘봤습니다.

답글 달기