-
2. [TodoList] - Service & Repository 설계AppCenter/TodoList 2023. 5. 16. 11:52반응형
지난 포스팅에서 도메인을 설계했으니 이번엔 서비스와 레포지토리를 설계해 보겠다.
Task 와 User 도메인을 설계했으니 그에 따른 TaskService, TaskRepository, UserService, UserRepository를 설계하면 된다.
Repository vs Service 역할의 차이
repository 패키지는 DB에 접근하는 모든 코드가 모여있다고 생각하면 된다.
Service 패키지는 DB에 접근하는 코드는 repository에 위임하고, 비즈니스 로직과 관련된 모든 코드가 모여있는 것이다.
이렇게 구분해두면 비즈니스 로직 문제가 생겼을때는 service 패키지만 확인하면 되고 DB 접근 문제가 생겼을때는 repository만 확인하면 되는 장점이 있다.
TaskRepository & UserRepository
public interface TaskRepository extends JpaRepository<Task, Long> { }
public interface UserRepository extends JpaRepository<User, Long> { }
SpringDataJpa 를 사용해 레포지토리를 구성했다.
UserService
123456789101112@Service@RequiredArgsConstructorpublic class UserService {private final UserRepository userRepository;@Transactionalpublic UserJoinRespDto join(UserJoinReqDto userJoinReqDto) {User user = userRepository.save(userJoinReqDto.changeEntity(userJoinReqDto));return new UserJoinRespDto(user);}}cs UserService 에서는 dto 를 받아 데이터베이스에 저장하는 간단한 로직만 구현했다.
후에 Spring Security + jwt 를 이용해 로그인을 구현한 뒤 자세히 설명하겠다.
TaskService
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748@Service@RequiredArgsConstructorpublic class TaskService {private final TaskRepository taskRepository;@Transactionalpublic TaskSaveRespDto writeTodo(TaskSaveReqDto TaskSaveReqDto) {Task task = taskRepository.save(TaskSaveReqDto.changeEntity(TaskSaveReqDto));return new TaskSaveRespDto(task);}@Transactionalpublic TaskDeleteRespDto deleteTodo(Long id) {Optional<Task> optionalTask = taskRepository.findById(id);if(optionalTask.isEmpty()) {throw new TodoNotFoundException();}Task task = optionalTask.get();taskRepository.deleteById(id);return new TaskDeleteRespDto(task);}@Transactionalpublic TaskEditRespDto editTodo(Long id, TaskEditRequestDto taskEditRequestDto) {Optional<Task> optionalTask = taskRepository.findById(id);if (optionalTask.isPresent()) {Task task = optionalTask.get();task.setContents(taskEditRequestDto.getContents());task.setTitle(taskEditRequestDto.getTitle());task.setDeadline(parseDatetime(taskEditRequestDto.getDeadline()));return new TaskEditRespDto(task);} else {throw new TodoNotFoundException();}}@Transactionalpublic List<Task> findAll() {return taskRepository.findAll();}}cs writeTodo
파라미터로 Controller 에서 보내준 TaskSaveReqDto 를 받아 데이터베이스에 저장해준 뒤 TaskSaveResponseDto 를 반환한다.
deleteTodo
파라미터로 Controller 에서 보내준 id 를 받아 id 와 일치하는 엔티티가 있는지 조회한다.
만약 일치하는 엔티티가 없다면 TodonotFoundException 을 발생시키고, 일치하는 엔티티가 있을 경우 엔티티를 삭제한
다.
이후 조회한 엔티티를 TaskDeleteResponseDto로 변환해 반환해준다.
editTodo
파라미터로 Controller 에서 보내준 id 를 받아 id 와 일치하는 엔티티가 있는지 조회한다.
만약 일치하는 엔티티가 없다면 TodonotFoundException 을 발생시키고, 일치하는 엔티티가 있을 경우 파라미터로 받아온
taskEditRequestDto 의 Contents, Title, Deadline 의 값을 엔티티에 복사한다.
이후 조회한 엔티티를 TaskEditResponseDto로 변환해 반환해준다.
findAll
findAll 메소드는 조회 메소드이므로 트랜잭션을 읽기 전용 모드로 설정해 엔티티의 등록, 변경, 삭제를 예방하고 성능을 최적화했다.
읽기 전용 모드 성능 최적화에관한 좋은 글이 있길래 아래 참고에 넣어두겠다.
참고
728x90반응형'AppCenter > TodoList' 카테고리의 다른 글
TodoList - RestControllerAdvice + ExceptionHandler를 이용한 예외처리 (0) 2023.07.11 3. [TodoList] - dto 설계 (0) 2023.05.17 1. [TodoList] - 도메인 설계 (0) 2023.05.15