일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 이진탐색트리
- 후위 표기법
- 프로세스
- @version
- force=true
- quick-sort
- NoArgsConstructor
- 중위 표기법
- 트리
- query methods
- kruskal 알고리즘
- 쿼리메소드
- max idle time
- jparepository
- binary search
- max lifetime
- disjoint-sets
- BST
- 최대 유휴 시간
- 알고리즘
- 자료구조
- 정적 팩토리 메서드 패턴
- 낙관적 락
- JPA
- static factory method pattern
- 비관적 락
- prim 알고리즘
- 프로세스의 상태
- merge-sort
- 최대 유지 시간
Archives
- Today
- Total
Dionysus
[개념] GenericDAO 본문
✔️ 목차
🤔 GenericDAO란?
여러 엔티티에서 반복적으로 사용되는 CRUD 로직을 일반화하여 제네릭(Generic) 타입으로 추상화한 부모 클래스이다. GenericDAO라고 관례적으로 이름 붙인다. 이를 통해 각 Repository 클래스가 공통적으로 필요로 하는 기능을 중복 구현하지 않고 재사용할 수 있게 할 수 있다. 예시 코드를 살펴보자.
public abstract class GenericDAO<T, ID> {
@PersistenceContext
protected EntityManager em;
private Class<T> entityClass;
public GenericDAO(Class<T> entityClass) {
this.entityClass = entityClass;
}
public void save(T entity) {
em.persist(entity);
}
public T findById(ID id) {
return em.find(entityClass, id);
}
public void update(T entity) {
em.merge(entity);
}
public void delete(T entity) {
em.remove(em.contains(entity) ? entity : em.merge(entity));
}
}
GenericDAO를 사용하는 방법은 아래와 같다.
@Repository
public class UserDAO extends GenericDAO<User, Long> {
public UserDAO() {
super(User.class);
}
...
}
CRUD 로직을 한 곳에 정의하고 재사용 가능하며 이를 통해 여러 DAO 클래스에 걸쳐 중복 코드를 제거할 수 있다는 장점을 가진다. 그러나 동시에 공통 기능을 구현한 GenericDAO에 종속되어 하위 클래스는 GenericDAO의 로직에 강하게 의존할 수밖에 없다. 따라서 유연성이 떨어지며, 트랜잭션 처리와 AOP 적용 등을 수동으로 처리해야 한다는 한계 또한 가진다. 따라서 이는 Spring Data JPA가 등장하기 전 반복적인 구현을 피하기 위한 개발자들의 해결책 중 하나였던 것으로 볼 수 있다.
'웹 개발 > 백엔드' 카테고리의 다른 글
[개념] 최대 유휴 시간(MIT)과 최대 유지 시간(ML) (0) | 2025.06.20 |
---|---|
[개념] AOP (0) | 2025.06.16 |
[개념] IOC 와 DI (2) | 2025.06.12 |