스프링 부트 환경에서 서블릿 등록하고 사용해보자.
- 서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치해서 서블릿 코드를 클래스 파일로 빌드해서 올리고 톰캣 서버를 실행하면되지만 매우 번거롭다.
- 스프링 부트는 톰캣 서버를 내장하고 있어서 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행 할 수 있다.
코드를 작성해보자. ServletApplication에서는
@ServletComponentScan // 서블릿 자동 등록
을 넣어주고
package hello.setvlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class SetvletApplication {
public static void main(String[] args) {
SpringApplication.run(SetvletApplication.class, args);
}
}
basic 패키지를 만들어준 다음 HelloServlet를 넣어준다.
package hello.setvlet.basic;
import javax.servlet.annotation.WebServlet;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet {
}
ctrl o를 누른 다음 Select Methods to Override/implement에서
자물쇠 잠겨있는 거를 선택하자.
HelloServlet를 다 작성한 다음 돌려주고 localhost 8080에서 /hello를 넣어서 확인하면 오류가 없는 빈화면이 나온다.
package hello.setvlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet.service");
}
}
실행창에서 로그를 확인하면 HelloServlet.service를 확인 할 수 있다.
request와 response를 작성을하고 http://localhost:8080/hello에 들어가서 출력로그를 확인해주면
아래와 같이 뜨게 된다.
package hello.setvlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
// was가 request response 만들어서 servletdㅔ 던져준다.
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
}
}
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@56c59598
response = org.apache.catalina.connector.ResponseFacade@6acbd9a2
여기서 HttpServletRequest HttpServletResponse 둘 다 interface이다.
protected void service(HttpServletRequest request, HttpServletResponse response)
HttpServletRequest
public interface HttpServletRequest extends ServletRequest {
HttpServletResponse
public interface HttpServletResponse extends ServletResponse {
쿼리 파라미터를 넣어보자(http://localhost:8080/hello?username=kim )
작성해서 다시 돌려주면
package hello.setvlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
// was가 request response 만들어서 servletdㅔ 던져준다.
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
}
}
username이 잘 출력이 된다.
HelloServlet.service
request = org.apache.catalina.connector.RequestFacade@60f419db
response = org.apache.catalina.connector.ResponseFacade@2613a838
username = kim
응답 메세지를 한 번 보내보자.
package hello.setvlet.basic;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
// was가 request response 만들어서 servletdㅔ 던져준다.
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet.service");
System.out.println("request = " + request);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
// content type header 정보에 들어간다.
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
// write라고하면 http mssage body에 들어간다,
response.getWriter().write("hello " + username);
}
}
실행을 시키고 개발자 도구를 확인해보자.
Response Headers를 확인해주자.(Request Headers는 Browser이 보내는 작업이다.)
`@WebServlet` 서블릿 애노테이션
아래 두개는 중복이 있으면 안된다.
- name: 서블릿 이름
- urlPatterns: URL 매핑
application.properties에서 아래 코드를 작성하고 재시작해서 요청을 해보면
logging.level.org.apache.coyote.http11=debug
로그에 utf-8로 인코딩된 정보가 나오게 되고
2022-04-21 18:03:15.857 DEBUG 28348 --- [nio-8080-exec-2] o.a.coyote.http11.Http11InputBuffer : Received [GET /hello?username=%EA%B9%80 HTTP/1.1
헤더 정보들이 나오게 된다.
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "macOS"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.88 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: en,ko;q=0.9,ko-KR;q=0.8,en-US;q=0.7
- 운영서버에 모든 요청 정보를 다 남기면 성능저하가 발생하게 된다. 개발 단계에서만 적용하자.
- HTTP 응답에서 Content-Length는 웹 애플리케이션 서버가 자동으로 생성을 해준다.
welcome 페이지도 만들어주자.
index.html과 basic.html을 차례대로 만들어주자.
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
<li><a href="basic.html">서블릿 basic</a></li> </ul>
</body>
</html>
<!-- basic.html -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body> <ul>
<li>hello 서블릿 <ul>
<li><a href="/hello?username=servlet">hello 서블릿 호출</a></li>
</ul> </li>
<li>HttpServletRequest
<ul>
<li><a href="/request-header">기본 사용법, Header 조회</a></li> <li>HTTP 요청 메시지 바디 조회
<ul>
<li><a href="/request-param?username=hello&age=20">GET -
쿼리 파라미터</a></li> li>
<li><a href="/basic/hello-form.html">POST - HTML Form</a></
<li>HTTP API - MessageBody -> Postman 테스트</li> </ul>
</li> </ul>
</li>
<li>HttpServletResponse
<ul>
<li><a href="/response-header">기본 사용법, Header 조회</a></li> <li>HTTP 응답 메시지 바디 조회
<ul>
<li><a href="/response-html">HTML 응답</a></li>
<li><a href="/response-json">HTTP API JSON 응답</a></li>
</ul> </li>
</ul> </li>
</ul>
</body>
</html>
localhost:8080으로 그냥 들어가서 확인해주고 앞으로 공부할 여러 항목들이 나오게 된다.
<출처 김영한: 스프링 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
'Spring > SpringMVC' 카테고리의 다른 글
HTTP 요청 데이터 - 개요 (0) | 2022.04.21 |
---|---|
HttpServletRequest - 기본 사용법 (0) | 2022.04.21 |
HttpServletRequest - 개요 (0) | 2022.04.21 |
서블릿 - 프로젝트 생성 (0) | 2022.04.21 |
자바 백엔드 웹 기술 역사 (0) | 2022.04.21 |