2020-12-03 TIL

3 minute read

Include

  • 한 서블릿에서 명령을 실행하다가 다른 서블릿으로 가서 그 서블릿을 실행한 후에 다시 돌아와 남은 명령을 처리한다.
    • 출력 시에는 두개의 서블릿을 순서대로 한 화면에서 보여준다.
  • forward는 한 서블릿에서 명령을 실행하다가 다른 서블릿으로 가게되면 지금까지 출력한 것을 버리고 다른 서블릿만 출력한다.

html

  • html은 고정된 것이기 때문에 쉽게 삽입하고 뺄 수 없다.
    • 그러므로 보통 jsp로 만든다.
  • 웹 서버에서 웹 브라우저 쪽으로 보내는 데이터
  • 쿠키를 받은 웹 브라우저는 웹 서버에 요청할때마다 서버에서 받은 쿠키를 요청 헤더에 첨부하여 보낸다.
  • 서버에 저장하는 데이터
GET /java-web/ex10/s2 HTTP/1.1
Host: localhost:8080 Connection: keep-alive ... Cookie:
name=hong; age=20; working=true; name2=홍길동; name3=%ED%99%8D%EA%B8%B8%EB%8F%99
  • 쿠키를 웹 브라우저에게 보낼때는 쿠키를 응답 헤더에 담아서 보낸다.
Cookie c1 = new Cookie("name", "hong");
Cookie c5 = new Cookie("name3", URLEncoder.encode("홍길동", "UTF-8")); // 서버가 한글을 못 읽을수도 있으니 인코딩을 하는 경우가 많다.
response.addCookie(c1);
response.addCookie(c5);
  • 쿠키를 꺼낼때
Cookie[] cookies = request.getCookies();
 
response.setContentType("text/plain;charset=UTF-8");
PrintWriter out = response.getWriter();

