JAVA/java

[Backend] Survlet, jsp

Garonguri 2022. 4. 3. 02:13
728x90

  1. Servlet 
    1. JSP 이전에 동적인 웹 컨텐츠를 제공하기 위해 나타났다.
  2. JSP
    1. jsp는 html 코드를 중심으로 java 코드를 필요한 부분에 사용한다.
    2. jsp는 file 이름을 url로 사용할 수 있다.
    3. EL, jstl을 활용할 수 있다.
    4. 컴파일 된 후 servlet으로 변경된다.
    5. MVC model에서 view의 역할을 담당한다.
    6. javascript코드를 포함할 수 있다.
  3. Survlet URL
    1. URL mapping 방법
      1. web.xml 고치기
      2. annotation ( @WebServlet("/main.do") 기억 할 것!)
    2. URL의 구조
      1. http://www.ssafy.com/good.jsp?parameter1=value1&parameter2=value2
      2. URL
      3. Query String Begin
      4. Parameter Name
      5. Parameter Value
      6. Query String Separator
    3. @WebServlet(value="/main.do")-> @WebServlet("/main.do")로 간단하게 표기 가능
    4. value에 String[]값을 넣을 수 있기 때문에 여러가지 uri포함 가능. =>@WebServlet(urlPatterns ={"/main.do","/ssafy.do"})
    5. "/"를 나타내는 Root Path -> Context Root or Server Root.
      1. context path와 server path 대답할 수 있어야 함. 
      2. Server Root : Redirect 경로(url바뀜). location.href, a tag's href 등
      3. Context Root : Forward 경로(url유지)
  4. Survlet Lifecycle
    1. javaSE와 다르게 main method가 없다.
    2. 객체의 생성부터 method call까지 container에게 있다.
    3. Client가 요청 -> Servlet container는 서블릿 객체를 한번만 생성, 한번만 초기화하고, 요청시마다 요청에 대한 처리를 반복
    4. servlet 객체를 제거하는 일까지 container까지 담당
    5. Servlet lifecycle Method
      1. Constructor -> init -> service -> doget/dopost -> destroy
      2. Constructor : 요청이 들어오면 servlet 객체 생성
      3. init() : 서블릿이 메모리에 로드될 때 한번 호출(코드 수정으로 다시 로드되면 다시 호출) -> 한번만 호출
      4. service() : 모든 요청은 service()를 통해 do__ method로 이동한다. ->  요청 시 마다 반복 실행
        1. 요청을 할 때 get이면 doget(), post면 dopost(), 모르겠으면 service() 오버라이딩.
      5. dopost() : Post방식으로, doget() : Get방식으로 data 전송 시 호출한다. -> 요청 시 마다 반복 실행
      6. destroy() : 서블릿이 메모리에서 해제되거나, 코드가 수정되면 호출한다. -> 한번만 호출
  5. Servlet 객체
    1. parameter에 값이 한 개만 있는 경우 : request.getParameter("value");
    2. parameter에 값이 여러 개 있는 경우(체크박스) : request.getParameterValues("values")
  6. Page 이동 방식 차이, 특징
    1. Forward
      1. user가 처음 요청한 request와 response를 유지하며 page를 이동한다.
      2. web container 동일 서버 내 path로 이동한다.
      3. user에게 보여지는 url이 변하지 않는다. 기존 url 유지
      4. request의 setAttribute(key, value)를 통해 전달.
      5. GerRequestDispather 사용.
    2. SendRedirect
      1. Page를 이동하고 나면 request, response가 사라진다. 새로운 request, response가 생성됨.
      2. 다른 web container의 url로 이동할 수 있고 따라서 user에게 보여지는 url이 변화한다.
      3. reload 시 기존 request가 유지되어 재동작한다.
      4. request로는 data를 저장할 수 없고 session이나 쿠키를 이용해야 한다.
    3. C, U, D : redirect, R : forward를 사용하면 좋다.
  7. Client 요청 방식 & survlet에서 처리 방법
    1. doget : 전송되는 데이터가 url뒤에 query string으로 전달
      1. 간단하다. 직접 입력 가능하다.
      2. 데이터 양의 제한이 있다. 사이즈는 2kb
    2. dopost : url과 별도로 http header 뒤 body에 전달.
      1. 데이터의 제한이 없고 보안이 유지된다.
      2. get방식보다 느리다.
    3. Error 응답 코드
      1. 403 : 클라이언트가 접근할 권리가 없다. 서버는 클라이언트가 누군지 알고 있다.
      2. 404 : 서버가 요청받은 리소스를 찾을 수 없다. 알려지지 않은 URL을 의미합니다. 리소스 자체는 존재하지 않음을 의미
      3. 406 : 이 응답은 서버가 서버 주도 콘텐츠 협상을 수행한 후, 사용자 에이전트에서 정해준 규격에 따른 어떠한 콘텐츠도 찾지 않았을 때, 웹서버가 보냅니다.
      4. 500 : 웹 사이트 서버에 문제가 있음을 의미하지만 서버는 정확한 문제에 대해 더 구체적으로 설명할 수 없습니다.
  8. JSP의 구성 요소, 기능
    1. JSP directive
      1. page directive : 컨테이너에게 현재 jsp 페이지 어떻게 처리할건지
      2. include directive : 특정 jsp file page에 포함시키기
      3. taglic directive : jstl, 사용자 태그를 이용해 자바 코드 줄이기
    2. JSP Scriptlet
      1. <%! 선언 %>
      2. <% java code %> : servlet으로 변환 시 service에 해당. 
      3. <%=  문자열 %> : data를 브라우저에 출력 --> EL이 대체 가능
      4. <%-- 주석 --%> 
  9. JSP to EL
    1. dot표기법도 있지만 []사용할 수도 있다. ${userinfo["name"]} == ${userinfo.name} 둘다 가능
    2. pageContext(java beans) 제외 모든 객체는 Map. ->  key, value 있음.
  10. JSTL tag
    1. <c:set> -> 값 할당할 때 사용
    2. <c:catch> 오류페이지 안넘기고 사용
    3. <c:if> 이프문
    4. <c:forEach> 반복문
  11. scope 관련 객체
    1. pageContext
      1. 하나의 jsp 페이지를 처리할 때 사용되는 영역
      2. 한번의 요청에 하나의 jsp가 호출되고 한개의 page만 대응됨. 페이지 벗어나면 사라짐
    2. request
      1. 하나의 http요청을 처리할 때 사용되는 영역
      2. 요청을 할 때마다 새로운 request 생성. 응답이 완료되면 사라짐
    3. session
      1. 하나의 웹 브라우저와 관련
      2. 같은 웹 브라우저 내 요청 페이지들은 같은 session을 공유
    4. application
      1. 하나의 웹 어플리케이션과 관련됨.
    5. 이 네 개 중 setAttribute()가 없는 객체는? -> response
    6. setAttribute는 (String key, Object value)이기 때문에 getAttribute("key")의 반환 객체는 Object이다. 
    7. 영역 객체의 유지 순서 :
      1. pageContext -> request(HttpservletRequest) -> session(HttpSession) -> application(ServletContext)
  12. 예외 처리
    1. web.xml로 관리. 톰캣에게 계속 throw함.
    2. Result.jsp는 application root 아래에 존재한다.
    3. <a href="main.do">로 서블릿 호출 -> Get 요청
    4.  
  13. Cookie
    1. 특징
      1. key, value로 구성되어있고 String으로 이루어져 있다.
      2. 브라우저마다 저장되는 쿠키가 다르다.
      3. 세션 관리, 개인화, 트래킹에 용이 (자동 로그인, 다시 보지 않기, 최근 검색 상품, 장바구니)
      4. 이름, 값, 만료일, 경로로 구성
      5. 클라이언트 당 300개, 도메인 당 20개, 한 쿠키는 4kb까지 저장 가능
    2. 설정
      1. 동작 순서: 
        1. 클라이언트가 페이지 요청
        2. WAS가 쿠키 생성
        3. Http header에 쿠키 넣어 응답
        4. 브라우저가 쿠키를 pc에 저장하고, was가 재요청할때 쿠키를 같이 전송
        5. 브라우저가 종료되더라도 쿠키 만료 기간이 남았다면 계속 보관한다.
        6. 재방문 시 해당 쿠키가 있는 경우 요청 페이지와 함께 쿠키 전송한다.
    3. 값 변경/얻기
      1. setValue(String value) / getValue()
    4. 전송
      1. Cookie cookie = new Cookie("id", "itkorea");
      2. response.addCookie();
    5. 유효기간
      1. setMaxAge(), getMaxAge()로 얻고 setMaxAge(0)이면 삭제
  14. Session
    1. 특징
      1. 메모리가 허락하는 용량까지 저장 가능
      2. WAS에 object 형태로 저장
      3. 장바구니, 화면 로그인 등..
      4. 웹 서버에 저장됨.
      5. 브라우저를 닫거나 세션을 삭제했을 때 삭제됨. 쿠키보다 보안 좋음.
      6. 클라이언트 고유 아이디 부여
      7.  
    2. 동작 순서
      1. 클라이언트가 페이지 요청
      2. 서버가 쿠키를 확인해서 클라이언트가 session id를 보냈는지 확인
      3. 존재하지 않는다면 생성해서 클라이언트에게 돌려줌
      4. 서버가 돌려준 세션 아이디를 쿠키 사용해서 서버에 저장. (JSESSIONID)
      5. JSESSIONID(쿠키)를 사용해 재접속 시 서버에 전달
    3. 설정
      1. 브라우저 당 하나의 JSESSIONID 할당
      2. setAttribute(String name, Object value)
    4. 해제
      1. invalidate()
  15. MVC pattern
    1. jsp를 이용해 구성할 수 있는 웹 어플리케이션 아키텐쳐는 model1과 model2로 나뉜다.
    2. jsp가 클라이언트 요청에 대한 logic과 view 모두를 담당하느냐, 아니면 view만 담당하느냐에 따라 나뉨.
    3. model 1
      1. logic, view를 모두 jsp가 담당한다. (즉 view, controller모두를 jsp가 담당함. model은 java beans)
      2. 장점 : 구조가 단순하고 직관적, 개발 시간과 비용 단축
      3. 단점 : jsp코드가 복잡해지고, 분업이 힘들어진다. 확장성과 유지보수에 안좋다.
    4. model2
      1. 요청 처리는 servlet이, logic 처리는 java class가, view는 jsp가 담당하는 구조.
      2. 즉 Model은 service, dao, java beans가 한다. view는 jsp(결과 출력을 위한 자바 코드 존재)가, controller는 servlet이 담당하는 구조.
      3. 장점 : jsp는 코드가 복잡하지 않다. 분업이 용이하다. 유지보수가 쉽고 확장성이 좋다.
      4. 단점 : 전체 구조가 복잡하고 개발 시간, 비용이 증가한다.
      5.  
728x90