Web/Spring
@ResponseBody @ResponseBody는 핸들러 메서드에 붙일 수 있는 애노테이션으로 HttpMessageConverter를 사용해 응답 본문(body) 메시지로 보낼 때 사용할 수 있다. 그러나 @RestController를 사용하면 그 Class안의 모든 메서드에 @ResponseBody가 자동으로 붙게된다. @Controller @RequestMapping("/api/events") public class EventApi { @PostMapping @ResponseBody public Event createEvent(@RequestBody @Valid Event event, BindingResult bindingResult) { // save event to DB if (bindingRe..
@RequestBody와 HttpEntity @RequestBody @RequestBody는 요청 본문(body)에 json 또는 그 외의 형태로 데이터가 넘어올 때 그 데이터를 HttpMessageConverter를 통해 지정된 객체로 받아온다. @RestController @RequestMapping("/api/events") public class EventApi { @PostMapping public Event createEvent(@RequestBody @Valid Event event, BindingResult bindingResult) { // save event to DB // @Validated 또는 @Valid로 값을 검증할 수 있으며 // BindingResult를 사용해서 에러를 검..
ResponseEntity ResponseEntity는 View를 제공하지 않는 형태로 요청을 처리하고, 직접 결과 데이터 및 Http 상태 코드를 설정하여 응답을 할 수 있다. 이번 글에서는 이를 활용해서 파일 다운로드를 구현해보겠다. ResourceLoader 사용 우선 다운로드 할 수 있게끔하려는 파일을 코드상에서 읽어와야한다. (이때 파일은 프로젝트의 resources 폴더에 넣어 주었다.) 여기서는 ResourceLoader를 사용하여 리소스를 읽어와서 다운로드가 가능하게끔 만들겠다. Resource resource = resourceLoader.getResource("classpath:" + filename); resource를 File로 저장하기 뒤에서 나올 내용이지만 해당 파일의 길이를 헤..
MultipartFile 파일 업로드를 할때 사용하는 핸들러 메소드 argument Spring MVC의 경우에는 MultipartResolver 빈이 설정되어있어야한다. // example MultipartResolver bean @Bean(name = "multipartResolver") public CommonsMultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(100000); return multipartResolver; } Spring Boot에서는 자동으로 설정이 된다. => ..
FlashAttribute RedirectAttributes와 비슷하지만 FlashAttribute는 요청을 보낼 때 session에 넣고 넘겨준다. 그리고 바로 다음 요청이 처리되면 session에서 지워진다. 따라서 일회성이다. 사용법 @PostMapping("/events/form/limit") public String eventsFormLimitSubmit(@Validated @ModelAttribute Event event, BindingResult bindingResult, SessionStatus sessionStatus, RedirectAttributes attributes) { if(bindingResult.hasErrors()) { return "/events/form-limit"; }..
RedirectAttributes Spring Boot에서는 기본적으로 Model에 들어있는 Primitive type( 기본 자료형 ex_int,long... )의 데이터가 URI 쿼리 매개변수로 추가가 되지 않게끔 설정이 되어있다. Spring Boot의 설정을 바꾸어 URI 쿼리 매개변수에 추가시키기 application.properties에 설정 추가하기 spring.mvc.ignore-default-model-on-redirect=false // 기본적으로 true값으로 추가되지 않게끔 설정되었음. Model에 데이터 담기 @PostMapping("/events/form/limit") public String eventsFormLimitSubmit(@Validated @ModelAttribute..
@SessionAttribute @SessionAttributes와는 's'가 붙고 안붙고인데 하는 일이 다르다. 이 점을 유의 해야한다. @SessionAttributes는 애노테이션이 붙어있는 해당 컨트롤러 내에서만 동작을 한다. 따라서 같은 컨트롤러 안에서 다루는 특정 모델 객체를 세션에 넣고 공유할 때 사용하는 것이다. @SessionAttribute는 컨트롤러 밖(인터셉터, 필터 등)에서 만들어진 세션을 가져올 수 있다. 하지만 session에 데이터를 넣고 빼고 싶은 경우에는 HttpSession을 사용해야 한다. 사용자가 접속한 시간 세션 저장 구현 VisitTimeInterceptor라는 이름의 인터셉터를 만든다. public class VisitTimeInterceptor ..
@SessionAttributes를 사용하여 멀티 폼 서브밋 구현 예제로 Event에 이름을 넣는 페이지, 인원제한을 넣는 페이지를 나누어 폼으로 입력을 받는 것을 구현해 볼 것이다. Controller @Controller @SessionAttributes("event") // 세션을 자동으로 바인딩해주기 위한 애노테이션 public class SampleController { // name을 받는 form을 띄워주는 GET @GetMapping("/events/form/name") public String eventsFormName(Model model) { model.addAttribute("event",new Event()); return "/events/form-name"; } // name을 ..
@SessionAttributes 장바구니 또는 입력을 여러 페이지를 통하여 받는 경우에는 특정 개체들에대한 정보를 계속 유지해야한다. 이 정보를 유지해주는 것이 Session이다. 그럼 Session을 사용하는 방법들에 대하여 알아보자. HttpSessions @GetMapping("/events/form") public String eventsForm(Model model, HttpSession httpSession) { Event newEvent = new Event(); newEvent.setLimit(50); model.addAttribute("event",newEvent); // newEvent를 "event"라는 이름으로 session에 담는다. httpSession.setAttribute(..