ABOUT ME

-

오늘
-
어제
-
-
  • KOSTA 교육 42일차(Cookie, Session, Expression Language, JSTL, Filter)
    Review 2020. 6. 23. 01:39

    19 . 1. 3(목)

     

    배운 내용

     

    1. Cookie(쿠키)
    2. Session(세션)
    3. Expression Language(익스프레션 언어)
    4. JSTL(JSP Standard Tag Library)
    5. Filter(필터)

    1. Cookie(쿠키)

    HTTP 프로토콜의 문제점을 해결하기 위해 클라이언트측에 데이터를 저장하여 사용하는 방법이다.

     

    • 첫 번째 웹 컴포넌트가 웹 브라우저로 HTML 문서를 보낼 때 전달한 데이터를 함께 보내며, 웹 브라우저는 데이터를 저장해 두었다가 두 번째 웹 컴포넌트를 호출할 때 URL과 함께 웹 서버로 보낸다.
    • 파라미터는 String으로 넘겨준다.

     

     

    Cookie 예시

    • 로그인 Form을 만들어 submit시 loginProc.jsp로 이동한다.

     

    • Cookie 학습에 용이하게 로그인 할 임의의 고객 정보를 자체 생성하였다.
    • form에 입력한 값을 가져오기 위해 getParameter를 통해 id, pass 변수에 담는다.
    • if문으로 둘다 같으면 Cookie를 생성는데 이 때 로그인된 name으로 Cookie를 생성하고 addCookie를 통해 쿠키를 보낸다.
    • 여기서는 로그인이 완료되었다면 name을 가진 Cookie가 생성될 것이다.

     

    • 로그인 시마다 Cookie를 생성하기 때문에 (DB가 연동되었다는 가정 하에) 배열을 선언하여 Cookies 배열에 하나씩 넣어줄 것이다.
    • if문으로 cookies가 null이 아니라면 출력을 해주기 위해 for문을 사용하여 cookies[i].getName()이 name과 같으면 Decoder를 해서 UTF-8로 변환하여 출력하고 Cookies가 없거나 JSESSIONID면 다시 loginForm.jsp로 돌아가게 한다.
    • 그리고 로그인을 하면 로그아웃을 할 수 있도록 a태그를 통해 이동하게 한다.

     

    • 위와 과정은 동일하지만 Cookie를 삭제해주어야 하기 때문에 name을 찾고 setMaxAge(0);을 선언하여 Cookie를 종료한다. 이 때 서버에서는 addCookie를 response를 해주어야한다.

     

    • 로그인시 Cookie 생성

    • 로그아웃시 Cookie 삭제

    2. Session(세션)

    HTTP 프로토콜의 문제점을 해결하기 위해 서버측에 데이터를 저장하여 사용하는 방법이다.

     

    • 첫 번째 웹 컴포넌트가 웹 서버 쪽에 데이터를 저장해 놓고 그 데이터를 읽기 위해 필요한 세션 아이디만 웹 브라우저로 보내며, 웹 브라우저는 아이디를 저장해 두었다가 두 번째 웹 컴포넌트를 호출할 때 웹 서버로 보낸다.

     

     

    Session 예시

    • Form 태그로서 submit 하면 loginProc.jsp로 이동한다.

     

    • form에서 입력한 name을 getParameter로 가져오고 if문이 만족한다면 setAttribute로 name을 session에 저장한다.

     

    • name을 가져오기 위해 강제 캐스팅을 하여 name에 선언하고 name이 null이라면 
      loginForm.jsp로 돌아간다.
    • 로그아웃을 누르면 logout.jsp로 갈 수 있도록 a태그로 선언하였다.

     

    • login과 동일하게 name에 getAttribute로 name을 넣고 null이라면 loginForm.jsp로 이동하고 null이 아니라면 session.invalidate()로 session에서 제외시킨다.

    3. Expression Language(익스프레션 언어)

    같은 식을중심으로 코드를 기술하는 언어로서 연산자와 피연산자의 조합을 ${식}로 둘러싸서 표현한다.

    • 애트리뷰트를 이용하여 사용된다. 여기서 애트리뷰트란 setAttribute, getAttribute, removeAttribute 메서드를 통해 저장되고, 관리되는 데이터를 의미한다.

     

    • 사용 범위가 좁은 순에서 넓은 애트리뷰트 순으로 해석된다.

     

    • 내장객체 애트리뷰트는 위의 방식으로 EL식을 작성한다.
    • 하지만 애트리뷰트만 작성해도 알아서 찾아 해석해준다.

     

    • param은 웹 브라우저에서 <FORM> 태그를 통해 입력된 데이터를 가져올 때 사용한다. 보통 왼족의 경우를 많이 사용한다.

     

    EL 예제

    • setAttribute()로 name을 kosta로 선언
    • Member 객체를 m에 담아 setName을 홍길동으로 담고 setAttribute()로 member를 m으로 선언
    • HashMap<String, String>map을 객체로 선언하고 put으로 담은 후 setAttribute로 baseball에 map을 선언

     

    • 스크립트릿
      단순 name을 kosta로 선언하였기 때문에 getAttribute를 선언하여 출력한다.
      EL
      name만 선언하면 동일한 값이 출력된다.
    • 스크립트릿
      Member 객체(자바 빈)에서 가져왔기 때문에 Member로 형변환을 해주고 getAttribute로 member를 가져온 후 getName()을 이용하여 출력한다.(setName으로 name을 선언해주었기 때문)
      EL
      member(자바 빈).name으로 출력한다.
    • 스크립트릿
      HashMap으로 형변환을 해주고 getAttribute로 baseball을 가져온 다음 get으로 samsung인 Key값을 가져오면 출력된다.
      EL
      baseball.samsung으로 출력한다.

     

    4. JSTL(JSP Standard Tag Library)

    JSP에서 사용 가능한 표준 태그 라이브러리이며 보다 편리하게 코드를 구현하고 가독성을 높일 수 있다.

    • 다양한 태그를 제공함으로서 코드를 깔끔하게하고 가독성을 높인다.
    • HTML의 코드의 복잡성을 해결하기 위해 등장하였다.
    • 간단한 로직의 구사(변수 선언, if, for문)
    • 다른 JSP 페이지 호출(<c:redirect>, <c:import>)
    • 날짜, 시간, 숫자의 포맷
    • Tomcat lib 폴더에 라이브러리를 추가하여야 한다.
    • core 태그와 fmt 태그로 기능이 나뉜다.

     

     

    JSTL 예제(CORE)

    • 라이브러리를 추가했다는 전제 하에 <%@ taglib %>에 위의 내용을 추가하여 사용한다. prefix = “c” 는 태그에서 사용할 접두사 역할을 한다.

     

    • set은 setAttribute와 동일한 역할을 수행하며 vard에 변수 이름, value에는 저장할 값을 나타낸다.
    • out은 value에 변수 이름을 선언하여 출력해주는 역할을 한다.

     

    • 횟수가 정해져 있을 때 foreach문의 경우 begin과 end값을 선언한다.
    • 구구단의 경우 1부터 9까지 정해져 있기 때문에 해당 foreach문을 사용하여 <li>를 이용하여 출력한다.

     

    • 횟수가 정해져 있지 않을 때 foreach문의 경우는 대체적으로 LIST객체에 담겨져있는 값을 출력할 때 사용하게 된다.
    • list에 값이 있다는 가정 하에 생성된 list를 foreach로 출력한다.
    • var은 <c:set var>에서 배웠듯 변수를 정할 때 사용한다. item은 집합체를 선언할 때 사용한다. 그래서 setAttribute한 list를 담는다.
    • 그리고 테이블 별로 m에 넣은 list들을 하나씩 출력하면 되겠다.

     

    • redirect는 response.sendRedirect() 메소드와 동일한 기능을 제공한다.
    • url에는 이동할 경로를 넣어주면 이동한다.
    • param은 해당 parameter값을 가져가는 역할을 한다.
    • fruit의 name을 가진 orange를 url 주소로 함께 가져간다.

     

    • set으로 fruit 변수에 parameter.fruit를 저장한다.
    • if문은 test에 조건식을 명시해준다. 그리고 해당 예시에서는 out으로 출력했지만 다른 조건에 맞는 출력을 해도 되겠다. 여기서 조건은 fruit가 apple이면 fruit를 출력하지만 orange이기 때문에 출력되지 않는다.
    • <c:if>에서는 else를 따로 사용할 수가 없다. 그래서 존재하는 것이 <c:choose>이다.

     

    • choose when을 사용하면 if else문을 사용할 수 있다.
    • when test에 조건절을 사용하여 if문을 작성하고 choose 내부에 다른 when을 사용하여 else if를 나타낸다. 그리고 otherwise를 통해 else를 나타낸다.
    • 여기선 fruit를 orange로 param을 넘겼기 때문에 else if에 해당되는 두 번째 when절에서 출력이 된다.

     

     

    JSTL 예제(FMT)

    • prefix에 fmt를 선언하여 사용할 세팅을 한다.

     

    • 현재 날짜와 비교하기 위하여 set으로 현재 시간을 선언하였다.
    • formatDate로 pattern을 설정하여 출력이 가능하다.

     

    • formatNumber로 type과 currencySymbol을 주어 숫자 단위를 정할 수 있다.

    • 각 value에 소숫점을 나타낼 숫자, 퍼센트을 선언한다.
    • pattern은 #에는 표시할 숫자를, 0으로 소숫점 자리수를 나타낸다.
    • type에는 percent를 선언하여 %로 출력되게 선언한다.

     

    5. Filter(필터)

    말그래도 여과기의 역할을 한다.

    • package에 filter로 생성하여 webFilter를 통해 filter를 적용시킬 파일의 경로를 선정한다.
    • 코드의 중복을 최소화 시키고 유지보수를 편리하게 할 수 있게 도와준다.

     

    • 초기화된 필터는 웹 브라우저와 웹 컴포넌트 사이에 위치하게 된다.
    • 웹 브라우저가 웹 컴포넌트를 호출했을 때 대신 필터가 호출될 것이고, 필터는 필요한 사전작업을 수행한 다음에 웹 컴포넌트를 호출할 것이다.

     

    • 총 세개의 메소드로 init은 객체 초기화시, destroy는 종료할 때, doFilter는 직접적으로 호출되는 메소드이다.
    • FilterChain은 Chain으로 Filter를 묶어줘서 여러가지 여과를 할 수 있도록 해준다.

     

    Filter 예제

    login이 되었을 때 공통적으로 name을 확인하여 login이 되었는지 확인하는 코드가 중복되는 상황이다.

     

    • setAttribute한 name을 name에 담고 null이면 다시 loginForm.jsp로 넘기는 코드가 중복되고 있다.
    • 로그아웃의 경우 session을 없애야 하기 때문에 invaldate()는 남긴다.

     

    • 위의 중복되는 코드들을 한 번에 filter하기 위해 doFilter메소드에 동일한 코드를 작성할 것이다.
    • 여기서 중요한 점은 jsp과 servlet의 request와 response는 달라서 HTTP session을 새로 생성해주어야 한다.
    • 그래서 각각의 request와 response를 새로운 변수에 선언하고 HttpSession을 getSession하여 생성해준다.
    • 그리고 중복된 코드를 doFilter 메소드 안에 선언해준다.
    • 여기서 중요한 부분은 @WebFilter의 경로를 해당 코드에 맞게 선언해주어야 한다.

    오늘 교육 간 느낀점

    오늘은 지금까지 배웠던 것을 단순화 하는 것을 중점적으로 배웠다. 기존에 복잡하고 불편하게 해왔던 코드들을 EL, JSTL을 통하여 보다 간편하고 가독성 높게 코드를 작성할 수 있었고 filter를 통해서 코드를 단순화 하여 유지보수가 쉽게끔 만드는 실습도 해보았다.

    사실 오늘 배우기 전 내용을 공부하면서 꼭 이렇게까지 코딩을 해서 표현을 해야하나라는 생각을 가지고 있었는데 마침 오늘 궁금증들을 싹 해결하는 시간이 된 것 같다.

     

    또한 쿠키와 세션을 배웠는데 평소에 인터넷 사용하면서 쿠키의 대략적인 역할과 삭제할 줄만 알았지 직접 구현을 해보니 감회가 새로웠다.

     

    계속 생각할 것이 많아지다 보니 머리는 아프지만 서서히 완성되어가는 과정이라 점점 더 흥미가 붙고 빨리 다음 내용을 배워서 적용해보고싶다는 마음이 들었다.

     

    내일이면 JSP의 내용들이 끝나는데 어려운 내용인 MVC를 한다고 해서 조금 걱정이지만 배워서 빨리 내 게시판만들기에 적용해보고싶다!
    내일도 화이팅!

    댓글