스프링MVC 17

HTTP 메시지 컨버터

HTTP API처럼 JSON 데이터를 HTTP 메시지 바디에 직접 읽거나 쓰는 경우 HTTP 메시지 컨버터를 사용하면 편리하다. 스프링 MVC는 다음의 경우에 HTTP 메시지 컨버터를 적용한다. HTTP 요청 : @RequestBody, HttpEntity(RequestEntity), HTTP 응답 : @ResponseBody, HttpEntity(ResponseEntity) HTTP 메시지 컨버터는 인터페이스로 구현되어 있다 인터페이스의 주요 함수를 살펴보자 public interface HttpMessageConverter { boolean canRead(Class clazz, @Nullable MediaType mediaType); boolean canWrite(Class clazz, @Nullab..

스프링MVC 2023.08.23

HTTP 응답 - 정적 리소스, 뷰 템플릿

스프링서버에서 응답 데이터를 만드는 방법은 크게 3가지가 있다. 정적 리소스 웹 브라우저에 정적인 HTML, css, js를 제공할 때 정적 리소스를 사용한다 뷰 템플릿 웹 브라우저에 동적인 HTML을 제공할 때 뷰 템플릿을 사용한다 HTTP 메시지 사용 HTTP API를 제공하는 경우에는 HTML이 아니라 데이터를 전달해야 하므로 HTTP 메시지 바디에 JSON 같은 형식으로 데이터를 실어 보낸다. 정적 리소스 스프링 부트는 클래스패스의 다음 디렉터리에 있는 정적 리소스를 제공한다. /static, /public, /resources, /META_INF/resources src/main/resources는 리소스를 보관하는 곳이다 예를 들어 src/main/resources/static/hello.ht..

스프링MVC 2023.08.23

HTTP 요청 -기본, 헤더, 데이터 조회

애노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다 HTTP 헤더 정보를 조회하는 방법을 알아보자 @Slf4j @RestController public class RequestHeaderController { @RequestMapping("/headers") public String headers(HttpServletRequest request, HttpServletResponse response, HttpMethod httpMethod, Locale locale, @RequestHeader MultiValueMap headerMap, @RequestHeader("host") String host, @CookieValue(value = "myCookie", required = false) St..

스프링MVC 2023.08.22

스프링 MVC 기본 기능

PathVariable(경로 변수) 사용 최근 HTTP API는 다음과 같이 리소스 경로에 식벽자를 넣는 스타일을 선호한다 /mapping/userA /users/1 이때 @PathVariable을 사용하면 매칭되는 부분을 편리하게 조회할 수 있다. @GetMapping("/mapping/{userId}") public String mappingPath(@PathVariable("userId") String data) { log.info("mappingpath userId={}", data); return "ok" // RestController 사용 이때 PathVarialbe의 변수명과 파라미터의 이름이 같으면 () 부분을 다음과 같이 생략할 수 있다 @GetMapping("/mapping/{user..

스프링MVC 2023.08.21

로깅 간단하게 알아보기

운영 시스템에서 System.out.println()같은 시스템 콘솔을 사용하지 않고 로깅 라이브러리를 사용해서 로그를 출력한다. 로그라이브러리는 많이 있지만 그것을 인터페이스로 제공하는 것이 SLF4J이다 그중 구현체로 Logback을 많이 사용한다. (스프링부트가 기본으로 제공한다) 로그 선언을 자바 코드로 아래 처럼 하면 된다. private Logger log = LoggerFactory.getLogger(getClass()); 하지만 롬복을 사용하면 @Slf4j 애노테이션을 사용하면 위 코드를 작성하지 않아도 된다. 이제 로그를 사용해 보자. String name = "Spring"; log.trace("trace log={}", name); log.debug("debug log={}", nam..

스프링MVC 2023.08.18

스프링 MVC 시작하기

@RequestMapping 핸들러 RequestMappingHandlerMapping 어댑터 RequestMappingHandlerAdapter를 사용한다. 이전 버전을 스프링 MVC로 바꿔보자! @Controller 애노테이션은 내부에 @Component 애노테이션이 있어서 컴포넌트 스캔의 대상이 된다. @RequestMapping 요청 정보를 매핑하는데 해당 URL이 호출되면 메서드가 실행된다 이름은 임의로 지으면 된다. ModelAndView 모델과 뷰 정보를 담아서 반환한다. @Controller @RequestMapping("/springmvc/v2/members") public class SpringMemberControllerV2 { private MemberRepository member..

스프링MVC 2023.08.10

뷰 리졸버

스프링 MVC의 뷰 리졸버에 대해 알아보자 스프링 부트는 InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데 이때 application.properties에 등록한 spring.mvc.view.prefix, spring.mvc.view.sufix설정 정보를 사용해서 등록한다. application.properties의 prefix, sufix를 설정하고 "new-form" string을 넘겨주면 이에 맞는 html이 클라이언트에게 전달된다. ex)spring.mvc.view.prefix=/WEB-INF/views/, spring.mvc.view.suffix=.jsp @Component("/springmvc/old-controller") public class OldCo..

스프링MVC 2023.08.08

핸들러 매핑과 핸들러 어댑터

스프링 MVC 구조에 핸들러 매핑과 핸들러 어댑터에 대해 더 살펴보자 과거에 주로 사용했던 컨트롤러로 핸들러 매핑과 어댑터를 이해해 보자 public interface Controller { ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception; } @Component("/springmvc/old-controller") public class OldController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse res..

스프링MVC 2023.08.08

스프링 MVC 구조 이해

스프링 MVC 구조는 우리가 만든 MVC 프레임워크 구조와 매우 유사하다 스프링 MVC도 Dispatcher Servlet이라는 프론트 컨트롤러 패턴으로 구현되어 있다. HTTP요청이 오면 HttpServlet이 제공하는 service()가 호출된다. 스프링 MVC는 DispatcherServlet의 부모인 FrameworkServlet에세 service()를 오버라이드 해두었다. 그러면 FrameworkServlet.service()를 호출하면 DispacherServlet의 doDispatch()가 호출된다. 스프링 MVC의 동작 순서를 보자 핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러를 조회한다. 핸들러 어댑터 조회: 조회한 핸들러에 맞는 어댑터를 조회한다. 핸들러 어댑터 실행 :..

스프링MVC 2023.08.08

MVC 프레임워크 구현해 보기

간단한 회원가입 시스템을 처리하는 시스템을 MVC패턴으로 구현해 보자 위 그림은 구현해야 할 MVC프레임워크 구조도 이다. 전체적인 과정 HTTP요청이 들어오면 FrontController가 호출된다. 요청이 들어오면 FrontController는 핸들러 매핑 정보에서 Url을 통해 핸들러를 받은 후 핸들러의 타입을 얻기 위해 핸들러 어댑터 목록에서 핸들러 어댑터를 받은 후 핸들러 어댑터를 호출한다. 그리고 핸들러에서 비즈니스 로직을 한 후 modelView를 FrontController에 반환한다 그럼 FrontController는 ViewResolver를 통해 Url을 반환받은 후 MyView를 통해 클라이언트에게 HTML응답을 전송한다. 하나씩 알아 보자! 여기서 핸들러는 컨트롤러라고 보면 된다!...

스프링MVC 2023.08.07