CHAP.11 λ¦¬μŠ€λ„ˆμ™€ ν•„ν„°

1. λ¦¬μŠ€λ„ˆ

λ¦¬μŠ€λ„ˆλž€?

  • λ¦¬μŠ€λ„ˆ(Listener)
    • μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ°œμƒν•˜λŠ” 이벀트λ₯Ό λͺ¨λ‹ˆν„°λ§ν•˜λ‹€κ°€ νŠΉμ • μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄ μ‹€ν–‰λ˜λŠ” νŠΉμˆ˜ν•œ μ„œλΈ”λ¦Ώ, EventListner라고도 함
    • μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 싀행에 ν•„μš”ν•œ 정보λ₯Ό μ œκ³΅ν•˜κ±°λ‚˜ ν†°μΊ£ μ‹œμž‘/μ’…λ£Œμ™€ 같은 νŠΉμ • 상황에 μžλ™μœΌλ‘œ λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•  λ•Œ μ‚¬μš©
    • λ¦¬μŠ€λ„ˆλŠ” 일반적인 ν˜•νƒœμ˜ μ„œλΈ”λ¦Ώμ΄ μ•„λ‹ˆλΌ νŠΉμ • μ΄λ²€νŠΈμ— 따라 λ™μž‘ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀
    • λ¦¬μŠ€λ„ˆκ°€ λ™μž‘ν•˜κΈ° μœ„ν•œ 이벀트의 μ’…λ₯˜μ™€ 그에 λ”°λ₯Έ ν”„λ‘œκ·Έλž¨ APIλ₯Ό μ•Œμ•„μ•Ό 함
  • λ¦¬μŠ€λ„ˆμ˜ λ™μž‘κ΅¬μ‘°
    • 기본적으둜 생λͺ… μ£ΌκΈ° 변화와 Scope Objectμ—μ„œ κ΄€λ¦¬ν•˜λŠ” μ†μ„±μ˜ λ³€ν™”λ₯Ό λͺ¨λ‹ˆν„°λ§ ν•˜κ³  ν•΄λ‹Ή μ΄λ©˜νŠΈκ°€ λ°œμƒν•˜λ©΄ μ‹€ν–‰λ˜λŠ” ꡬ쑰

    Servletκ³Ό JSPμ—μ„œλŠ” Page, Request, Sesscion, Application의 4κ°€μ§€ μŠ€μ½”ν”„κ°€ μžˆλ‹€.

    • ex) ServletContext: μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ λ‹¨μœ„λ‘œ μƒμ„±λ˜λŠ” 객체둜, 보톡 ν†°μΊ£μ˜ μ‹œμž‘κ³Ό μ’…λ£Œμ™€ μΌμΉ˜ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μ‹œμ μ— 싀행을 μ›ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ μžˆλ‹€λ©΄ λ¦¬μŠ€λ„ˆλ‘œ κ΅¬ν˜„ κ°€λŠ₯
  • λ¦¬μŠ€λ„ˆμ˜ λŒ€ν‘œμ μΈ μœ ν˜•
    • μ΄ˆκΈ°ν™” λ§€κ°œλ³€μˆ˜μ™€μ˜ 연동
      • 톰캣이 μ‹œμž‘λ  λ•Œ β€˜web.xmlβ€™μ˜ ServletContext μ΄ˆκΈ°ν™” λ§€κ°œλ³€μˆ˜λ₯Ό 읽어 그에 따라 νŠΉμ • 객체λ₯Ό μ΄ˆκΈ°ν™” ν•œ ν›„ μ„œλΈ”λ¦Ώμ΄λ‚˜ JSP에 제곡
    • 예제 ν”„λ‘œκ·Έλž¨ 등을 배포 ν•  λ•Œ μƒ˜ν”Œ 데이터 제곡
      • DBκ°€ ν•„μš”ν•œ 경우 미리 DB와 연결을 λ§Œλ“€μ–΄ λ‘κ±°λ‚˜, ν…Œμ΄λΈ”μ„ μƒμ„±ν•˜κ³  μƒ˜ν”Œ 데이터λ₯Ό λ‘œλ”©ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•˜μ—¬ 좔가적인 μž‘μ—… 없이 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰
    • λ³΅μž‘ν•œ ν™˜κ²½ μ„€μ • 제곡
      • ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ μ—¬λŸ¬ 정보(DB, λ‹€λ₯Έ μ„œλΉ„μŠ€ 연동 정보, κ΄€λ¦¬μž 계정 정보 λ“± ν”„λ‘œκ·Έλž¨ μ™ΈλΆ€μ—μ„œ λ³€ν•˜λŠ” 정보λ₯Ό μ£Όμž…ν•˜λŠ” ν˜•νƒœ)κ°€ κ³ μ •λ˜μ–΄ μžˆμ§€ μ•Šκ³ , μš΄μ˜ν•˜λŠ” μ„œλ²„ 상황에 따라 λ³€κ²½λ˜μ–΄μ•Ό ν•˜λŠ” 경우, 이λ₯Ό 파일둜 읽어와 JSP 및 μ„œλΈ”λ¦Ώ 등에 제곡
    • νŠΉμ • μ΄λ²€νŠΈμ— λ™μž‘ν•˜λŠ” κΈ°λŠ₯ κ΅¬ν˜„
      • μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ ν•¨κ»˜ λ™μž‘ν•΄μ•Ό ν•˜λŠ” μ™ΈλΆ€ ν”„λ‘œκ·Έλž¨μ΄λ‚˜ μ„œλΉ„μŠ€μ˜ λ™μž‘ 유무λ₯Ό ν™•μΈν•˜κ³  μžλ™μœΌλ‘œ μ‹€ν–‰
  • λ¦¬μŠ€λ„ˆμ˜ μ’…λ₯˜

    μœ ν˜• μ„€λͺ… λ¦¬μŠ€ν„° μΈν„°νŽ˜μ΄μŠ€
    ServletContext
    생λͺ…μ£ΌκΈ° λ³€ν™”
    λŒ€ν‘œμ μΈ λ¦¬μŠ€λ„ˆ 이벀트둜, ServletContext의 생성과 μ†Œλ©Έ μ‹œμ μ— λ™μž‘
    보톡 ν†°μΊ£μ˜ μ‹œμž‘ 및 μ’…λ£Œ μ‹œμ κ³Ό μΌμΉ˜ν•œλ‹€
    javax.servelt.Servelt.ContextListener
    ServletContext
    속성 λ³€ν™”
    ServletContext의 속성이 μΆ”κ°€λ˜κ±°λ‚˜ λ³€κ²½λ˜λŠ” 상황에 λ™μž‘ν•œλ‹€ javax.servlet.ServletContextAttributeListner
    Session
    생λͺ…μ£ΌκΈ° λ³€ν™”
    Session의 생성과 μ†Œλ©Έ λ“± 변화에 따라 λ™μž‘ν•œλ‹€ javax.servlet.http.HttpSessionListener
    Session
    속성 λ³€ν™”
    Session의 속성이 μΆ”κ°€λ˜κ±°λ‚˜ λ³€κ²½λ˜λŠ” 상황에 λ™μž‘ν•œλ‹€ javax.servlet.http.HttpSessionAttributeListener

