PSA(Portable Service Abstraction)

de_sj_awa·2021년 6월 25일
0
post-custom-banner

서블릿 기반의 코드

package org.springframework.samples.petclinic.owner;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class OwnerCreateServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.doPost(req, resp);
	}
}

스프링 웹 MVC 기반의 코드(추상화 계층 사용)

@Controller
class OwnerController {

	private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm";

	private final OwnerRepository owners;

	private VisitRepository visits;

	public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
		this.owners = clinicService;
		this.visits = visits;
	}

	@InitBinder
	public void setAllowedFields(WebDataBinder dataBinder) {
		dataBinder.setDisallowedFields("id");
	}

	@GetMapping("/owners/new")
	@LogExecutionTime
	public String initCreationForm(Map<String, Object> model) {
		StopWatch stopWatch = new StopWatch();
		stopWatch.start();

		Owner owner = new Owner();
		model.put("owner", owner);

		stopWatch.stop();
		System.out.println(stopWatch.prettyPrint());

		return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
	}

	@PostMapping("/owners/new")
	@LogExecutionTime
	public String processCreationForm(@Valid Owner owner, BindingResult result) {
		if (result.hasErrors()) {
			return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;
		}
		else {
			this.owners.save(owner);
			return "redirect:/owners/" + owner.getId();
		}
	}
  1. HttpServlet을 직접 사용하지 않아도 되고 mapping도 훨씬 간단하여 편의성이 증가한다.
  2. Portable : 스프링 MVC -> 스프링 웹 플럭스, 톰캣 -> 제티, 네티, 언더토우로 거의 기존 코드를 바꾸지 않고도 새로운 기술 스택으로 교체할 수 있다. 즉, 확장성이 증가한다.

확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드 -> 잘 만든 인터페이스 (PSA) : 확장성이 좋고 코드가 견고해짐

또는 @Transactional 애노테이션을 사용하면 구현체를 신경쓰지 않고 추상화된 인터페이스를 사용하여 다양한
PlatformTransactionManager(JpaTransacionManager | DatasourceTransactionManager | HibernateTransactionManager)를 사용할 수 있다.

@Cacheable 애노테이션 또는 @CacheEvict 애노테이션을 사용하면 역시 구현체를 신경쓰지 않고 추상화된 인터페이스를 사용하여 다양한 CacheManager(
JCacheManager | ConcurrentMapCacheManager | EhCacheCacheManager)를 사용할 수 있다.

https://velog.io/@jsj3282/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%82%BC%EA%B0%81%ED%98%95%EA%B3%BC-%EC%84%A4%EC%A0%95-%EC%A0%95%EB%B3%B43-PSA

참고

profile
이것저것 관심많은 개발자.
post-custom-banner

0개의 댓글