스프링mvc - 서블릿

meluu_·2023년 9월 13일
0

스프링

목록 보기
10/27
post-thumbnail

🌿 웹 서버와 WAS


✔️ 서블릿

자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램

@ServletComponentScan
: 서블릿을 직접 등록해서 사용가능하도록 지원한다.

@ServletComponentScan //서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
	public static void main(String[] args) {
		SpringApplication.run(ServletApplication.class, args);
	}
}

서블릿 등록

@WebServlet(name = "helloServlet", urlPatterns = "/hello") // /hello로 올시 실행된다.
public class HelloServlet extends HttpServlet {
    
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/*@WebServlet 서블릿 애노테이션
		name: 서블릿 이름
		urlPatterns: URL 매핑*/
        String username = request.getParameter("username");

        response.setContentType("text/plain");
        response.setCharacterEncoding("utf-8");
        response.getWriter().write("hello " + username);

    }
}
  • @WebServlet 서블릿 애노테이션
    • name: 서블릿 이름
    • urlPatterns: URL 매핑

HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 다음 메서드를 실행
protected void service(...)

✔️ 서블릿 컨테이너 동작 방식

  1. 서블릿 컨테이너에 내장 톰캣 서버가 등록한 서블릿ex) helloServlet을 생성

  2. Http 요청이 오면 WAS(톰캣)는 Http 요청 메시지를 기반으로 request,response를 생성하고 helloServlet을 실행(service 메소드)

  3. 여기서 request의 내용을 확인하거나 response를 작성가능

  4. 톰캣 서버가 response 객체 정보로 http 응답을 생성하여 보낸다.


application.properties
logging.level.org.apache.coyote.http11=debug
// debug 레벨의 로그 확인

🌱 HttpServletRequest - 개요


HttpServletRequest 역할

Http 요청 메시지를 편리하게 사용 가능하게끔 Http 요청 메시지를 파싱 후, HttpServletRequest 객체에 담아서 제공

임시 저장소 기능

해당 Http 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능

  • 저장 : request.setAttribute(name, value)
  • 조회 : request.getAttribute(name)

세션 관리 기능
request.getSession(create: ture)

Start-line 정보

request.getMethod() = 메소드
request.getProtocol() = HTTP/1.1, 2.0 3.0
request.getScheme() = http
request.getRequestURL() = url 정보
request.getRequestURI() = uri 정보
request.getQueryString() = 쿼리 파라미터
request.isSecure() = 시큐리티 true/false

헤더 정보

// 전체 조회
request.getHeaderNames().asIterator()
 .forEachRemaining(headerName ->
 System.out.println(headerName + ": " + request.getHeader(headerName)));

편리한 조회

// Accept-Language 조회
request.getLocales().asIterator()
 .forEachRemaining(locale -> System.out.println("locale = " +
locale));
// 선호도 젤 높은 것 
 request.getLocale(); 

// Host 조회
request.getServerName();
request.getServerOirt();

//Cookie 조회
if (request.getCookies() != null) {
 for (Cookie cookie : request.getCookies()) {
 		System.out.println(cookie.getName() + ": " + cookie.getValue());
 	}
 }

// Content 조회
request.getContentType();
request.getContentLength();
request.getCharacterEncoding();

기타 정보

[Remote 정보]
request.getRemoteHost() 
request.getRemoteAddr() 
request.getRemotePort()

[Local 정보]
request.getLocalName()
request.getLocalAddr()
request.getLocalPort() 

HTTP 요청 데이터

GET 쿼리 파라미터

http://localhost:8080/request-param?username=hello&age=20

쿼리 파라미터 ?로 시작
& 추가 파라미터 구분

String username = request.getParameter("username"); //단일 파라미터 조회
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들
모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map
으로 조회
String[] usernames = request.getParameterValues("username"); //복수 파라미터 조회

API 메시지 바디 - 단순 텍스트


ServletInputStream inputStream = request.getInputStream();
 String messageBody = StreamUtils.copyToString(inputStream,
StandardCharsets.UTF_8);

JSON

// Json 결과를 파싱 및 자바 객체로 변환하는 스프링 MVC 라이브러리 (ObjectMapper) 제공
private ObjectMapper objectMapper = new ObjectMapper();

@Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
	ServletInputStream inputStream = request.getInputStream();
	String messageBody = StreamUtils.copyToString(inputStream,StandardCharsets.UTF_8);
	HelloData helloData = objectMapper.readValue(messageBody,HelloData.class);
}

HttpServletResponse

  • HTTP 응답 메시지 생성
    • HTTP 응답코드 지정
    • 헤더 생성
    • 바디 생성

편의 기능 제공

  • Content-Type, 쿠키, Redirect
response.setStatus(HttpServletResponse.SC_OK); //200

//[response-headers]
response.setHeader("Content-Type", "text/plain;charset=utf-8");
 response.setHeader("Cache-Control", "no-cache, no-store, mustrevalidate");
 response.setHeader("Pragma", "no-cache");
 response.setHeader("my-header","hello");
 
 
 // Header 편의 메서드
 
   // Content 편의 메서드
 private void content(HttpServletResponse response) {
 response.setContentType("text/plain");
 response.setCharacterEncoding("utf-8");
}

  // 쿠키 편의 메서드
  private void cookie(HttpServletResponse response) {
 Cookie cookie = new Cookie("myCookie", "good");
 cookie.setMaxAge(600); //600초
 response.addCookie(cookie);
}

  // redirect 편의 메서드
  private void redirect(HttpServletResponse response) throws IOException {
 //Status Code 302  자동 적용
 //Location: /basic/hello-form.html 자동 적용
 response.sendRedirect("/basic/hello-form.html");
}
  
 

HTTP 응답 데이터 - 단순 텍스트, HTML

내용을 담아서 전달

response.setContentType("text/html");
 response.setCharacterEncoding("utf-8");
 PrintWriter writer = response.getWriter();
 writer.println("<html>");
 writer.println("<body>");
 writer.println(" <div>안녕?</div>");
 writer.println("</body>");
 writer.println("</html>");
 }

API JSON


private ObjectMapper objectMapper = new ObjectMapper();

 @Override
 protected void service(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 
	response.setHeader("content-type", "application/json");
	response.setCharacterEncoding("utf-8");
	HelloData data = new HelloData();
    
	data.setUsername("kim");
	data.setAge(20); //{"username":"kim","age":20}
    
	String result = objectMapper.writeValueAsString(data);
	response.getWriter().write(result);
}

🔖 학습내용 출처

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

profile
열심히 살자

0개의 댓글