김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의를 보고 작성한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
@ServletComponentScan
main 메서드가 있는 클래스에 작성
스프링이 자동으로 서블릿을 찾아서 등록하여 실행할 수 있도록 도와준다 ( 서블릿 자동 등록 )
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청 메세지 조회 ( 쿼리 파라미터 조회 )
String username = request.getParameter("username");
System.out.println("username = " + username);
// 응답 메세지 작성
// HTTP 헤더에 담기는 정보
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
// write()의 내용이 HTTP body에 들어감
response.getWriter().write("hello " + username);
}
}
HttpServlet
을 상속
@WebServlet
: 서블릿 어노테이션
name : 서블릿 이름
urlPatterns : urlPatterns에 지정된 url로 접속하면 해당 서블릿이 실행 ( URL 매핑 )
매핑된 URL이 호출되면 서블릿 컨테이너는 service()
메소드를 실행
HTTP 요청이 들어오면 WAS가 Request, Response 객체를 만들어서 서블릿에 넘겨준다
service() 메서드가 인수로 객체들을 받는다
HttpServletRequest
, HttpServletResponse
HTTP 요청 메세지 로그로 확인
application.properties에 아래 코드를 작성
logging.level.org.apache.coyote.http11=debug
스프링부트가 실행되면서 내장 톰켓 서버를 띄운다
톰켓 서버는 내부에 서블릿 컨테이너 기능을 가지고 있기 때문에 서블릿 컨테이너를 통해 서블릿을 생성
HTTP 요청 메세지를 기반으로 request, response 객체를 생성해서 서블릿의 service() 메소드를 호출하면서 request, response 객체를 넘겨줌
response 객체에 필요한 정보 작성
WAS가 response 객체 정보로 HTTP 응답 메세지를 생성해서 반환
START LINE ( Request-Line )
헤더
Message Body
form 파라미터 형식의 데이터가 담겨져 있음
데이터가 직접 담겨져 있음
HttpServletRequest
서블릿은 HTTP 요청 메세지를 파싱하고 그 결과를 HttpServletRequest 객체에 담아서 제공
즉, 개발자가 HTTP 요청 메세지를 편리하게 사용(조회)할 수 있도록 도와주는 객체
메세지에 담긴 내용(헤더, body, 파라미터, JSON 등)을 조회할 수 있음
기능 1 : 임시 저장소 기능
HTTP 요청이 시작부터 끝날 때까지 유지되는 임시 저장소 기능
HTTP 요청 메세지에는 작은 데이터 저장소가 존재
HTTP 요청 메세지가 유지되는 동안 사용할 수 있도록 데이터를 저장 및 조회
값 저장 : request.setAttribute(name, value)
값 조회 : request.getAttribute(name)
기능 2 : 세션 관리 기능
사용자 정보를 일정 조건 동안 유지하기 위해 사용
request.getSession(create: true)
getMethod()
: HTTP Method 조회
getProtocol()
getScheme()
getRequestURL()
: 전체 URL 조회
getRequestURI()
: urlPatterns 에 적힌 주소 조회
getQueryString()
: 쿼리 파라미터 조회, 없는 경우 null이 출력
isSecure()
: http 이면 false, https 이면 true
request.getHeaderNames().asIterator()
.forEachRemaining(headerName -> System.out.println(headerName + ": " + request.getHeader(headerName)));
getServerName()
getServerPort()
getContentType()
getContentLength()
getCharacterEncoding()
getLocales()
: 모든 Locale 정보를 가져옴 ( Accept-Language 정보 )
getLocale()
: 우선 순위가 가장 높은 언어만 조회
getCookies()
: 쿠키 정보 조회
Cookie객체.getName()
Cookie객체.getValue()
getContentType()
: message body에 내용이 없으면 null이 출력
getContentLength()
: message body에 내용이 없으면 -1이 출력
getCharacterEncoding()
Remote 정보 : 요청이 온 것에 대한 정보
getRemoteHost()
getRemoteAddr()
getRemotePort()
Local 정보 : 현재 나의 서버에 대한 정보
getLocalName()
getLocalAddr()
getLocalPort()
GET - 쿼리 파라미터
message body 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
쿼리 파라미터는 ?
로 시작하고 &
로 구분
POST - HTML Form
message body에 쿼리 파리미터 형식으로 전달
content-type : application/x-www-form-urlencoded
HTTP Message Body에 데이터를 직접 담아서 요청
데이터 형식은 주로 JSON 사용
application/json
텍스트 형식인 경우
text/plain
POST, PUT, PATCH 방식 전부 사용 가능
https://velog.io/@hj_/HTTP-5.-HTTP-method-%ED%99%9C%EC%9A%A9
getParameterNames()
: 요청 파라미터를 모두 꺼낸다
getParameter("name")
파라미터 이름으로 단일 파라미터 조회
쿼리 파라미터 형식과 HTML Form 형식 둘 다 사용 가능
하나의 파라미터 이름에 하나의 값만 있는 경우에만 사용
중복일 때 사용하면 가장 첫 번째 값을 반환
getParameterValues("name")
이름이 같고 값이 다른 복수 파라미터 조회
반환형은 String 배열
HTML form 태그의 action 에 지정된 url로 데이터가 전달
쿼리 파라미터와 형식이 같기 때문에 5-2의 메서드로 조회 가능
message body의 데이터는 InputStream
을 사용해서 직접 읽을 수 있음
getInputStream()
message body의 내용을 바이트 코드로 반환
반환형은 ServletInputStream
StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8)
위의 메서드로 얻은 stream( inputStream )을 String 으로 변환
바이트를 문자로 변환하기 때문에 인코딩 정보를 알려줘야함
private ObjectMapper objectMapper = new ObjectMapper();
@Override
protected void service(HttpServletRequest request, HttpServletResponse resposne) throws ServletException, IOException {
...
objectMapper.readValue(messageBody, 클래스파일.class)
}
messageBody는 5-4의 메서드를 사용하고 얻은 String
클래스 파일은 JSON 형식으로 파싱할 수 있도록 생성한 객체
JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하기 위해 JSON 변환 라이브러리를 사용해야함
스프링부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리 (ObjectMapper
)를 제공
HTTP 응답 메세지 작성
편의 기능 제공
setStatus()
응답 코드 지정
200처럼 숫자로 작성 가능
HttpServletResponse에 SC_
로 시작하면서 상태 코드에 대응되는 상수가 있는데 이것으로 작성하는 것이 더 좋음
ex> HttpServletResponse.SC_OK
setHeader("해더이름", "헤더내용")
이름으로 헤더를 지정하고 헤더 내용을 작성
본인이 원하는 헤더를 만들 수 있음
헤더이름을 지정하지 않고 setContentType()
, setCharacterEncoding()
로 특정 헤더의 내용 작성 가능
addCookie(쿠키 객체)
쿠키 객체를 만들고 응답에 추가할 때 사용
Response Header의 Set-Cookie에 해당하는 정보임
setHeader("Set-Cookie", "내용" )
로 추가할 수도 있음
sendRedirect("주소")
리다이렉트 주소 지정
setStatus()
로 상태 코드 300번대를 부여하고
setHeader()
로 Location에 주소를 부여하는 방식으로도 가능
https://velog.io/@hj_/HTTP-6.-HTTP-%EC%83%81%ED%83%9C%EC%BD%94%EB%93%9C#3-1-redirection
message body 작성을 위한 객체 생성
PrintWriter writer = response.getWriter();
단순 텍스트 응답
writer.println("text");
를 이용해서 작성
텍스트가 message body에 담기게 된다
HTML 응답
응답으로 HTML을 반환하는 경우 Content-Type을 text/html
로 지정하고 인코딩 방식도 지정해야함 ( utf-8
)
writer.println("html태그");
를 이용해서 작성
HTTP API - MessageBody JSON 응답
응답으로 JSON을 반환하는 경우 Content-Type을 application/json
으로 지정해야함
JSON의 경우 utf-8 형식을 사용하도록 정의되어 있기 때문에 인코딩 방식을 따로 지정하지 않아도 된다
objectMapper.writeValueAsString(data);
: data 객체를 JSON 형식으로 변경
response.getWriter().write(result)
: result는 변환된 JSON 데이터
Cookie cookie = new Cookie("이름" "값");
cookie.setMaxAge(600);
...