2020-11-26 TIL
favicon.ioc
- eclipse workspace-.meta-plugins-servercore-tmp-root 아래에 둔다
GET 요청
-
웹 브라우저에 URL을 입력한 후 엔터를 치면 GET 요청을 보낸다.
-
웹 페이지에서 링크를 클릭하면(자바스크립트 처리하지 않은 상태) GET 요청을 보낸다.
-
웹 페이지의 폼(method=’GET’ 일 때)에서 전송 버튼을 클릭하면 GET 요청을 보낸다.
웹브라우저에서 웹서버의 자원을 요청하는 방법
- 1) 서블릿 클래스를 실행하고 싶을 때
=> 서블릿 클래스의 실제 위치:
톰캣배치폴더/wtpwebapps/eomcs-java-web/WEB-INF/classes/com/eomcs/web/ex04/Servlet01.class
=> 요청:
해당 서블릿을 서버에 등록할 때 사용한 URL을 지정해야 한다.
http://localhost:9999/eomcs-java-web/ex04/s1
- 2) HTML, CSS, JavaScript, JPEG 등 정적 파일을 받고 싶을 때
=> 정적 파일의 실제 위치:
톰캣배치폴더/wtpwebapps/eomcs-java-web/ex04/test01.html
=> 요청:
http://localhost:9999/eomcs-java-web/ex04/test01.html
- 3) /WEB-INF/ 폴더에 있는 정적 파일을 받고 싶을 때
=> 정적 파일의 실제 위치:
톰캣배치폴더/wtpwebapps/eomcs-java-web/WEB-INF/ex04/test01.html
=> 요청:
/WEB-INF 폴더 아래에 있는 파일은 클라이언트에서 요청할 수 없다!
웹 애플리케이션의 정보를 두는 폴더로 보안상 중요한 정보가 포함되어 있기 때문에 요청하지 못하도록 막아두었다.
Static resource는 두지 않도록 한다.
url 인코딩/디코딩
- url에는 특수문자나 공백이 들어갈 수 없기 때문에 입력값을 url을 통해 나타낼 때 특수문자나 공백을 다른 것으로 대체해서 보여주는 것을 말한다.
- 서버에서 리턴해줄때도 디코딩을 해서 보내준다.
- a b?c+d / 100 입력시 ?name=a+b%3Fc%2Bd&age=100 라고 나온다.
절대경로 / 상대경로

경로
<form action="s2" method="post">
- root로 시작하는 것은 다 절대 경로이다.
- 상대 경로를 쓰면 같은 폴더 내에 포함된 것들은 다 경로를 지정해주지 않아도 된다.
- 서블릿 소스의 애노테이션에서 지정하는 루트는 현재 웹 어플리케이션 루트를 말한다.
- 웹 어플리케이션 루트 = 컨텍스트 루트
- @WebServlet(“/ex04/s2”)
- localhost:9999/bitcamp-web-project/
- 웹 어플리케이션 루트 = 컨텍스트 루트
- html 루트는 localhost:9999/ 를 말한다.
- http(프로토콜)://localhost:(서버주소)9999(포트번호)/(서버루트)bitcamp-web-project/(컨텍스트 루트 = 웹 앱 루트)ex04/test02.html(리소스 패스)
- 리소스는 정적/동적으로 나뉜다.
- 정적 = static
- html.gif
- 동적 = dynamic
- servlet
- 정적 = static
- 리소스는 정적/동적으로 나뉜다.

실무서버 구성

POST 요청
- 웹 페이지의 폼(method=’POST’ 일 때)에서 전송 버튼을 클릭하면 POST 요청을 보낸다.
웹 브라우저가 보낸 데이터 읽기
=> 데이터를 읽을 때는 GET 요청과 POST 요청이 같다.
ServletRequest.getParameter(“파라미터이름”)
=> POST 요청으로 보낸 데이터는 기본으로 영어(ISO-8859-1)라고 간주한다.
그래서 영어 코드를 UCS2(UTF-16) 문자 코드로 변환한다.
예) “ABC가각”을 보낸다고 가정하자.
실제 웹 브라우저가 “ABC가각” 문자열을 보낼 때 다음과 같이 UTF-8 코드를 보낸다.
41 42 43 EA B0 80 EA B0 81
그런데 서블릿에서는 이 코드 값을 ISO-8859-1 코드라고 간주한다.
그래서 getParameter()를 호출하여 값을 꺼내면
위의 코드를 UTF-16으로 바꿔서 리턴한다.
즉 각 바이트에 그냥 00을 붙여 문자열을 만든 후 리턴한다.
왜? 영어(ISO-8859-1)를 2바이트 유니코드로 바꿀 때 그냥 앞에 00 1바이트를 붙이면 되기 때문이다.
위의 코드를 UTF-16으로 바꾸면 다음과 같다.
0041 0042 0043 00EA 00B0 0080 00EA 00B0 0081
이렇게 변환된 코드를 화면에 출력하면 다음 폰트로 보인다.
ABCê°ê°
클라이언트가 보낸 한글을 읽을 때 깨지는 문제 해결?
=> 원리
getParameter()를 최초로 호출하기 전에 먼저
클라이언트 보낸 데이터의 인코딩 형식이 어떤 문자표로 되어 있는지 알려줘야 한다.
=> 주의!
반드시 getParamter()를 최초로 호출하기 전이어야 한다.
한 번 getParameter()를 호출한 후에는 소용없다.
get과 post의 차이
-
겟 방식은 url 영역을 사용
- 리퀘스트url에 보내기 때문에 바이너리 데이터를 보낼 수 없다.
- 주소 자체를 캐쉬(내부적으로 히스토리)에 보관하기 때문에 url에 포함된다면 중요한 정보가 캐쉬되기 때문에 노출될 수도 있다.
-
포스트 방식은 메시지 바디 영역을 사용
- 그렇기 때문에 바이너리 데이터를 보낼 수 있다.
- 데이터의 한계가 정해져있지 않다.
- 데이터의 내용이 노출되지 않기 때문에 보안이 더 좋다.
정적 자원과 동적 자원 서비스
- 웹브라우저 -(요청)-> 웹 서버 -(요청)-> 서블릿 컨테이너
- 웹 서버 + 서블릿 컨테이너 = 톰캣서버
- 정적 자원을 웹 브라우저로 요청했을 때 웹 브라우저의 요청을 받아 웹 서버가 정적 리소스를 읽어서 리턴해준다.
- 다이나믹 자원(서블릿, 실행하는 자원)을 웹 브라우저를 통해 요청받으면 웹 서버는 그 요청을 서블릿 컨테이너로 넘겨서 서블릿 컨테이너가 서블릿을 읽어 리턴해준다.
- <action =”s2”> 를 했을 때
- 웹 서버가 먼저 localhost:9999/bitcamp-web-project/ex04/ 에서 s2가 있는지 찾아보고
- 없으면 서블릿 컨테이너로 위임한다.
한글 깨짐 문제 처리

- Request.getParameter()를 실행하기 전에 UTF-8
webapp을 서버에 이미 배포한 이후에 만들었을 때
- 설정 파일에 webapp이 포함되어 있지 않기 때문에 gradle eclipse를 실행해서 설정 파일에 webapp을 등록해줘야 한다.
- 이후에 배포하면 된다.