반응형
📝프로젝트 구조 (Package structure)
Spring Boot에서 정해둔 프로젝트 구조는 없지만 저는 DDD가 유지보수에 더 좋다고 생각하여 DDD 기반으로 만들었습니다
DAO 기반의 DDD
com
└ lsj
└ shopping_mall
└ dashboard
| └ controller
| └ service
| └ dao
| └ dto
| └ request
| └ response
| └ util
| └ exception
|
|
└ global
└ config
└ user
└ exception
└ jwt
└ util (공통 API)
Repository 기반의 DDD (+ JPA)
com
└ lsj
└ shopping_mall
└ dashboard
| └ controller
| └ service
| └ repository
| └ entity
| └ dto
| └ request
| └ response
| └ util
| └ exception
|
|
└ global
└ config
└ user
└ exception
└ jwt
└ util (공통 API)
📝DAO vs Repository
DAO
// User.java
public class User {
private Long id;
private String name;
private String email;
// Constructors, getters and setters
}
// UserDao.java
public interface UserDao {
User findById(Long id);
List<User> findAll();
void save(User user);
void update(User user);
void delete(Long id);
}
// UserDaoImpl.java
public class UserDaoImpl implements UserDao {
private DataSource dataSource;
public User findById(Long id) {
// SQL 쿼리를 사용하여 특정 사용자 검색
}
public List<User> findAll() {
// 모든 사용자를 검색하는 SQL 쿼리
}
public void save(User user) {
// 사용자 저장 SQL 쿼리
}
public void update(User user) {
// 사용자 정보 업데이트 SQL 쿼리
}
public void delete(Long id) {
// 사용자 삭제 SQL 쿼리
}
}
DAO는 데이터베이스와의 상호 작용을 캡슐화하여 데이터베이스 접근 로직과 비즈니스 로직을 분리합니다 특히 CRUD연산에만 초점을 맞춥니다 (DAO의 경우 데이터 액세스를 추상화)
위 코드를 CRUD로 구분하면 아래와 같습니다
- Create
- save
- Read
- findById
- findAll
- Update
- update
- Delete
- delete
Repository
// UserRepository.java
public interface UserRepository {
User findById(Long id);
List<User> findAllByStatus(String status);
void save(User user);
void delete(User user);
}
// UserRepositoryImpl.java
public class UserRepositoryImpl implements UserRepository {
private EntityManager entityManager; // JPA 사용 예시
public User findById(Long id) {
return entityManager.find(User.class, id);
}
public List<User> findAllByStatus(String status) {
return entityManager.createQuery("SELECT u FROM User u WHERE u.status = :status", User.class)
.setParameter("status", status)
.getResultList();
}
public void save(User user) {
entityManager.persist(user);
}
public void delete(User user) {
entityManager.remove(user);
}
}
DAO와 다르게 도메인 중심의 설계에서 사용되며 CRUD에서 확장되어 각 상황에 맞는 도메인 로직에 더 초점을 맞춥니다
반응형