인프런/[인프런] 스프링 MVC 1
[서블릿] Hello Servlet
Seung__
2021. 9. 7. 22:51
1. 스프링 부트 서블릿 환경 구성
- @ServletComponentScan
- 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan 을 지원.
- 현재 패키지 하위로 Servlet 찾아서 등록함.
package hello.servlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
public class ServletApplication {
public static void main(String[] args) {
SpringApplication.run(ServletApplication.class, args);
}
}
2. HelloServlet Class
- @WebServlet : Servlet Annotation
- name : servlet name
- urlPatterns : URL 매핑
- localhost:8080/hello 로 접근하면
- ServletContatiner는 service 메서드 실행함.
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 접근하면 HelloServlet 실행
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet.service");
// super.service(req, resp);
}
}
3. HttpServletRequest, HttpServletReponse가 뭐임
- Http요청이 오면 Servlet 컨테이너가 Request, Response객체를 만들어 Servlet에 던져줌.
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 접근하면 HelloServlet 실행
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);
System.out.println("response = " + response);
// super.service(req, resp);
}
}
- 뭐지? 신기하네.. ㅋㅋ 구현체임 ㅇㅇ
request = org.apache.catalina.connector.RequestFacade@18bed47c
response = org.apache.catalina.connector.ResponseFacade@2e7c2f49
4. Request객체 사용
- 아래와 같이 작성하고
- http://localhost:8080/hello?username=Kim로 접속해보자.
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 접근하면 HelloServlet 실행
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);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
}
}
- Request객체에서 username을 꺼내 쓸 수 있다.
- Servlet이 parsing해준다 ㅋㅋㅋㅋ
5. Reponse객체 사용
- Response객체에 데이터를 담으면
- Http message에 해당 데이터가 담겨서 넘어감.
- Header
- setContentType("text/plain")
- setCharacterEncoding("utf-8")
- getWriter().write() -> 여기에 입력한 data가 message body에 담김.
@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 접근하면 HelloServlet 실행
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);
System.out.println("response = " + response);
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello" + username);//여기에 입력하면 message body에 들어감.
}
}
6. HTTP 요청 Message를 log에 남기기
- application.properties에 아래와 같이 추가.
- logging.level.org.apache.coyote.http11=debug
운영서버에 이렇게 요청을 다남기면 성능문제발생함 ㅋㅋㅋㅋ 개발단계에서만 쓰자.
7. ServletContainer 동작 방식
- 스프링 부트 실행
- 스플이 부트가 내장 톰캣 서버 띄움
- 톰캣은 내부에 servlet 컨테이너 기능 있음
- servlet contatiner를 통해 Servlet 생성함
- ServletContainer안에 HelloServlet생성
- 웹 브라우저가 HTTP 요청 메시지를 날리면
- WAS가 Request, Reponse객체를 만들어서 helloServlet을 호출하고
Service 메서드에 Request, Reponse객체를 넘겨줌. - 필요하면 Reponse객체에 데이터를 담아서 return.
- WAS는 Reponse객체를 가지고 HTTP 응답 메시지 작성.
8. 참고
main/webapp/index.html 을 추가하면 웰컴페이지 사용 가능.
9. GitHub : 210907 HelloServlet
GitHub - bsh6463/MVC1
Contribute to bsh6463/MVC1 development by creating an account on GitHub.
github.com