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 에 액세스합니다 .
마지막으로 JpaRepository 와 CustomRepository 를 모두 확장 하는 저장소 를 생성해 보겠습니다 .
@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 에서 사용할 수 있습니다 .