김영한 강사님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 듣고 정리한 내용입니다. 자세한 내용은 강의를 참고해주세요
1편에서 말했듯이, 서블릿 컨테이너를 사용하면 http 요청 메시지를 편리하게 처리할 수 있고, 싱글톤 객체를 만들어 주며 멀티 쓰레드를 지원해준다. 하지만 서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설처하고 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린다음 톰캣 서버를 실행해야한다.
이번 실습에서는 스프링 부트가 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 스프링 부트를 가지고 편리하게 서블릿 코드를 이용한다.
우리가 컴포넌트 스캔을 이용해 스프링 빈을 등록하는 것처럼, @ServletComponentScan을 이용해 서블릿을 자동 등록 하고 사용한다.
@ServletComponentScan : 자동으로 현재 패키지 포함 및 하위 패키지의 Servlet을 다 찾아서 자동으로 Servlet을 Servlet 컨테이너에 등록해서 실행할 수 있도록 도와준다@WebServlet(name, urlPatterns) : 서블릿 애노테이션, name : 서블릿 이름, urlPatterns : URL 매핑protected void service(HttpServletRequest request, Http ServletResponse response)
@ServletComponentScan을 통해서 @Servlet들을 모두 Servlet Container에 생성한다Request, Response 객체를 생성한다Service 메서드를 호출하면서 인자값에 Request와 Response를 넘겨준다Content-Length는 웹 애플리케이션 서버(WAS)가 자동으로 생성해준다!!!
@WebServlet(name,urlPatterns)를 넣어주고HttpServlet을 상속받아준다service 메서드를 오버라이드 해준다 -> 이때 protected로 해준다.httpServletRequest : Http 요청 메시지를 개발자가 직접 파싱해도 되지만, 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그 결과를 HttpServletRequest 객체에 담아서 제공한다SetAttribute(name,value)GetAttribute(name)request.getSession(create:true)
request.getMethod() : 요청 메시지의 http메서드 반환reqest.getProtocol() : 요청 메시지의 프로토콜 반환 ->http/1.1reqest.getScheme() : 요청 메시지의 스키마 반환 -> httpreqest.getRequestURL() : 요청 메시지의 urlreqest.getRequestURI() : 요청 메시지의 urireqest.isSecure() : https 사용했니?이제 HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법을 보자
HttpServletRequest 제공 메서드를 통해 쿼리 파라미터 조회가능request.getParameter("파라미터 이름"): 단일 파라미터 조회request.getParameters() : 모든 요청 파라미터를 다 꺼낼 수 있다request.getParameterValues : 하나의 파라미터에 여러개의 값이 들어오면 이 메서드를 이용해 꺼낸다request.getParameterNames().asIterator()
.forEachRemaining(paramName -> System.out.println(paramName +"="
+ request.getParameter(paramName)));
asIterator()로 이터레이터 개념을 사용하고forEachRemaining(Consumer을 이용)으로 각자의 이름을 출력 + 이름을 통해 getParameter로 파라미터까지 꺼내는 모습이다content-type header을 요청 메시지에 포함**해야 한다getParameter() 같은 메서드로 꺼낼 수 있다,HTTP Message body에 데이터를 직접 담아서 요청request.getInputStream()하면, http body의 내용을 바이트 코드로 바로 얻을 수 있다.StreamUtils.copyToString(inputStream, StandardCharsets.UTF\_8): 스프링의 util 기능 바이트 코드의 스트링 ->문자열로 바꿔준다 .이 때 파라미터는 (@Nullable inpustream, Charset)jackson이라고 스프링에서 기본으로 사용할 수 있는 JSON 라이브러리ObjectMapper 로 json 데이터를 받을 수 있다obejctMapper.readValue(json형식의 문자열,변환할 객체 타입(.class))) 를 통해서 객체로 변환할 수 있다.application/jsonresponse.setStatus : 응답 상태 설정response.setHeader("Content-type","text/plain") :헤더를 마음 대로 넣을 수 있다 response.setContentType("text/plain) : 응답 컨텐트 타입 설정response.setCharacterEncoding("utf-8) : 응답 문자인코딩 설정setMaxage, addCookie : 쿠키 관련response.sendRedirect(주소): redirect 정보 전달response.getWriter().write()