서블릿 기반의 코드
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();
}
}
확장성이 좋지 못한 코드 or 기술에 특화되어 있는 코드 -> 잘 만든 인터페이스 (PSA) : 확장성이 좋고 코드가 견고해짐
또는 @Transactional 애노테이션을 사용하면 구현체를 신경쓰지 않고 추상화된 인터페이스를 사용하여 다양한
PlatformTransactionManager(JpaTransacionManager | DatasourceTransactionManager | HibernateTransactionManager)를 사용할 수 있다.
@Cacheable 애노테이션 또는 @CacheEvict 애노테이션을 사용하면 역시 구현체를 신경쓰지 않고 추상화된 인터페이스를 사용하여 다양한 CacheManager(
JCacheManager | ConcurrentMapCacheManager | EhCacheCacheManager)를 사용할 수 있다.
참고