서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고, 그 위에 서브릿 코드를 클래스 파일로 빌드해서 올리 다음, 톰캣서버를 실행하면 된다. 스프링 부트는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치 없이 편리하게 서블릿 코드를 실행 할 수 있다.
가장 먼저 간단한 매핑을 통한 servlet매핑을 해보자
기본설정으로 만든 hello.servlet이라는 패키지 안에 basic이라는 패키지를 만들고 안에 HelloServlet이라는 class의 자바 파일을 만들고 아래와 같은 코드를 작성 했다.
@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");
}
}
위의 코드를 보게 되면 annotation을 통해 해당 클래스는 webServlet으로 만든 다음 이름과 매핑 주소를 만들었다.
그리고 servlet으로 만들기 위해서 extends HttpServlet을 상속받고 service를 오버라이딩 해줬다. 그리고 실행을 하게 되면 오류가 발생하는 이유는 현재 우리가 사용하는 IntelliJ 는 무료버전이라 처음에 설정한 gradle.start 및 test를 gradle로 해야했다. 다시 설정을 원래대로 바꾸고 실행하면 문제가 없을 것이다. 정상 실행을 했다면 웹브라우저를 열어서 localhost:8080/hello라고 검색해보자 아무것도 없는 하얀색 배경이 보일것이다. 그리고 다시 인텔리제이로 돌아와보면 콘솔창에 System.out.printlne("helloServlet.service")가 실행이 되어 안에 문구가 보인다.
해당 service안에 request와 response가 있는데 이게 뭔지 한번 찍어보자
console에 찍어보게 되면 다음과 같이 나온다.
request = org.apache.catalina.connector.RequestFacade@6f407ef
response = org.apache.catalina.connector.ResponseFacade@65e55520
별로 중요한 내용은 아니지만 우리가 request과 response를 찍기 위해 HttpServletRequest, HttpServletResponse를 사용 했는데 이는 interface이고 이를 구현하기 위한 구현체의 값이라고 보면 된다.
쿼리파라미터를 주소창에 같이 입력해보자
localhost:8080/hello?username=kim 이렇게 실행을 해보자. 당연히 콘솔에는 이전과 같은 값이 출력이 되겟지만 코드를 수정해보면 달라진다
@WebServlet(name="helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("helloServlet.service");
System.out.println("request = " + request + ", response = " + response);
String username = request.getParameter("username");
System.out.println("username = "+username);
}
}
이처럼 request(요청)에서 파라미터를 get하게 되면 해당 파라미터의 값을 변수에 담을 수 있고 이를 출력까지도 가능하다.
이번에는 Response(응답)을 사욯해보자 우리가 응답을 하기 위해서는 몇가지 맞춤이 필요하다.
가장먼저 해야할 것을 우리가 보낼 응답의 타입, 그리고 인코딩 형식이다. 쉽게 말하면 내가 어떤 응답을 보낼지, 이 응답을 어떻게 해석하면 되는지 브라우저(클라이언트)에게 알려주는 것이다.
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello "+username);
위의 코드가 반환하는 코드인데 위에 두줄은 header에 들어갈, 즉 응답의 세부사항이고 3번째 줄이 내용이 된다.
결과는 이처럼 나오게 된다.
@WebServlet 애노테이션을 통해 서블릿으로 만든 뒤
name(서블릿이름), urlPatterns(URL매핑)을 지정해 준다. 이때 이름과 매핑주소는 유일한 값이여야한다.( 중복 x )
HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 우리가 오버라이딩해서 만든 메서드를 실행하게 된다.
우리가 방금까지 내용들을 그림으로 표현한 모습이다.
우리는 단순하게 url에 매핑한 주소값을 넣고 글을 받기만 햇지만 그 안에서 이런 내용들을 주고 받은 것이다.
앞으로 반복적인 view에 코드를 줄이기 위해 반복 코드를 복사 붙여넣기를 하도록 하자
먼저 src/main아래에 webapp이라는 폴더를 만들고 그 안에 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><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>
방금까지 우리는 localhost에 매핑한 주소값을 넣어서 요청과 응답을 햇지만 단순히 localhost:8080만을 입력햇을때는 방금 작성 index.html이 열리게 된다.
'spring' 카테고리의 다른 글
HTTP 요청 데이터 (0) | 2023.03.05 |
---|---|
HttpServletRequest (0) | 2023.03.05 |
프로젝트 생성 (0) | 2023.03.05 |
스프링 부트의 이해 (0) | 2023.03.05 |
Opinionated (0) | 2023.03.05 |