if (cookies != null) {
	for (Cookie c : cookies) {
		out.printf("%s=%s\n",
		c.getName(),
		c.getValue(),
		URLDecoder.decode(c.getValue(), "UTF-8"));
  • 요청 헤더에 쿠키가 없을 때 리턴되는 것은 빈 배열이 아니라 null이다.

  • 쿠키의 유효기간을 설정할 때

    • 유효 기간을 지정하지 않으면 웹 브라우저를 실행하는 동안은 살아있다.
    • 유효 기간이 살아있으면 하드 디스크에 쿠키를 저장해놓기 때문에 쿠키가 살아있다.
Cookie c2 = new Cookie("v2", "bbb");
c2.setMaxAge(30)
  • 쿠키의 사용 범위를 설정할 때
HTTP/1.1 200
Set-Cookie: v1=aaa
Set-Cookie: v2=bbb; Path=/eomcs-java-web/ex10/a
Set-Cookie: v3=ccc; Path=/eomcs-java-web
  • 현재 url은 bit camp-web-project/auth/login 일 때 /auth 를 말한다.

브라우저의 핵심 부품

  • html 렌더러 : html을 화면에 그려주는 것(크롬이 기준이고 크롬에서 되는 것이 사파리에서 안될수도 있다.)
  • 자바 스크립트 엔진 : 자바 스크립트를 보여주는 것
  • 리눅스의 khtml이라는 것을 가져와서 만든 것이 WebKit이고 애플에서 공개한 웹킷을 가져와서 만든 것이 크롬이다.

서블릿 보관소

세션

public class Servlet01 extends HttpServlet {

  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    // 테스트 방법:
    // => http://localhost:8080/java-web/ex11/s1
    //

    //     세션
    //     => 클라이언트를 식별하는 기술이다.
    //     => HTTP 프로토콜은 Stateless 방식으로 통신을 한다.
    //     즉 연결한 후 요청하고 응답을 받으면 연결을 끊는다.
    //     그래서 서버는 클라이언트가 요청할 때 마다 누구인지 알 수 없다.
    //     => 이를 해결하기 위해
    //     클라이언트가 접속하면 웹 서버는 그 클라이언트를 위한
    //     고유 번호를 발급(쿠키 이용)한다.
    //     이 고유 번호를 '세션 아이디'라 부른다.
    //     => 웹 브라우저는 세션 아이디를 쿠키에 보관해 두었다가
    //     그 서버에 요청할 때 마다 세션 아이디를 보낸다.
    //     왜? 세션 아이디는 쿠키이다.
    //     => 세션 아이디를 쿠키로 보낼 때 유효기간을 설정하지 않았기 때문에
    //     웹 브라우저를 종료하면 세션 아이디 쿠키는 삭제된다.
    //     => 세션 아이디 쿠키의 사용 범위는 웹 애플리케이션이다.
    //     예) /eomcs-java-web
    //     따라서 같은 웹 애플리케이션의 서블릿을 실행할 때는
    //     무조건 세션 아이디를 보낸다.
    //
    //     세션 아이디는 언제 발급하는가?
    //     => 새 세션을 생성할 때 세션 아이디를 발급한다.
    //
    //     언제 새 세션을 생성하는가?
    //     => 세션이 없는 상태에서 request.getSesssion()을 호출할 때 생성한다.
    //     => 생성한 세션의 ID는 쿠키를 통해 응답할 때 웹브라우저로 보낸다.
    //     => HTTP 응답 프로토콜
    //
    //     HTTP/1.1 200
    //     Set-Cookie: JSESSIONID=5801C115615A2C9074AC0B78E31C5F21; Path=/eomcs-java-web; HttpOnly
    //     Content-Type: text/plain;charset=UTF-8
    //     Content-Length: 44
    //     Date: Wed, 08 Apr 2020 03:10:58 GMT
    //     Keep-Alive: timeout=20
    //     Connection: keep-alive

    //     세션 생성하기 : getSession() 호출
    //
    //     1) 클라이언트가 세션 아이디를 쿠키로 전송
    //     - 서버에서는 해당 아이디의 세션을 찾는다.
    //     - 있으면, 그 세션을 리턴한다.
    //     - 있는데 세션의 유효 기간이 지났다면, 새로 세션을 만들어 리턴한다.
    //     - 없다면, 새로 세션을 만들어 리턴한다.
    //     2) 클라이언트가 세션 아이디를 보내지 않은 경우
    //     - 서버는 새 세션을 만들어 리턴한다.
    //
    //     항상 새 세션을 만들면, 응답할 때 새 세션의 아이디를 쿠키로 보낸다.
    //
    HttpSession session = request.getSession();

    // 세션에 데이터 보관하기
    session.setAttribute("v1", "aaa");

    response.setContentType("text/plain;charset=UTF-8");
    PrintWriter out = response.getWriter();

    out.println("/ex11/s1 - 세션을 생성하였습니다!");
  }
}
  • 클라이언트를 구별할 때 세션 아이디로 구분하는데 그 세션 아이디를 쿠키로 주고받는다. 웹 서버는 요청을 할때마다 쿠키로 서버에서 받은 세션 아이디를 주면서 요청한다. 서버는 이 세션 아이디를 받아서 클라이언트를 구별한 다음 요청을 리턴한다.

톰캣 서버와 세션

  • 서버를 리로드하면 톰캣 서버는 세션 아이디가 동일한 새로운 httpSession을 만든다.
    • 세션을 다시 만들 일이 없으므로 자동 로그인이 안된다.

#45 - MVC 아키텍처로 전환하기

  • jsp 기술을 사용하면 기존 서블릿에서 html을 뜯어내 화면을 쉽게 만들 수 있다.
  • 개발자가 java 소스코드로 html을 출력하는 것은 매우 번거롭다.
  • jsp를 사용하면 jsp엔진이 .java 파일을 생성해준다. 이것을 컴파일하면 .class 파일이 생성되고 클라이언트에서 요청이 들어오면 서블릿 컨테이너가 .class 파일에게 service()를 요청한다.

jsp

  • 개발자 대신 출력문을 작성해준다.

  • jsp의 <% %> 태그를 스크립트 릿이라고 부른다.

    • jsp를 바로 실행하는 것이 아니라 자바 소스코드로 바뀐 다음에 실행된다.
    • 스크립트 릿 안에 든 것은 메서드 안에서 구현된다.

Categories:

Updated: