Spring/[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]
[인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술] 서블릿
h2boom
2024. 9. 30. 20:07
서블릿
- 서블릿 : 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술이다.
- 스프링 MVC에서는 Controller로 사용된다.
- @ServletComponentScan : 서블릿을 찾아서 자동으로 등록해주는 역할
- @WebServlet : 서블릿 어노테이션
- 옵션 - 서블릿 이름 지정하는 name, url 매핑을 위한 urlPattern 등이 있다.
=> name, urlPattern 모두 중복되면 안된다.
- 옵션 - 서블릿 이름 지정하는 name, url 매핑을 위한 urlPattern 등이 있다.
- HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 service() 메소드를 실행한다.
- 서블릿을 만들 때는 항상 HttpServlet을 상속받아야 한다.
- protected service() 메소드를 오버라이딩 해야한다.
logging.level.org.apache.coyote.http11=trace
- application.properties 설정으로 추가
- HTTP 요청 메시지를 로그로 확인 가능 (성능 저하가 발생할 수 있기에 개발 단계에서만 사용하는 것이 좋음)
- 서블릿 컨테이너 동작 방식
- 스프링 부트 실행
- 스프링 부트가 내장 톰켓 서버를 생성
- 톰켓 서버의 서블릿 컨테이너로 서블릿 생성
- HTTP 요청 메시지를 기반으로 request, response 객체 생성
- 싱글톤 서블릿 객체를 호출
- service() 호출, request, response 객체를 넘겨준다.
- 서블릿이 종료될 때 response 객체 정보를 기반으로 HTTP 응답 생성
- Content-Length와 같은 속성은 웹 애플리케이션 서버가 자동으로 생성해준다.
- 기본 URL 입력 시 나오는 화면은 welcome 페이지이다.
- main/webapp/index.html 파일을 위치시켜두면 기본 url 입력 시 index.html 페이지가 열린다.
HttpServletRequest
- HttpServletRequest : 서블릿에서 HTTP 요청 메시지를 편리하게 사용할 수 있도록 파싱하고 HttpServletRequest 객체에 담아서 제공한다.
//HTTP 요청 메시지
POST /save HTTP/1.1 //START LINE
Host: localhost:8080 //헤더
Content-Type: application/x-www-form-urlencoded //헤더
username=kim&age=20 //바디
- HTTP 요청 메시지는 START LINE, 헤더, 바디로 구분된다.
- START LINE - HTTP 메소드, URL, 쿼리 스트링, 스키마, 프로토콜
//저장
request.setAttribute(name, value)
//조회
request.getAttribute(name)
//세션 관리
request.getSession(create: true)
- HttpServletRequest는 임시 저장소, 세션 관리 기능 등을 제공한다.
HTTP 요청 데이터
- HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 방법
- GET - 쿼리 파라미터
- ex) /url?username=kim&age=10
- 검색 필터, 페이징 등에서 많이 사용하는 방식
- 메시지 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해서 전달한다.
- POST - HTML Form
- HTML Form의 경우 content-type은 application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 전달한다.
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용 (JSON, XML, TEXT)
- 데이터 형식은 주로 JSON 형식
- GET - 쿼리 파라미터
- GET - 쿼리 파라미터 방식
- 쿼리 파라미터를 보낼 때 URL에 보낼 때 ?로 시작하고 추가 파라미터는 &로 구분한다.
- username=hello&username=kim과 같이 파라미터 명은 하나인데 값이 중복인 경우
- getParameterValues()를 사용하면 배열 형태로 데이터를 가져올 수 있다.
- getParameter()는 단 하나의 값만 있을 때 사용해야 한다. (중복인 경우 첫번째 값을 반환)
- HTTP 요청 데이터 - POST HTML Form
- 꼭 content-type을 application/x-www-form-urlencoded로 지정해줘야 한다.
- GET - 쿼리 파라미터 형식과 동일하므로 쿼리 파라미터 조회 메소드를 그대로 사용
- getParameter()로 메시지 바디의 데이터를 가져올 수 있다.
- POST 방식만 사용 가능
- getParameter()는 쿼리 파라미터 형식의 데이터를 가져올 때 GET 방식과 POST HTML Form 방식에서 모두 사용할 수 있다.
- HTTP 요청 데이터 - API 메시지 바디 JSON
- content-type : application/json
- JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리가 필요하다.
- Spring MVC에서 Jackson 라이브러리(ObjectMapper) 제공
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
- getInputStream()으로 메시지 바디를 바이트 코드로 가져온 후 copyToString()으로 문자열로 변환하는 작업을 통해 메시지 바디를 가져올 수 있다.
HttpServletResponse
- HttpServletResponse 역할
- HTTP 응답 메시지 생성
- HTTP 응답코드 지정
- 헤더 생성
- 바디 생성
- HttpServletResponse가 제공하는 편의 기능
- Content-Type
- Cookie
- Redirect
- HTTP 응답 데이터
- 단순 테스트 응답
- HTML 응답
- content-type: text/html으로 지정
- HTTP API - MessageBody JSON 응답
- content-type: application/json으로 지정
- ObjectMapper.writeValueAsString()으로 객체를 JSON 문자열로 변환
출처 : [인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의 | 김영한 - 인프런
김영한 | 웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습
www.inflearn.com