반응형

📝프로젝트 구조 (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에서 확장되어 각 상황에 맞는 도메인 로직에 더 초점을 맞춥니다

 

반응형