[java] Guice와 서블릿 로그인 처리 방법

Guice는 자바 의존성 주입(Dependency Injection) 프레임워크로, 객체간의 의존관계를 관리하는 것을 도와줍니다. 이번 포스트에서는 Guice를 사용하여 서블릿에서 로그인 처리를 구현하는 방법을 알아보겠습니다.

1. Guice 설정

먼저, 프로젝트에 Guice를 추가해야 합니다. pom.xml 파일에 다음 의존성을 추가해주세요.

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.2.3</version>
</dependency>

2. 로그인 서블릿 구현

다음으로, 로그인을 처리할 서블릿을 구현해야 합니다. 아래는 간단한 예시입니다.

import com.google.inject.Inject;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Inject
    private LoginService loginService;

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if (loginService.login(username, password)) {
            // 로그인 성공 시 처리
        } else {
            // 로그인 실패 시 처리
        }
    }
}

위 코드에서 LoginService는 실제 로그인 처리를 담당하는 클래스입니다. 이를 의존관계 주입(Dependency Injection)을 통해 사용하기 위해 @Inject 어노테이션을 사용합니다.

3. 로그인 서비스 구현

로그인 처리를 담당하는 LoginService 클래스를 구현해야 합니다. 이 클래스는 Guice를 통해 관리되기 때문에, 의존성을 주입해주어야 합니다. 예를 들어, 데이터베이스와 연결하거나 외부 API를 사용하는 경우 해당 의존성을 주입할 수 있습니다. 아래는 간단한 예시입니다.

public class LoginServiceImpl implements LoginService {

    private final UserRepository userRepository;

    @Inject
    public LoginServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public boolean login(String username, String password) {
        User user = userRepository.findByUsername(username);
        if (user != null && user.getPassword().equals(password)) {
            return true;
        }
        return false;
    }
}

위 코드에서 LoginServiceImpl 클래스는 UserRepository를 의존합니다. 이 의존성은 Guice를 통해 주입되며, @Inject 어노테이션으로 표시합니다.

4. Guice 모듈 구현

마지막으로, Guice 모듈을 구현해야 합니다. 이 모듈은 의존성을 관리하고 객체를 생성하는 역할을 합니다. 아래는 간단한 예시입니다.

public class AppModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(LoginService.class).to(LoginServiceImpl.class);
    }
}

위 코드에서 AppModule 클래스는 LoginService 인터페이스와 LoginServiceImpl 클래스를 연결(bind)합니다. 즉, LoginService 인터페이스의 구현체로 LoginServiceImpl을 사용하도록 지정합니다.

5. Guice 설정 적용

마지막으로, Guice 설정을 적용해야 합니다. 서블릿 컨텍스트 초기화 시, Guice의 ServletModule 클래스를 사용하여 모듈을 설정해야 합니다. 아래는 간단한 예시입니다.

public class MyServletConfig extends GuiceServletContextListener {

    @Override
    protected Injector getInjector() {
        return Guice.createInjector(new ServletModule() {
            @Override
            protected void configureServlets() {
                serve("/login").with(LoginServlet.class);
            }
        }, new AppModule());
    }
}

위 코드에서 MyServletConfig 클래스는 Guice의 GuiceServletContextListener를 상속받아 구현합니다. getInjector 메서드를 오버라이드하여 Guice의 Injector 객체를 반환하도록 합니다. 이를 통해 Guice 설정이 적용됩니다.

이제, 서블릿에서 Guice를 통한 의존성 주입을 사용하여 로그인 처리를 할 수 있게 되었습니다. Guice를 사용하면 의존성 관리가 용이해지고 유지보수가 편리해집니다.

참고: