반응형
1. 개요 - 레포지토리란?
레포지토리란 엔티티 클래스와 DB간 상호 작용을 추상화하고 이를 구현한 클래스이다. 레포지토리는 도메인 객체를 저장, 수정, 삭제, 조회 등의 CRUD 로직을 추상화하여 제공한다. 여기서 JPA Hibernate와 Spring Data JPA와 비교하면서 설명하겠다.
2. JPA Hibernate 레포지토리와 Spring Data JPA 레포지토리
2-1) JPA Hibernate 레포지토리
JPA Hbernate는 JPA 표준을 구현한 구현체로, EntityManager를 사용하여 개발자가 직접 구현체를 구현해야한다.
// Repository 인터페이스 - Hibernate
public interface HibernateRepo{
Optional<User> findUser(Long id);
List<User> findByUserNameAndAgeGreaterThan(String username, int age)
}
@Repository
public HibernateRepoImpl implements HibernateRepo{
@PersistanceContext
private EntityManager em;
@Overrride
Optional<User> findUser(Long id){
return Optional.ofNullable(em.find(User.class, id));
}
@Overrride
List<USer> findByUserNameAndAgeGreaterThan(String username, int age){
String sql = "select u from User u where u.username = :username and u.age = :age";
List<User> Users = em.createQuery(sql).setParameter("username", username)
.setParameter("age", age)
.getResultList();
return Users;
}
}
2-2) Spring Data JPA 레포지토리
반대로 Spring Data JPA는 JpaRepository 인터페이스를 상속받으면 해당 인터페이스는 바로 레포지토리로 사용가능하다. 개발자가 구현체를 직접 구현하지 않아도, JpaRepository 인터페이스에서 제공해주는 메서드 쿼리를 사용할 수 있고, @Query 어노테이션으로 간단한 쿼리도 직접 작성할 수 있다.
한가지 중요 팁! 레포지토리에서 직접 EntityManager의 createQuery 메서드를 사용하면 쿼리를 문자열로 직접 작성해야하기 때문에 오타가 나면 컴파일러에서 오타를 잡아낼 수 없다. 하지만 @Query 어노테이션으로 쿼리를 작성하면 오타를 컴파일러에서 잡아낼 수 있다.
public interface SdjRepo extends JpaRepository<User, Long>{
// 추가 사용자 정의 메서드 정의
@Query("select u from User u where u.username and u.age = age")
List<User> findUsers(@Param("username") String username, @Param("age") int age);
}
// SdjService 인터페이스가 있다는 가정하에
@Service
public SdjServiceImpl implements SdjService{
private final SdjRepo sdjRepo
@Autowired // 생략가능
public SdjServiceImpl(SdjRepo sdjRepo){
this.sdjRepo = sdjRepo;
}
@Override
List<User> getUserList(String username, int age){
List<User> users = sdjRepo.findUsers(username, age);
return users;
}
}
3. 마치며
JPA 공부를 하면서 알아가는 것도, 햇갈리는 것도 많이 나오는 것 같다. 레포지토리와 DAO의 차이점도 공부해야봐야겠다!
긴 글 읽어주셔서 감사합니다. 잘못된 내용이 있거나, 보충할 내용이 있다면 언제든지 댓글로 적어주시면 감사하겠습니다!
반응형
'웹 개발 공부 : Back-end > JPA' 카테고리의 다른 글
[JPA 프로젝트 회고 - 5] JPA에서 DTO를 사용하는 이유 (feat. 코드 보안을 위해 수정) (0) | 2024.08.19 |
---|---|
[JPA 프로젝트 회고 - 4] java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for ~ 에러 (0) | 2024.08.10 |
[JPA 프로젝트 회고 - 3] 영속성 컨텍스트 (Persistence Context) (0) | 2024.08.09 |
[JPA 프로젝트 회고 - 1] 엔티티 (Entity) (0) | 2024.07.24 |
[JPA] JPA vs Mybatis (0) | 2024.07.17 |