[java] Guice와 JPA의 데이터 엑세스 객체(DAO) 개발

Guice와 JPA를 함께 사용하여 데이터 엑세스 객체(DAO)를 개발하는 방법을 살펴보겠습니다.

1. Guice와 JPA 설정하기

먼저, Guice와 JPA를 사용하기 위해 다음과 같이 설정해야 합니다.

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        // JPA 관련 설정
        bind(EntityManagerFactory.class).toProvider(PersistenceProvider.class).in(Singleton.class);
        bind(EntityManager.class).toProvider(EntityManagerProvider.class).in(RequestScoped.class);
        
        // DAO 클래스 바인딩
        bind(UserDao.class).to(UserDaoImpl.class).in(Singleton.class);
        // 다른 DAO 클래스도 바인딩
    }
}

위의 예제에서는 MyModule 클래스를 사용하여 Guice의 설정을 정의하였습니다. JPA와 관련된 설정과 DAO 클래스의 바인딩이 이루어집니다.

2. DAO 인터페이스 정의

다음으로, DAO 인터페이스를 정의합니다.

public interface UserDao {
    User findById(Long id);
    List<User> findAll();
    void save(User user);
    void update(User user);
    void delete(User user);
}

위의 예제에서는 UserDao 인터페이스에 데이터 엑세스에 필요한 메서드들을 선언하였습니다.

3. DAO 구현 클래스 작성

인터페이스를 구현하는 DAO 구현 클래스를 작성합니다.

public class UserDaoImpl implements UserDao {
    
    @Inject
    private EntityManager em;
    
    public User findById(Long id) {
        return em.find(User.class, id);
    }
    
    public List<User> findAll() {
        TypedQuery<User> query = em.createQuery("SELECT u FROM User u", User.class);
        return query.getResultList();
    }
    
    public void save(User user) {
        em.persist(user);
    }
    
    public void update(User user) {
        em.merge(user);
    }
    
    public void delete(User user) {
        em.remove(user);
    }
}

위의 예제에서는 UserDao 인터페이스를 구현한 UserDaoImpl 클래스를 작성하였습니다. Guice를 사용하여 EntityManager를 주입받아 JPA를 이용하여 데이터베이스에 접근하는 코드가 포함되어 있습니다.

4. Guice를 통한 DAO 사용

마지막으로, Guice의 Injector를 이용하여 DAO를 사용하는 예제를 살펴보겠습니다.

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new MyModule());
        UserDao userDao = injector.getInstance(UserDao.class);
        
        // DAO 사용 예제
        User user = new User("John Doe", "john@example.com");
        userDao.save(user);
        
        User retrievedUser = userDao.findById(1L);
        
        System.out.println("Retrieved User: " + retrievedUser.getName());
    }
}

위의 예제에서는 Guice.createInjector 메서드를 이용하여 Injector를 생성하고, UserDao 인터페이스를 통해 DAO를 얻어온 후 데이터 엑세스를 수행하는 예제입니다.

결론

이상으로 Guice와 JPA를 함께 사용하여 데이터 엑세스 객체(DAO)를 개발하는 방법에 대해 알아보았습니다. Guice를 사용하면 의존성 주입을 통해 객체를 생성하고 관리할 수 있으며, JPA를 이용하여 데이터베이스와의 연동을 간편하게 처리할 수 있습니다.