PSA: portable service abstraction
우리가 보고있는 코드에 보다시피 우리는 서블릿 애플리케이션을 만들고 있음에도 불구하고 서블릿을 전혀 쓰고있지 않다.
-> OwnerCreateServlet 등을 만들어서
public class OwnerCreateServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest rep, HttpServletResponse resp) throws{
super.doGet(req,resp);
}
@Override
protected void doPost(HttpServletRequest rep, HttpServletResponse resp) throws{
super.doPost(req,resp);
}
}
이런 메소드 들을 overriding해서 doGet,doPost 등을 처리하고 서블릿을 web.xml이라는 파일에 매핑해서 특정한 요청이 들어올 때, 가령 owner/create 요청이 오면 get이면 doget, post면 dopost에서 처리
이런식으로 우리는 하지않고, mapping을 어떻게 하냐면 getmapping이라는 어노테이션을 사용해서 owner/new라는 get 요청이 들어오면 이 때 메소드가 실행. post면 PostMapping이 실행
따라서 이런 추상화 객체를 사용하면 더 편하게 코딩이 가능
스프링은 주로 다양한 기술의 service abstraction을 제공하는데, 가장 먼저 볼 건 스프링 mvc에 관련된 service abstraction을 본다.
@RequestMapping -> postmapping,getmapping
@Controller: 요청을 매핑할 수 있는 컨트롤러 역할을 수행하는 클래스가 된다. 이 클래스 안에다가 @GetMapping, @Postmapping으로 요청을 매핑한다. 요청을 매핑한다는 것은 뒤에 있는 URL에 해당하는 요청이 오면 이 요청을 이 메소드가 처리하게끔 한다.
기본적으로 스프링부트 기반의 애플리케이션을 실행하면 톰캣 기반으로 실행이 된다. 근데 이걸 코드를 거의 그대로 둔 상태로 완전히 다른 기술 스택으로 실행하는 것도 가능. webflux
스프링 웹mvc는 controller, requestmapping 이런 어노테이션, 그리고 그 뒷단의 여러가지 복잡한 인터페이스, 기반 시설을 기반으로 servlet 또는 reactive로 코딩할 수 있다.
밑단의 서버도 톰캣, 제티, 네티, 언더토우 등으로 바꿔가며 사용 가능. 코드를 거의 변경하지 않고!
이렇게 스프링 웹 mvc가 PSA의 한 가지이다.
다음은 스프링 트랜젝션.
스프링 트랜젝션이 뭐냐면 원래 트랜젝션처리 하려면 (트랜젝션이란 데이터베이스에서 어떤 데이터를 주고받는다고 가정했을떄, A를 하고 B하고 C 까지 다 되어야 하나의 작업으로 완료해야하는 경우, A,B,C 중 하나라도 안되면 다 안되어야하는 경우. ALL OR NOTHING이라는 속성 중 하나.
JDBC에서 가장 기본적으로 트렌젝션하는 코드가..
dbConnection setAutoCommit(false);
SQL이 여러번 날아가도 커밋하지 않고 기다리다가 명시적으로 dbConnection.commit()이라고 하면 그때 커밋한다.
하지만 스프링의 트렌젝션의 처리는 @Transactional 이거 하나만 붙이면 된다.
이것도 역시 여러가지 다양한 기술로 바꿔서 쓸 수 있는 portable service abstraction이다,
일단 편리한 인터페이스 제공하기 때문에 service abstraction이고, portable이 붙는 이유는
jdbc를 사용하는 datasource transactionmanager를 쓸 수도 있고, 또는 hibernade나 JPA를 사용하는 경우 JPA TransactionManager를 사용할 수도 있다.
추가로 스프링캐시? 라는 것도 있다.ehcache, javax.cache ...
캐시도 구현체가 여러가지 있는데 @Cacheable 어노테이션만 써주면 구현체는 신경쓰지 않아도 코드가 바뀌지 않는다.
'Programming > Java' 카테고리의 다른 글
[Spring Framework] IOC Container (0) | 2020.12.06 |
---|---|
[Spring Framework] AutoWired (0) | 2020.12.06 |
[Spring Framework] 스프링 소개 (0) | 2020.12.02 |
[petclinic] AOP 소개 (0) | 2020.11.28 |
[petclinic] maven surfire 오류 해결 방법 (0) | 2020.11.22 |
댓글