leelee.log
[Spring] PSA란 무엇인가? 본문
스프링이 제공해주는 가장 강력한 기능은 IoC, AOP, PSA라고 한다. 앞의 두 개는 들어본적이 있는데 PSA는 정말 처음 들어보는 개념이다. 강의의 마지막으로 PSA를 다루고 있어서 마지막 포스팅으로 PSA를 다루고자 한다. 이 포스팅이 끝나면 기초가 끝나고 아주 약간의 심화 과정인 'Spring 필수개념' 강좌를 들을 예정이다.
PSA역시 약자이다. Portable Service Abstraction. Portable, Abstraction만 보고도 어떤 기능을 제공해주는지 아주 약간 감이 왔다. 코딩을 할 때 Portable과 Abstraction은 몇 번을 강조해도 모자라는 중요한 개념이자, 좋은 코드의 기준이 되는 개념이다. Portable은 코드를 떼어서 다른 부분에서 사용하여도 전혀 이상이 없는 철저하게 Unit화가 된 코드의 형태이고 Abstraction은 추상화인데 이 또한 Portable한 코드를 만드는 기준이 된다. 그럼 스프링에서 이와 관련되게 제공하는 기능이 뭘까?
MVC 패턴을 사용할 때 보통은 Controller를 만들어서 @RequestMapping이나 @GetMapping 어노테이션을 만들고 그 안에 value로 url을 적어주면 알아서 매핑이 되어서 브라우저 등 에서 url을 치고 들어가면 우리가 만들어 놓은 html 페이지나 restapi인 경우 responsebody를 받을 수 있다. 이 당연한 과정 속에 사실은 PSA가 들어가 있다.
MVC 패턴 구조를 보면 익숙한 Model과 View, Controller가 보인다. 그런데 Client의 request를 제일 처음 받은 요소는 Dispatcher Servlet이라고 따로 있다. 보통 MVC 패턴의 구조를 만들면서 저 Dispatcher servlet에 대한 코딩을 따로 한 적이 없었는데 원래 톰캣을 사용하는 환경의 Java에서 네트워크 상에서 Client의 Request를 받아오기 위해서는 HttpServelet라는 class를 상속하여 따로 코딩을 해줘야 한다. Spring에 내장된 Tomcat을 항상 자연스럽게 사용하면서 HttpServelet을 사용한적이 없는 이유는 @RequestMapping, @GetMapping의 어노테이션을 사용하면 Spring이 알아서 다 해주기 때문이다. 때문에 개발자는 low level 까지 알 필요 없이 간단하게 mvc 구조의 프로그램을 만들 수 있다. 깊은 low level을 모르고 그냥 사용할 수 있는게 바로 Abstraction이다. PSA에서 제공해주는 Abstraction이 바로 이 점인 것이다.
DB를 연동해서 사용하다보면 Select가 아닌 Update나 Insert문을 사용할 때 트랜젝션 처리에 대해서 생각을 하게 된다. 트랜젝션이란 DB에 1,2,3,4의 정보를 넣으려고 할 때 그 중 하나라도 제대로 작업완료하지 않으면 다시 처음으로 돌아가 아무 일도 일어나지 않게 하는 일종의 예방법이다. 그런데 spring에서는 이런 작업을 구현 방법 등의 깊은 사항은 알 필요 없이 @Transactional 어노테이션만 추가해주면 끝난다. 이 또한 spring PSA의 한 예이다.
여태 PSA의 Abstraction에 대해서만 말을 했는데 그럼 Portable은 어떤 기능인지 한 번 알아보겠다.
Spring MVC 프로그램을 만들 때 외부 라이브러리 중 꼭 include 해오는 라이브러리가 있다. 바로 spring boot web starter이다. 이 라이브러리를 가져와서 사용할 경우 자동으로 내장(embeded) 톰캣을 사용할 수 있다. 우리가 local 에서 debug를 하면 localhost:8080/ 으로 접속이 가능한 이유도 이 내장된 톰캣이 돌아가고 있기 때문이다. 이처럼 내장된 톰캣을 사용해서 프로그래밍을 하는 것이 대다수인데 요즘 나온 spring boot starter webflux 라이브러리를 사용하면 기본으로 내장된 서버가 톰캣이 아니라 netty 라고 한다. (webflux에 대한 설명이 잘 되어있는 블로그 주소를 밑에 남긴다). 내장된 서버가 톰켓에서 netty로 바뀌었으니 같이 수정을 해야 할 코드가 정말 많아졌다. 그런데 사실 spring에서는 사용하는 서버를 바꾸는 대변화를 일으켜도 수정해야 할 코드가 많지 않다! 왜냐하면 spring은 portable 하니까!
사전에서 portable을 찾아보면 "휴대용의" 라고 나온다. Spring에서 작성한 코드도 휴대용이다. Tomcat 환경에서 쓴 코드를 그대로 휴대해서 들고가 netty에서 사용해도 된다. 물론 몇몇가지 부분은 꼭 변경을 해야겠지만 정말 멋지고 편리한 기능이다.
PSA를 설명하면서 마치 portable과 abstraction이 별도의 개념인 마냥 말을 했지만 사실 둘은 함께 하는 개념이다. 코드가 Abstraction하게 작성이 되었기 때문에 이리저리 portable하게 들고 다닐 수 있다. 예전에 자바를 처음 배웠을 떄 부터 코드를 모듈화 해라, 높은 응집도를 추구하고 낮은 결합도를 추구하라는 말을 많이 들었다. 코드를 모듈화하다 보면 코드 블럭 자체만으로 작동에 문제가 없어서 다른 프로젝트에 덜렁 들고 가도 작동의 문제가 없다. 이런 코드를 작성하기 위해서는 Abstraction, 즉 추상화를 잘 해야 한다. 직접적으로 결합이 되어있지 않고 추상적으로 결합이 되어있어야 결합도가 약해져 portable하기 때문이다.
https://brunch.co.kr/@springboot/96
'개발 > Backend' 카테고리의 다른 글
[Spring] applicationContext를 이용하여 존재하는 bean 가져오기 + Runner.java (0) | 2020.03.17 |
---|---|
[Spring] Bean LifeCycle (0) | 2020.03.13 |
[Spring] IoC 컨테이너와 Bean, DI (0) | 2020.02.23 |
[Spring] @annotaion으로 Spring AOP 기능 구현 (0) | 2020.02.18 |
[Spring] Spring AOP를 구현하는 Proxy Pattern (0) | 2020.02.16 |