λ¦¬μŠ€λ„ˆ κ·œν˜„

  • λ¦¬μŠ€λ„ˆ κ΅¬ν˜„ 방법
    • μ–΄λ…Έν…Œμ΄μ…˜μ„ μ΄μš©ν•΄ λ¦¬μŠ€λ„ˆμž„μ„ λͺ…μ‹œν•œ ν›„, μ˜€λ²„λΌμ΄λ”© 된 λ©”μ„œλ“œ μ€‘μ—μ„œ ν•„μš”ν•œ λΆ€λΆ„μ˜ μ½”λ“œ μž‘μ„±
    // λ¦¬μŠ€λ„ˆ ν΄λž˜μŠ€μž„μ„ μ»¨ν…Œμ΄λ„ˆμ— 전달
    @WebListener 
    public class ListenerExam implements ServletContectListener{
      // ServletContext μ‹œμž‘
      public void contextIniitialized(servletContextEvent sce){
        sce.getServletContext().log("ServletContext μ‹œμž‘λ¨!!");
      }
      ...
    }
    

2. ν•„ν„°

ν•„ν„°λž€?

  • ν•„ν„°(Filter)
    • μ„œλΈ”λ¦Ώ ν•„ν„°(Servlet Filter)라고도 ν•˜λ©°, λ¦¬μŠ€λ„ˆμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ§€μ›ν•˜κΈ° μœ„ν•œ νŠΉμˆ˜ν•œ ν˜•νƒœμ˜ μ„œλΈ”λ¦Ώ
    • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ— 따라 μ„œλΈ”λ¦Ώμ΄λ‚˜ JSPκ°€ μ‹€ν–‰λ˜κΈ° 전에 response ν˜Ήμ€ request 객체의 μ‘°μž‘μ΄λ‚˜ 좔가적인 처리
    • ν•„ν„°λŠ” 기본적으둜 νŠΉμ • μš”μ²­μ—λ§Œ λ™μž‘ν•˜λ©°, μ—¬λŸ¬κ°œμ˜ ν•„ν„°κ°€ μ •ν•΄μ§„ μˆœμ„œμ— 따라 배치될 수 μžˆλŠ”λ° ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ 처리 이전에 λ¨Όμ € 싀행됨
  • ν•„ν„°μ˜ λŒ€ν‘œμ  ν™œμš© λΆ„μ•Ό
    • 인증(Authentication)
      • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ쑰와 상관없이 κΈ°μ‘΄ μ†ŒμŠ€λ₯Ό μ΅œλŒ€ν•œ μˆ˜μ •ν•˜μ§€ μ•Šκ³  인증 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λ„λ‘ ν•  수 있음
    • λ‘œκΉ…/감사(Logging and Auditing)
      • νŠΉμ • νŽ˜μ΄μ§€ λ˜λŠ” κΈ°λŠ₯에 λŒ€ν•΄ μ‚¬μš© ν˜„ν™©μ„ λͺ¨λ‹ˆν„°λ§ ν•˜κ³  둜그둜 관리할 ν•„μš”κ°€ μžˆμ„ λ•Œ ν•„ν„°λ₯Ό 톡해 ν•΄λ‹Ή μš”μ²­μ„ μˆ˜ν–‰ν•˜κΈ° μ „ λ‘œκΉ… 처리
    • κ΅­μ œν™”(Localization)
      • λ‹€κ΅­μ–΄ μ²˜λ¦¬λŠ” ν”„λ ˆμž„μ›Œν¬ λ“±μ—μ„œ μ œκ³΅ν•˜λŠ” κ΅­μ œν™” 방법을 μ²˜λ¦¬ν•˜κ±°λ‚˜, ν•„ν„°λ₯Ό μ΄μš©ν•˜μ—¬ νŠΉμ • νŽ˜μ΄μ§€μ— λ“€μ–΄κ°ˆ λ©”μ‹œμ§€ 등을 ν•΄λ‹Ή μ–Έμ–΄λ‘œ λ³€ν™˜ν•˜μ—¬ 전달
    • ν•œκΈ€ 인코딩 처리(Encoding)
      • ν•„ν„°λ₯Ό 톡해 ν•œλ²ˆμ— ν•œκΈ€ 인코딩 μ²˜λ¦¬ν•˜λŠ” 방법

