[java] Guice를 이용한 Java 서블릿에서 인코딩(Encoding) 설정하기

웹 애플리케이션을 개발할 때, 사용자의 요청과 응답에 대한 인코딩 설정은 매우 중요합니다. 올바른 인코딩 설정은 사용자가 데이터를 제대로 입력하고 결과를 받을 수 있도록 보장해줍니다. 이번 블로그 포스트에서는 Guice를 사용하여 Java 서블릿에서 인코딩을 설정하는 방법에 대해 알아보겠습니다.

Guice란?

Guice는 Java에서 의존성 주입(Dependency Injection)을 적용하는 데 사용되는 경량급 프레임워크입니다. Guice를 사용하면 객체 간의 의존성을 효율적으로 관리하고, 모듈화된 구조로 애플리케이션을 구성할 수 있습니다. Guice는 코드의 가독성과 유지보수성을 향상시키면서, 결합도를 낮추는 장점을 제공합니다.

Guice를 사용하여 서블릿 인코딩 설정하기

  1. 의존성 추가

    프로젝트의 pom.xml 파일에 다음 의존성을 추가합니다:

    <dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>4.2.3</version>
    </dependency>
    
  2. Guice 모듈 생성

    Guice의 모듈을 생성하여 인코딩 설정을 정의합니다. 다음과 같이 EncodingModule 클래스를 작성합니다:

    import com.google.inject.AbstractModule;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.Filter;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.FilterRegistration;
    
    @WebListener
    public class EncodingModule extends AbstractModule {
    
        @Override
        protected void configure() {
            bind(ServletContextListener.class).to(EncodingListener.class);
            bind(Filter.class).to(EncodingFilter.class);
        }
       
    }
    
  3. 인코딩 리스너 작성

    Guice 모듈에서 참조하는 EncodingListener 클래스를 작성합니다. 다음과 같이 contextInitialized 메서드에서 인코딩을 설정합니다:

    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    @WebListener
    public class EncodingListener implements ServletContextListener {
    
        @Override
        public void contextInitialized(ServletContextEvent event) {
            event.getServletContext().setRequestCharacterEncoding("UTF-8");
            event.getServletContext().setResponseCharacterEncoding("UTF-8");
        }
    
        // ...
    }
    
  4. 인코딩 필터 작성

    Guice 모듈에서 참조하는 EncodingFilter 클래스를 작성합니다. 다음과 같이 doFilter 메서드에서 인코딩을 설정합니다:

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class EncodingFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    
        // ...
    }
    
  5. Guice ServletModule 설정

    웹 애플리케이션의 web.xml 파일에 Guice의 ServletModule을 설정합니다. 다음과 같이 GuiceServletConfig 클래스를 작성합니다:

    import com.google.inject.servlet.GuiceServletContextListener;
    import com.google.inject.servlet.ServletModule;
    
    public class GuiceServletConfig extends GuiceServletContextListener {
    
        @Override
        protected Injector getInjector() {
            return Guice.createInjector(new ServletModule() {
                @Override
                protected void configureServlets() {
                    install(new EncodingModule());
                    // 다른 모듈 등록
                }
            });
        }
    
    }
    

여기까지 진행하면 Guice를 사용하여 Java 서블릿에서 인코딩 설정이 완료됩니다. Guice는 의존성 주입을 통해 필요한 클래스를 인스턴스화하고, 필터와 리스너를 자동으로 등록해주기 때문에 편리하게 인코딩 설정을 할 수 있습니다. 이를 통해 웹 애플리케이션의 인코딩 설정 관리를 더욱 효과적으로 할 수 있습니다.

마무리

이번 포스트에서는 Guice를 이용하여 Java 서블릿에서 인코딩 설정하는 방법에 대해 알아보았습니다. Guice는 간편한 의존성 주입을 통해 인코딩 관련 필터와 리스너를 등록하여 웹 애플리케이션의 인코딩 설정을 관리할 수 있도록 도와줍니다. 이를 통해 사용자에게 더 편리하고 안정적인 서비스를 제공할 수 있습니다.

참고 문서:

import com.google.inject.AbstractModule;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.FilterRegistration;

@WebListener
public class EncodingModule extends AbstractModule {

   @Override
   protected void configure() {
       bind(ServletContextListener.class).to(EncodingListener.class);
       bind(Filter.class).to(EncodingFilter.class);
   }

}

@WebListener
public class EncodingListener implements ServletContextListener {

   @Override
   public void contextInitialized(ServletContextEvent event) {
       event.getServletContext().setRequestCharacterEncoding("UTF-8");
       event.getServletContext().setResponseCharacterEncoding("UTF-8");
   }

}

@WebFilter("/*")
public class EncodingFilter implements Filter {

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       request.setCharacterEncoding("UTF-8");
       response.setCharacterEncoding("UTF-8");
       chain.doFilter(request, response);
   }

}
import com.google.inject.AbstractModule;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.Filter;
import javax.servlet.annotation.WebFilter;
import javax.servlet.FilterRegistration;

@WebListener
public class EncodingModule extends AbstractModule {

   @Override
   protected void configure() {
       bind(ServletContextListener.class).to(EncodingListener.class);
       bind(Filter.class).to(EncodingFilter.class);
   }

}

@WebListener
public class EncodingListener implements ServletContextListener {

   @Override
   public void contextInitialized(ServletContextEvent event) {
       event.getServletContext().setRequestCharacterEncoding("UTF-8");
       event.getServletContext().setResponseCharacterEncoding("UTF-8");
   }

}

@WebFilter("/*")
public class EncodingFilter implements Filter {

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
       request.setCharacterEncoding("UTF-8");
       response.setCharacterEncoding("UTF-8");
       chain.doFilter(request, response);
   }

}