BootCamp 47day

GyeongNam·2024년 1월 20일
0

BootCamp

목록 보기
41/49
post-thumbnail

📅 2024년 01월 19일


47일차 : Spring (7)

Servlet

Servlet은 Java 언어로 웹 애플리케이션을 개발하기 위한 표준 API

1. HTTP 요청 처리: 
	Servlet은 HTTP 프로토콜을 기반으로 클라이언트의 요청을 처리.
2. HTTP 응답 생성: 
	Servlet은 동적으로 HTML, XML, JSON 등의 문서를 생성하여 클라이언트에게 응답.
3. 세션 관리: 
	Servlet은 클라이언트와 서버 간의 상태를 유지하고 세션을 관리.
4. 쿠키 처리: 
	Servlet은 쿠키를 생성하거나 읽어들여 클라이언트에 저장하거나 클라이언트로부터 받은 쿠키를 처리.
5. 웹 애플리케이션 라이프사이클 관리: 
	Servlet은 초기화, 서비스, 소멸과 같은 라이프사이클 이벤트에 응답.
특성ServletController
용도웹 애플리케이션에서 동적인 콘텐츠 생성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();
    }
}

Swagger

  • 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/ 로 접속


Spring 실습 github 링크

profile
503 Service Unavailable Error

0개의 댓글