ν•„ν„°μ˜ ꡬ쑰와 λ™μž‘ κ³Όμ •

  • ν•„ν„°μ˜ ꡬ쑰
    • λ¦¬μŠ€λ„ˆμ™€ μœ μ‚¬ν•œ ꡬ쑰둜, ν•„ν„°λŠ” ν†°μΊ£ μ„œλ²„λ₯Ό μ‹œμž‘ν•  λ•Œ ν•„ν„° κ΅¬ν˜„ 클래슀의 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ°Έμ‘°ν•˜μ—¬ javax.servlet.FilterμΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀 μ΄ˆκΈ°ν™”
    • ν•„ν„°λŠ” μ—¬λŸ¬κ°œ 쑴재 ν•  수 있으며, 각각의 ν•„ν„°λŠ” init() λ©”μ„œλ“œλ₯Ό 톡해 μ΄ˆκΈ°ν™”
      1. init()
      • ν•„ν„° μ΄ˆκΈ°ν™” μ‹œ ν•œλ²ˆλ§Œ μ‹€ν–‰, μ‚¬μš©μž μš”μ²­μ— 따라 μ„œλΈ”λ¦Ώμ΄λ‚˜ JSPκ°€ 호좜될 λ•Œ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ„€μ •λœ ν•„ν„° λ§€ν•‘ 정보λ₯Ό μ°Έμ‘°ν•΄ νŠΉμ • μ„œλΈ”λ¦Ώμ΄λ‚˜ JSP에 λŒ€ν•΄ μ„œλ‘œ λ‹€λ₯Έ ν•„ν„° 적용 κ°€λŠ₯
        1. doFilter()
      • ν•΄λ‹Ή ν•„ν„°κ°€ μ μš©λ˜μ—ˆμ„ λ•Œ μˆ˜ν–‰ν•  μž‘μ—…μ„ κ΅¬ν˜„ν•˜λŠ” 메인 λ©”μ†Œλ“œ
        1. destroy()
      • ν•„ν„°κ°€ μ’…λ£Œλ  λ•Œ μˆ˜ν–‰ν•  λ‚΄μš© κ΅¬ν˜„
  • ν•„ν„°μ˜ λ™μž‘ ꡬ쑰
    • 각 ν•„ν„°μ˜ doFilter() λ©”μ„œλ“œμ˜ λ‚΄μš©μ΄ μˆ˜ν–‰λ˜λ©°, ServletRequest와 ServletResponse의 λ‚΄μš©μ„ κ°€λ‘œμ±„ ν•„μš”ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ³  λ‹€μŒ ν•„ν„°λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜, μš”μ²­ν•œ μ„œλΈ”λ¦ΏμœΌλ‘œ 이동

