3 분 소요

요청, 응답 / 질의 문자열

웹 서버 처리 순서

클라이언트가 웹 브라우저에서 서비스 요청(HTTP 프로토콜 기반 요청정보 생성, 웹서버에 전달) → 웹서버는 전달받은 요청정보의 URI를 확인하고 서블릿으면 서블릿 컨테이너에 처리 넘김 → 서블릿 컨테이너가 요청받은 서블릿 클래스 파일 실행 → 최초 요청인지 파악 → 최초 : 메모리에 로딩 후 객체 생성, init() 메소드 호출 / 반복 : 생략 → 서블릿 컨테이너가 HttpServletRequest, HttpServletResponse 객체 생성 → service() 메소드 호출 → 메소드 실행 완료되면 클라이언트에 응답 전달 / 서버 프로그램 완료, HttpServlet 객체 소멸

응답 정보 처리 - HttpServletResponse

  • ServletResponse 인터페이스를 상속받은 HttpServletResponse 사용 ⇒ 일반적인 네트워크 통신 관련 메소드 + http 프로토콜 통신 기반 메소드
  • 쿠키 설정, HTTP 응답 헤더 설정 등 HTTP 프로토콜과 직접적인 관계가 있는 메소드 포함

한글 응답

  • 한글 깨지는 것 방지하기 위해 서버가 클라이언트로 보내는 데이터의 문서타입과 한글을 지원하는 문자셋을 응답정보 헤더에 설정
    • setContentType(”text/html;charset=UTF=8”);
    • 띄워쓰기 금지

요청 정보 처리 - HttpServletRequest

  • 클라이언트가 서버로 전달하는 요청정보

네트워크 정보

  • 웹서버에 서비스 요청할 때 사용한 프로토콜, 서버의 호스트 이름, IP 주소, 서버의 포트 번호,클라이언트의 IP 주소, 클라이언트의 호스트 이름, 클라이언트 소스 포트 번호

URL 정보

  • 클라이언트가 요청한 문서 정보, URL, 웹 애플리케이션 경로 정보, 서비스 처리하면서 사용되는 구체적인 프로토콜 정보, 루트 디렉토리 기준 서블릿 경로

모든 헤더 정보

  • 헤더 이름들 모아서 객체로 반환, 객체의 커서 다음 데이터의 유무, 요청정보의 헤더 이름

Collection

  • 배열의 한계를 벗어나 데이터를 그룹으로 처리. 크기를 유동적으로 바꿀 수 있음
  • 하나의 그룹에 서로 다른 데이터 타입 저장 가능
  • Enumeration, Iterator
    • 그룹 안의 요소에 접근할 때 인덱스, 키로 접근하지 않고 커서 개념으로 접근. Collection 안에 있는 모든 요소를 차례로 접근할 때 사용
  • 다형성 구현

추가 정보

  • 클라이언트 요청 방식, 요청 URL에서 ?뒤의 문자열 전체 추출

질의 문자열

개요

질의 문자열이란

  • 웹 클라이언트에서 웹서버에 정보를 요청할 때 정해진 방식으로 데이터를 전달할 수 있으며 이때 사용하는 문자열
  • 서블릿이나 JSP 같은 서버상에서 수행되는 기술을 요청할 때 사용
  • HTML의 <form> 태그

질의 문자열 전송 규칙

  • 요청 방식과 상관없이 클라이언트가 입력한 데이터는 정해진 규칙으로 인코딩 되어 전달
    • name=value 형식으로 전달. 여러 개의 쌍이 있을 경우 &를 구분자로 사용
    • 영문, 숫자, 일부 특수문자 그대로 전달. 나머지 문자는 %기호와 함께 16진수로 바뀌어 전달
    • 공백 문자는 + 기호로 변경

HTML 입력 양식

<form> 태그

  • 웹에서 화면 관련된 기술의 기초
  • <form action="서버프로그램 경로" method="요청방식">
    • action : 질의 문자열들을 전달받아 처리할 서버 프로그램 저장
    • method : 클라이언트가 서버 프로그램을 어떤 방식으로 요청할지 지정

요청방식에 따른 처리

GET 방식

  • 서버로 전달되는 질의 문자열이 브라우저의 주소 줄에 모두 나타남 ⇒ 질의 문자열을 요청정보 헤더에 포함하여 전달
  • 255바이트 미만의 외부에 노출되어도 상관 없는 데이터를 전달할 때 적합
  • 인코딩, 디코딩 작업이 없어서 처리속도 면에서 이점

POST 방식

  • 질의 문자열이 요청정보 몸체에 포함 ⇒ 외부에 노출되지 않음
  • 질의 문자열의 길이 제한 없음
  • <form> 태그 사용해야만 요청 가능

서블릿 작성

  • 서버 프로그램을 구현하면서 클라이언트에 관한 정보가 필요하면 HTTP 요청정보에서 추출

메소드 구현

  • 최초 요청 : init() ⇒ service()
  • 반복 요청 : service()
  • doGet, doPost
    • 개발자의 선택
    • 요청 방식에 따라 구분해서 처리하고 싶을 때 사용

서블릿 연결

  • <form> 태그의 action 속성에 매핑되는 정보 지정

질의 문자열 추출

  • HttpServletRequest 메소드 사용
    • String getarameter(String name) : 질의 문자열로 넘어온 값 하나씩 추출. name이 중복되지 않고 유일하게 하나만 넘어올 때 사용. 반환 타입 String
    • String getQueryString() : 같은 이름으로 여러 개의 변수가 전달되었을 때 한번에 모든 값을 추출하여 String 타입 배열로 반환
    • String getQueryString() : 클라이언트가 전달할 질의 문자열 전체 하나의 String으로 추출. GET 요청에서만 사용 가능
    • ServletInputStream getInputStream() throws IOException : HTTP의 요청정보 몸체와 연결된 입력스트림 생성하여 반환

한글 처리

post 방식

  • 서블릿 API에서 한글 코드 변환 메소드 제공
    • req.setCharacterEncoding()
    • ECU-KR : 한글과 영문만 지원. 한 글자 2byte
    • UTF-8 : 전 세계 모든 언어

get 방식

  • 질의 문자열들이 URI에 포함되어 전달되기 때문에 URI 인코딩 처리 작업 필요
  • 클라이언트가 입력한 문자열 인코딩
    • 소스에서 직접 ⇒ <metacharset="UTF-8">
    • 이클리스에서 지정 ⇒ 설정 변경
  • 서버에서 URI 인코딩
    • server.xml 설정 변경