command+shift + T // 테스트 케이스 만들기 command +shift+enter //자동완성 command +D // 선택영역 복사 command +B // 선택함수가 어디에서 호출되는지 볼수있음 command + option +V // 변수로 바로 생성 command + E //최근에 봣던 목록 command + option + m //extract method command + option + n //inline으로 바꿔줌 command + option + b //해당 대상 구현체 조회가능 control + T >>method // 선택된 블록 함수로 extracted
서블릿
서블릿은 클라이언트의 요청을 처리하고, 그결과를 반환하는 Servlet클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술!
실습 준비
start.spring 에서 gradle, 2.7.1, hello, servlet, servlet,hello.servlet이며, packaging: war, java:11
Spring web, lombok을 Dependencies로 선택한다
Lombok을 사용하기위해, IJ 에서 preference에서 plugin 에서 lombok설치 및 annotation processors를 enable로 바꿔줌
Hello 서블릿
서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올리고, 서버실행해야한다. 하지만 번거롭기에 스프링 부트의 톰캣서버 내장됨에 따라, 편리하게 서블릿 코드 실행해보겠다
스프링 부트 서블릿 환경 구성
@ServletComponentScan 서블릿 자동 등록으로, main()함수 들어있는 파일에 에너테이션 추가
서블릿 등록하기
extends HttpServlet이 필요하며, @WebServlet에너테이션필요함,
@WebServlet 서블릿 애노테이션 >> name: 서블릿 이름 urlPatterns: URL 매핑
HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편할 것이다. 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServletRequest 객체에 담아서 제공한다.
추가 부가기능도있다
임시 저장소 기능(!!!)
해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능
저장: request.setAttribute(name, value)
조회: request.getAttribute(name)
세션 관리 기능
request.getSession(create: true)
HttpServletRequest, HttpServletResponse를 사용할 때 가장 중요한 점은 이 객체들이 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체라는 점이다. 따라서 이 기능에 대해서 깊이있는 이해를 하려면 HTTP 스펙이 제공하는 요청, 응답 메시지 자체를 이해해야 한다.
username=hello&username=kim 과 같이 파라미터 이름은 하나인데, 값이 중복이면 어떻게 될까? request.getParameter() 는 하나의 파라미터 이름에 대해서 단 하나의 값만 있을 때 사용해야 한다. 지금처럼 중복일 때는 request.getParameterValues() 를 사용해야 한다. 참고로 이렇게 중복일 때 request.getParameter() 를 사용하면request.getParameterValues() 의 첫 번째 값을 반환한다.
HTTP 요청 데이터 - POST HTML Form
특징
content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파리미터 형식으로 데이터를 전달한다. username=hello&age=20
application/x-www-form-urlencoded 형식은 앞서 GET에서 살펴본 쿼리 파라미터 형식과 같다. 따라서 쿼리 파라미터 조회 메서드를 그대로 사용하면 된다. 클라이언트(웹 브라우저) 입장에서는 두 방식에 차이가 있지만, 서버 입장에서는 둘의 형식이 동일하므로, request.getParameter() 로 편리하게 구분없이 조회할 수 있다.
content-type은 HTTP 메시지 바디의 데이터 형식을 지정한다. GET URL 쿼리 파라미터 형식으로 클라이언트에서 서버로 데이터를 전달할 때는 HTTP 메시지 바디를 사용하지 않기 때문에 content-type이 없다. POST HTML Form 형식으로 데이터를 전달하면 HTTP 메시지 바디에 해당 데이터를 포함해서 보내기 때문에 바디에 포함된 데이터가 어떤 형식인지 content-type을 꼭 지정해야 한다. 이렇게 폼으로 데이터를 전송하는 형식을 application/x-www-form-urlencoded 라 한다.
JSON 결과를 파싱해서 사용할 수 있는 자바 객체로 변환하려면 Jackson, Gson 같은 JSON 변환 라이브러리를 추가해서 사용해야 한다. 스프링 부트로 Spring MVC를 선택하면 기본으로 Jackson 라이브러리( ObjectMapper )를 함께 제공한다.
HTML form 데이터도 메시지 바디를 통해 전송되므로 직접 읽을 수 있다. 하지만 편리한 파리미터 조회 기능( request.getParameter(…) )을 이미 제공하기 때문에 파라미터 조회 기능을 사용하면 된다.(messageBody까지 추출하는과정==직접읽는과정)
HelloData helloData = new HelloData(); helloData.setUsername("kim"); helloData.setAge(20);
//{"username":"kim","age":20} String result = objectMapper.writeValueAsString(helloData); response.getWriter().write(result);
} }
HTTP 응답으로 JSON을 반환할 때는 content-type을 application/json 로 지정해야 한다. Jackson 라이브러리가 제공하는 objectMapper.writeValueAsString() 를 사용하면 객체를 JSON 문자로 변경할 수 있다.
application/json 은 스펙상 utf-8 형식을 사용하도록 정의되어 있다. 그래서 스펙에서 charset=utf-8과 같은 추가 파라미터를 지원하지 않는다. 따라서application/json 이라고만 사용해야지application/json;charset=utf-8 이라고 전달하는 것은 의미 없는 파라미터를 추가한 것이 된다. response.getWriter()를 사용하면 추가 파라미터를 자동으로 추가해버린다. 이때는response.getOutputStream()으로 출력하면 그런 문제가 없다.