ν•„ν„° κ΅¬ν˜„

  • ν•„ν„° κ΅¬ν˜„
    • @WebFilter μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•΄ ν•„ν„°μž„μ„ μ•Œλ¦¬κ³  μ„œλΈ”λ¦Ώκ³Ό μœ μ‚¬ν•˜κ²Œ ν•„ν„° μš”μ²­μ„ μœ„ν•œ url λ§€ν•‘ 정보λ₯Ό 인자둜 μΆ”κ°€
    • μžλ™ μƒμ„±λ˜λŠ” μ˜€λ²„λΌμ΄λ”© λ©”μ†Œλ“œλŠ” ν•„μš”ν•œ λΆ€λΆ„λ§Œ κ΅¬ν˜„
      • ν•„ν„° 자체의 생λͺ…μ£ΌκΈ° λ©”μ„œλ“œκ°€ ν¬ν•¨λ˜μ–΄ 있고, μ‹€μ œλ‘œ ν•„ν„°κ°€ λ™μž‘ν•  λ•ŒλŠ” doFilter() λ©”μ„œλ“œ 호좜
      // ν•„ν„°μž„μ„ μ•Œλ¦Ό
      @WebFilter("/EncodingFilter")
      public class EncodingFilter implements Filter{
        ...
        public void doFilter(ServletRequest request, ServelResponse response, FilterChain chain) 
        throws IOexception, ServletException{
          ...
          chain.doFilter(request,response);
        }
      }
      
  • μ—¬λŸ¬ 개의 ν•„ν„°λ₯Ό μˆœμ„œλŒ€λ‘œ μ μš©ν•˜κΈ°
    • μ—¬λŸ¬κ°œμ˜ ν•„ν„°λ₯Ό μ°¨λ‘€λŒ€λ‘œ μ μš©ν•˜λ €λ©΄ μ–΄λ…Έν…Œμ΄μ…˜ λ§ŒμœΌλ‘œλŠ” λΆˆκ°€λŠ₯
      • μ–΄λ…Έν…Œμ΄μ…˜μ— μ˜ν•œ ν•„ν„° 싀행은 νŠΉμ • url λ§€ν•‘ 쑰건에 따라 μ΄λ£¨μ–΄μ§€λŠ” κ²ƒμœΌλ‘œ μ‹€ν–‰ μˆœμ„œλ₯Ό μ‘°μ • ν•  수 μ—†μŒ
    • ν•„ν„°μ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό μ§€μ •ν•˜κΈ° μœ„ν•΄μ„œλŠ” web.xml νŒŒμΌμ— ν•„ν„°λ₯Ό 등둝
      • ν•„ν„° μ„œλΈ”λ¦Ώμ˜ @WebFilterμ—λŠ” url λ§€ν•‘ λŒ€μ‹  filterName 속성이 λ“€μ–΄κ°€μ•Ό 함
    @WebFilter(filterName="filterOne")
    public class FirstFilter implements Filter{
      ...
    }
    
  • web.xml에 ν•„ν„°λ₯Ό λ“±λ‘ν•˜λŠ” μ½”λ“œμ˜ μ˜ˆμ‹œ
    • web.xml이 잘λͺ»λ˜λ©΄ μ„œλ²„κ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜μ§€ μ•Šμ„ 수 μžˆμœΌλ―€λ‘œ 주의 ν•„μš”
    <!-- <filter/> μš”μ†ŒλŠ” μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μžλ°” 필터와 λ§€κ°œλ³€μˆ˜λ₯Ό μ„€μ •ν•˜λŠ”λ° μ‚¬μš© -->
    <filter>
      <!-- ν•„ν„° 이름 μ„€μ • -->
      <filter-name>...</filter-name> 
      <!-- μžλ°” 클래슀 이름 μ„€μ • -->
      <filter-class>...</filter-class>
      <!-- λ§€κ°œλ³€μˆ˜μ™€ 값을 μ„€μ • -->
      [<init-param>
        <param-name>...</param-name>
        <param-value>...</param-value>
      </init-param>]
    </filter>
    <filter-mapping>
      <!-- ν•„ν„° 이름을 μ„€μ • -->
      <filter-name>...</filter-name>
      <!-- URL νŒ¨ν„΄μ„ μ„€μ • -->
      <url-pattern>...</url-pattern>
    </filter-mapping>
    

