1. 개요

 일반적으로 Spring 데이터 애플리케이션에서 작업할 때 EntityManager 에 직접 액세스할 필요가 없습니다  . 그러나 때로는 예를 들어 사용자 지정 쿼리를 만들거나 엔터티를 분리하기 위해 액세스해야 할 수 있습니다.

이 짧은 예제에서는 Spring Data Repository 를 확장하여 EntityManager 에 액세스하는 방법을 살펴봅니다 .

2. 스프링 데이터로 EntityManager 에 액세스

예를 들어 내장 JpaRepository 를 확장하는 사용자 지정 저장소를 생성하여 EntityManager 를 가져올 수 있습니다 .

먼저  예를 들어 데이터베이스에 저장하려는 사용자에 대해 Entity 를 정의해 보겠습니다.

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String email;
    // ...
}

JpaRepository 에서 EntityManager직접 액세스할 수 없습니다 . 그러므로 우리는 우리 자신을 창조해야 합니다.

사용자 지정 find 메서드를 사용하여 하나를 만들어 보겠습니다.

public interface CustomUserRepository {
    User customFindMethod(Long id);
}

@PeristenceContext 를 사용 하여 구현 클래스에 EntityManager 를 주입할 수 있습니다 .

public class CustomUserRepositoryImpl implements CustomUserRepository {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public User customFindMethod(Long id) {
        return (User) entityManager.createQuery("FROM User u WHERE u.id = :id")
          .setParameter("id", id)
          .getSingleResult();
    }
}

마찬가지로 @PersistenceUnit 어노테이션 을 사용할 수 있습니다. 이 경우 EntityManagerFactory 에 액세스하고 여기에서 EntityManager 에 액세스합니다 .

마지막으로 JpaRepositoryCustomRepository 를 모두 확장 하는 저장소 를 생성해 보겠습니다 .

@Repository
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}

또한 Spring Boot 애플리케이션을 만들고 테스트하여 모든 것이 연결되어 있고 예상대로 작동하는지 확인할 수 있습니다.

@SpringBootTest(classes = CustomRepositoryApplication.class)
class CustomRepositoryUnitTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void givenCustomRepository_whenInvokeCustomFindMethod_thenEntityIsFound() {
        User user = new User();
        user.setEmail("foo@gmail.com");
        user.setName("userName");

        User persistedUser = userRepository.save(user);

        assertEquals(persistedUser, userRepository.customFindMethod(user.getId()));
    }
}

3. 결론

이 기사에서는 Spring Data 애플리케이션에서 EntityManager 에 액세스하는 간단한 예를 살펴보았습니다 .

커스텀 리포지토리에서 EntityManager 에 액세스할 수 있으며 기능을 확장하여 Spring 데이터 리포지토리를 계속 사용할 수 있습니다.

항상 그렇듯이 이러한 예제의 코드는 GitHub 에서 사용할 수 있습니다 .

Persistence footer banner