📅 2024년 01월 19일
Servlet은 Java 언어로 웹 애플리케이션을 개발하기 위한 표준 API
1. HTTP 요청 처리: Servlet은 HTTP 프로토콜을 기반으로 클라이언트의 요청을 처리. 2. HTTP 응답 생성: Servlet은 동적으로 HTML, XML, JSON 등의 문서를 생성하여 클라이언트에게 응답. 3. 세션 관리: Servlet은 클라이언트와 서버 간의 상태를 유지하고 세션을 관리. 4. 쿠키 처리: Servlet은 쿠키를 생성하거나 읽어들여 클라이언트에 저장하거나 클라이언트로부터 받은 쿠키를 처리. 5. 웹 애플리케이션 라이프사이클 관리: Servlet은 초기화, 서비스, 소멸과 같은 라이프사이클 이벤트에 응답.
특성 Servlet Controller 용도 웹 애플리케이션에서 동적인 콘텐츠 생성 Spring 웹 애플리케이션의 비즈니스 로직 처리 프레임워크 순수 Java EE 또는 Jakarta EE 스펙 기반 Spring MVC 프레임워크 기반 콜백 메서드 init()
,service()
,doGet()
, 등메서드 단위로 주로 @RequestMapping
사용템플릿 엔진 JSP, FreeMarker, Velocity 등을 사용 Thymeleaf, JSP, FreeMarker 등 다양한 선택 가능 의존성 주입 직접 구현해야 함 Spring IoC 컨테이너를 통한 의존성 주입 주요 어노테이션 없음 @Controller
,@RequestMapping
, 등라이프사이클 관리 개발자가 관리 Spring IoC 컨테이너가 관리 보안 및 인터셉터 설정 및 구현이 필요 Spring Security와 함께 사용 가능 테스트 용이성 서블릿 컨테이너가 필요 스프링 테스트 모듈을 이용하여 테스트 가능 클래스 구조 HttpServlet
클래스 상속@Controller
어노테이션을 가진 POJO 클래스복잡성 직접 모든 것을 구현해야 하므로 복잡 Spring MVC가 많은 기능을 추상화하고 제공
- SpringBasicApplication
/* 주로 서블릿 기반의 구성 요소를 스캔하고, 자동으로 등록하려면 아래 어노테이션 저장 webServlet, webFilter, webListener 등의 어노테이션 스캔 */ @ServletComponentScan @SpringBootApplication public class SpringBasicApplication { public static void main(String[] args) { SpringApplication.run(SpringBasicApplication.class, args); } }
- HelloServletRestGet
@WebServlet("/hello-servlet-rest-get") public class HelloServletRestGet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Hello hello = new Hello(); ObjectMapper mapper = new ObjectMapper(); hello.setName("한"); hello.setEmail("한씨가문"); hello.setPassword("맙소사"); resp.setContentType("application/json"); resp.setCharacterEncoding("UTF-8"); PrintWriter out = resp.getWriter(); out.print(mapper.writeValueAsString(hello)); out.flush(); } }
- HelloServletRestPost
@WebServlet("/hello-servlet-rest-post") public class HelloServletRestPost extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ObjectMapper mapper = new ObjectMapper(); Hello hello = null; if(req.getContentType().equals("application/json")){ hello = mapper.readValue(req.getReader(),Hello.class); System.out.println(hello); } // 응답 header resp.setContentType("text/plain"); resp.setCharacterEncoding("UTF-8"); // 응답 body PrintWriter out = resp.getWriter(); out.print("ok"); out.flush(); } }
- build.greale
implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl'
- application.yml
spring: # Controller 의 jsp 사용시에 경로 의 확장자 설정 # 기본 설정이 타임리프이므로, 타임리프 의존성을 제거해야 jsp 사용가능 mvc: view: prefix: /WEB-INF/views/ suffix: .jsp
- HttpServletJspGet
/* controller 가 아닌 WebServlet 를 통해 라우팅 */ @WebServlet("/hello-servlet-jsp-get") public class HttpServletJspGet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* 기본 패턴 : req 를 받아 res 를 반환해주는 형식 */ req.setAttribute("myData", "jsp test data"); // 실행시 단일 프로젝트로 실행해야 패스설정이 다른 것 같음 req.getRequestDispatcher("/WEB-INF/views/hello-jsp.jsp").forward(req, resp); } /* service() 메서드는 서블릿에 들어오는 모든 요청(get, post, put, delete) 을 처리 다만, 구체적으로 doGet, doPost 메서드를 쓰는게 더 좋음 */ // @Override // protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // req.setAttribute("myData", "jsp test data"); // req.getRequestDispatcher("/WEB-INF/views/hello-jsp.jsp").forward(req, resp); // } }
- HttpServletJspPost
@WebServlet("/hello-servlet-jsp-post") public class HttpServletJspPost extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name") ; String email = req.getParameter("email"); String password = req.getParameter("password"); // 콘솔 출력 System.out.println(name + " " + email + " " + password); // 응답 header resp.setContentType("text/plain"); resp.setCharacterEncoding("UTF-8"); // 응답 body PrintWriter out = resp.getWriter(); out.print("ok"); out.flush(); } }
- build.greale
implementation 'io.springfox:springfox-boot-starter:3.0.0'
- SwaggerConfig.java
@Configuration @EnableSwagger2 public class SwaggerConfig { /* Docket : Swagger 구성의 핵심 기능 클래스 */ @Bean public Docket api(){ // http://localhost:8080/swagger-ui/#/ return new Docket(DocumentationType.SWAGGER_2) .select() // 어떤 컨트롤러 또는 어떤 api를 Swagger 문서에 포함시킬지 선택메 .apis(RequestHandlerSelectors.any()) // 모든 RequestHandlerSelectors 들을 문서화 대상으로 선택한다는 설정 // .paths(PathSelectors.any()) 모든 패스의 컨트롤러에 Swagger 적용 .paths(PathSelectors.ant("/rest/**")) .build(); /* Swagger 의 authorize 자물쇠 버튼 활성화를 위해서는 jwt, session 등의 별도의 설정 필요 */ } }
서버 실행 후 http://localhost:8080/swagger-ui/ 로 접속