이 게시글은 인프런의 유료 강의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 수강하며 공부한 내용을 담고있습니다.
저작권에 의해 강의내용에 해당하는 전체 코드는 공개할 수 없습니다.
저작권에 의해 모든 내용을 담을 수 없습니다. 중복 및 반복되는 내용은 생략했습니다.
개요
서블릿 학습을 학습한다.
프로젝트는 스프링 부트를 이용해 만든다.
스프링 부트에 WAS(Tomcat) 이 내장되어 있고 기타 설정도 편리하기 때문이다.
서블릿을 학습하는데는 스프링이 필요 없기 때문에 최대한 스프링을 사용하지 않고 학습한다.
프로젝트 생성
- Project : Gradle
- Language : Java
- Spring Boot : 안정화된 버전(뒤에 괄호가 안붙은 버전)
- Group : hello
- Artifact : servlet
- Packaging : War (JSP 실습을 위해)
- Java 버전 : 17
Dependencies
- Spring Web
- Lombok
위에 작성된 것 외에는 손대지 않아도 된다.
GENERATE 후 압축 해제 후 build.gradle 파일을 project 로 open 한다.
중간 점검
build.gradle 파일에 war 가 있는지 확인한다.
1
2
3
4
5
6
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '3.5.4'
id 'io.spring.dependency-management' version '1.1.7'
}
war 가 없으면 Jar 로 만든 것이므로 다시 만든다.
이후 main 메서드를 실행후 Tomcat 이 8080 포트로 열리는지 확인한다.
없으면 다시 스프링 스타터에서 Spring Web 을 추가해서 다시 만든다.
있으면 localhost:8080 으로 접속해서 Whitelabel Error Page 가 출력되면 정상이다.
Lombok 적용
- Intellij IDE 의 설정으로 들어가서 plugin 검색
- plugin 에서 Lombok 검색 후 설치(이후 IDE 재실행)
- 다시 설정으로 가서 Annotation Processors 검색
- Enable annotation processing 체크 후 IDE 재실행
이제 Lombok 의 annotation 으로 코드를 생성할 수 있다.
Postman 설치
Postman 이 무엇인지는 생략한다. 써보면 바로 알 수 있다.
설치 후 로그인 화면이 반겨준다. 잘 찾아보면 작은 영어 글씨로 로그인 없이 시작할 수 있다.
나는 로그인해서 이용중이기 때문에 비회원에 기능 제한이 걸려있는지는 모르겠다.
서블릿 자동 등록
1
2
3
4
5
6
7
8
9
@ServletComponentScan
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
main 메서드가 있는 클래스에 @ServletComponentScan 를 붙여준다.
현재 패키지 및 하위 패키지에 존재하는 servlet 들을 찾아서 등록해주는 애노테이션이다.
Spring 의 @ComponentScan 이 Component 들을 찾아서 등록해주는것처럼 이건 Servlet 들을 찾아서 등록해준다.
Hello 서블릿 작성
1
2
3
4
5
6
7
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("사용자가 /hello 로 요청을 보냈습니다.");
}
}
이미지 처럼 basic 패키지를 하나 만들어주고 HelloServlet 클래스를 생성한다.
기본적인 서블릿 형태는 위와 같다.
HttpServlet 을 상속받고 @WebServlet 애노테이션을 붙여준다.
name 에 원하는 이름을 넣어준다.
/hello 로 요청을 보내면 HelloServlet 클래스가 받을 수 있도록 urlPatterns = "/hello" 으로 작성했다.
사용자의 요청은 HttpServlet 의 service() 메서드로 보내준다. 따라서 Override 하여 원하는 동작을 구현한다.
프로젝트를 실행 후 localhost:8080/hello 로 요청을 보내면 콘솔에 사용자가 /hello 로 요청을 보냈습니다. 가 찍히는걸 확인할 수 있다.
지난 포스팅에서 사용자의 요청은 서블릿에서 알아서 parsing 해 request 객체에 넣어주고, 서버의 응답을 알아서 response 객체에 담아준다고 했다.
직접 확인해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("사용자가 /hello 로 요청을 보냈습니다.");
System.out.println("request = " + request);
System.out.println("response = " + response);
System.out.println("사용자가 보낸 username 은 " + request.getParameter("username") + " 입니다.");
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("응답을 직접 작성하는 테스트입니다.");
}
}
client 에서 보낸 username=홍길동 이 콘솔에서 잘 출력되는 모습을 확인할 수 있고, 브라우저에서 Response Header 를 확인할 수 있다.
서블릿이 만든 request 와 response 를 통해, 값을 주고 받는 것을 간편하게 코딩할 수 있고 이게 바로 서블릿의 강점이다.
request 메시지 콘솔에 출력하기
사용자가 보내는 request 요청을 일일히 print 하는 코드를 작성할 필요 없다.
application.properties 에 단 한줄 작성해주면 request 요청에 대한 정보가 콘솔에 전부 출력된다.
1
logging.level.org.apache.coyote.http11=trace
당연히 개발환경에서만 사용해야하고 운영환경에서 사용하면 자원낭비로 성능이 저하된다.
웰컴 페이지
실습을 돕는 웰컴 페이지 두 개를 만든다.
main > webapp (디렉터리 생성) > index.html 생성
main > webapp > basic.html 생성
이후 아래 코드를 각각 복사 붙여넣기를 한다.
1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<ul>
<li><a href="basic.html">서블릿 basic</a></li>
</ul>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>basic</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><a href="/basic/hello-form.html">POST - HTML Form</a></li>
<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>