web.xml파일의 ν•„ν„° ꡬ성

  • <init-param></init-param>
    • μ„€μ •λœ λ§€κ°œλ³€μˆ˜μ™€ 값을 μžλ°” or JSP μ½”λ“œμ—μ„œ μ ‘κ·Ό
    String value = getServletConfig().getInitParameter("λ§€κ°œλ³€μˆ˜μ΄λ¦„");
    
    • [<filter/>μš”μ†Œ μ‚¬μš© μ˜ˆμ‹œ: 필터이름 myFilter와 클래슀 이름 LoggingFilter μ„€μ •]
    <filter>
      <filter-name>myFilter</filter-name>
      <filter-class>ch12.com.filter.LoggingFilter</filter-class>
    </filter>
    
    • [<filter/>μš”μ†Œ μ‚¬μš© 예: paramκ³Ό κ°’ admin μ„€μ •]
    <filter>
      <filter-name>Myfilter</filter-name>
      <filter-class>ch12.com.filter.LoggingFilter</filter-class>
      <init-param>
        <param-name>param</param-name>
        <param-value>admin</param-value>
      </init-param>
    </filter>
    
  • <filter-mapping></filter-mapping>
    • νŠΉμ • λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄ μ–΄λ–€ ν•„ν„°λ₯Ό μ‚¬μš©ν•  μ§€ μ„€μ •ν•˜λŠ” 데 μ‚¬μš©
    <filter-mapping>
      <filter-name>ν•„ν„° 이름</filter-name>
      <url-pattern>μš”μ²­ URL νŒ¨ν„΄</url-pattern>
    </filter-mapping>
    
    • [<filter-mapping/>μš”μ†Œ μ‚¬μš© 예: URL νŒ¨ν„΄μ„ /*둜 μ„€μ •]
    <filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    • [<filter-mapping/>μš”μ†Œ μ‚¬μš© 예: URL νŒ¨ν„΄μ„ /ch12/filter.jsp둜 μ„€μ •]
    <filter-mapping>
      <filter-name>MyFilter</filter-name>
      <url-pattern>/ch12/filter.jsp</url-pattern>
    </filter-mapping>
    
  • ν•„ν„°λ‘œ form νŽ˜μ΄μ§€μ—μ„œ μ „μ†‘λœ μš”μ²­ νŒŒλΌλ―Έν„° 처리

  • JSPBook/src/ch12/com/filter/AuthenFilter.java
public class AuthenFilter implements Filter{

  @Override
  public void init(FilterCOnfig filterConfing) throws ServletException{
    System.out.println("Filter01 μ΄ˆκΈ°ν™”");
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
  throws IOException, ServletException{
    System.out.println("Filter01.jsp μˆ˜ν–‰...");
    String name = request.getParameter("name");

    if (name == null || name.equals("")){
      response.setCharacterEncoding("UTF-8");
      response.setContentType("text/html; charset=UTF-8");
      PrintWriter writer = response.getWriter();
      String message = "μž…λ ₯된 name 값은 null μž…λ‹ˆλ‹€.";
      writer.println(message);
      return;
    }
    filterChain.doFilter(request,response);
  }

  @Override
  public void destroy(){
    System.out.println("Filter01 ν•΄μ œ...");
  }
}
  • JSPBook/WebContent/WEB-INF/web.xml
<web-app>
  ...
  <filter>
    <filter-name>Filter01</filter-name>
    <filter-class>ch12.com.filter.AuthenFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Filter01</filter-name>
    <url-pattern>/ch12/filter01_process.jsp</url-pattern>
  </filter-mapping>
</web-app>
  • JSPBook/WebContent/ch12/filter01.jsp
<%@ page contentType="text/html; charset=utf-8" %>
<html>
  <head>
    <title>Filter</title>
  </head>
  <body>
    <form method="post" action="filter01_process.jsp">
      <p>
        이름: <input type="text" name="name"/>
      </p>
      <input type="submit" value="전솑"/>
    </form>
  </body>
</html>

3. 래퍼 클래슀

래퍼 ν΄λž˜μŠ€λž€?

  • 래퍼클래슀(wrapper class) λž€ κΈ€μž κ·ΈλŒ€λ‘œ 포μž₯ν•˜λŠ” 역할을 ν•˜λŠ” 클래슀
  • 래퍼 클래슀의 μ’…λ₯˜
    • μš”μ²­ 객체λ₯Ό 포μž₯ν•˜λŠ” μš”μ²­ 래퍼 클래슀
    • 응닡 객체λ₯Ό 포μž₯ν•˜λŠ” 응닡 래퍼 클래슀
  • 두 μ’…λ₯˜μ˜ 래퍼 ν΄λž˜μŠ€λŠ” 각각 λ‹€μŒμ˜ 두 클래슀λ₯Ό μƒμ†ν•˜μ—¬ μž‘μ„±
    • javax.servlet.http.HttpServletRequestWrapper 클래슀
    • javax.servlet.http.HttpServletResponseWrapper 클래슀

μš”μ²­ 래퍼 클래슀

  • μš”μ²­ 래퍼 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 방법
    • μš”μ²­ 래퍼 ν΄λž˜μŠ€λŠ” HttpServletRequestWrapper 클래슀λ₯Ό 상속받아야 ν•˜λ―€λ‘œ λ‹€μŒκ³Ό 같은 골격을 λ§Œλ“œλŠ”κ²ƒμœΌλ‘œ 클래슀 μž‘μ„± μ‹œμž‘
    public class MyRequestWrapper extends HttpServletRequestWrapper{
      ...
    }
    
  • μš”μ²­ 래퍼 클래슀의 κ°€μž₯ 기본적인 역할인 μš”μ²­ 객체λ₯Ό 포μž₯ν•˜λŠ” 일은 μƒμ„±μžλ₯Ό 톡해 μˆ˜ν–‰
    • μš”μ²­ 객체λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” μƒμ„±μžλ₯Ό μ„ μ–Έν•˜κ³ , κ·Έ μ•ˆμ—μ„œ νŒŒλΌλ―Έν„° 값을 ν•„λ“œ(field, 클래슀의 λ§΄λ²„λ³€μˆ˜)에 μ €μž₯
    public class MyrequestWrapper extends HttpServletREquestWrapper{
      private HttpServletRequest request;
      public MyRequestWrapper(HttpServletRequest request){
        this.request = request;
      }
    }
    
    • μš”μ²­ 래퍼 클래슀의 μƒμ„±μž μ•ˆμ—μ„œλŠ” λ°˜λ“œμ‹œ HttpServletRequestWrapper 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•˜κ³ , μš”μ²­ 객체λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ„˜κ²¨μ€˜μ•Ό 함
    public class MyRequestWrapper extends HttpServletRequestWrapper{
      private HttpServletRequest request;
      public MyRequestWrapper(HttpServletRequest request){
        super(request);
        this.request = request;
      }
    }
    
    • μš”μ²­ 데이터λ₯Ό λ³€ν˜•ν•˜λŠ” 일은 μ›Ή μ»΄ν¬λ„ŒνŠΈκ°€ μž…λ ₯ 데이터λ₯Ό κ°€μ Έμ˜¬λ•Œ ν˜ΈμΆœν•˜λŠ” λ©”μ„œλ“œμ™€ λ˜‘κ°™μ€ μ‹œκ·Έλ‹ˆμ²˜μ˜ λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ κ·Έ μ•ˆμ—μ„œ μˆ˜ν–‰
      • λ‚˜μ€‘μ— μ›Ή μ»΄ν¬λ„ŒνŠΈλŠ” μž…λ ₯ 데이터λ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ 이 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³ , κ·Έ κ²°κ³Ό λ³€ν˜•λœ 데이터λ₯Ό λ°›κ²Œ 됨
    public class MyRequestWrapper extends HttpServletRequestWrapper{
      ...
      public String getParameter(String name){
        // 이곳에 HTML λ¬Έμ„œμ˜ form μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό 톡해 μž…λ ₯된 데이터λ₯Ό λ³€ν˜•ν•˜λŠ” μ½”λ“œ
      }
    }
    
    • μš”μ²­ 데이터λ₯Ό λ³€ν˜•ν•˜λŠ” λ©”μ„œλ“œλŠ” μ›Ή μ»΄ν¬λ„ŒνŠΈμ˜ κΈ°λŒ€μ— λ§žμΆ”μ–΄μ„œ μ •μ˜
      • ex) getParameter λ©”μ„œλ“œλŠ” μž…λ ₯ 데이터 이름을 νŒŒλΌλ―Έν„°λ‘œ λ°›κ³ , 그에 ν•΄λ‹Ήν•˜λŠ” 데이터 값을 리턴
      public class MyRequestWrapper extends HttpServletRequestWrapper{
      ...
      public String getParameter(String name){
        // 이곳에 HTML λ¬Έμ„œμ˜ form μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό 톡해 μž…λ ₯된 데이터λ₯Ό λ³€ν˜•ν•˜λŠ” μ½”λ“œ
        String value = request.getParameter(name);
        String newValue = value.getUpperCase();
        return newValue;
      }
      }
      
    • νŒ”ν„° 클래슀의 doFilter λ©”μ„œλ“œ μ•ˆμ—μ„œλŠ” μš”μ²­ 객체λ₯Ό μš”μ²­ 래퍼 객체 λ°”κΎΈλŠ” 일과, κ·Έ μš”μ²­ 래퍼 객체λ₯Ό κ°€μ§€κ³  chain.doFilter λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” μž‘μ—… μˆ˜ν–‰
    public class MyFilter implements Filter{
      ...
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)...{
        MyRequestWrapper requestWrapper = new MyRequestWrapper((HttpServletRequest) request);
        chain.doFilter(requestWrapper, response);
      }
    }
    

응닡 래퍼 클래슀

  • 응닡 래퍼 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” 방법
    • 응닡 래퍼 ν΄λž˜μŠ€λŠ” λ‹€μŒκ³Ό 같이 HttpServletResponseWrapper 클래슀λ₯Ό 상속 ν•˜λ„λ‘ 함
    public class MyResponseWrapper extends HttpServletResponseWrapper{
      ...
    }
    
  • 응닡 래퍼 ν΄λž˜μŠ€λ„ μš”μ²­ 래퍼 ν΄λž˜μŠ€μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ μƒμ„±μž μ•ˆμ—μ„œ 슈퍼 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ³ , 응닡 객체λ₯Ό 포μž₯ν•˜λŠ” 일 μˆ˜ν–‰

    public class MyResponseWrapper extends HttpServletResponseWrapper{
      HttpServletResponse response;
      public ParamUpperCaseResponseWrapper(HtppServletResponse response){
        super(response);
        this.response = response;
      }
    }
    

4. λ¦¬μŠ€λ„ˆ μ’…ν•© μ‹€μŠ΅

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°