[내일배움캠프] Spring 베이직 일정관리 앱 Step2.

김재진·2025년 12월 31일

내일배움캠프

목록 보기
28/70

1. 추가 구현 기능

  • 전체 조회 기능 중 작성자 기준으로 전체 조회 기능 및 수정일 기준으로 내림차순 정렬하는 기능 추가
  • 수정과 삭제 기능에 비밀번호 입력 을 해야 해당 기능이 작동하도록 하는 기능 추가

2. Github 주소

일정관리 github

3. 추가 구현 기능 코드

  1. 작성자 기준으로 조회 및 수정일 기준으로 내림차순 정렬
  • Controller
 @GetMapping("/schedulers")
    public ResponseEntity<List<SchedulerGetResponse>> getAll(
            @RequestParam(required = false) String name // name을 통해 전체조회
    ){
        return ResponseEntity.status(HttpStatus.OK).body(schedulerService.findAll(name));
    }
  • Service
@Transactional(readOnly = true)
    public List<SchedulerGetResponse> findAll(String name) {
        List<Scheduler> schedulers;

        // name 이 비어있지 않다면 name으로 검색
        if (!name.isEmpty()) {
            schedulers = schedulerRepository.findByNameOrderByModifiedAtDesc(name); // 수정일 기준 내림차순 정렬
        } else { // name 이 비어있을 경우 전체검색
            schedulers = schedulerRepository.findAll();
        }

        List<SchedulerGetResponse> dtos = new ArrayList<>();
        for (Scheduler scheduler : schedulers) {
            SchedulerGetResponse response = new SchedulerGetResponse(
                    scheduler.getId(),
                    scheduler.getContentsName(),
                    scheduler.getContents(),
                    scheduler.getName(),
                    scheduler.getCreatedAt(),
                    scheduler.getModifiedAt()
            );
            dtos.add(response);
        }
        return dtos;
    }
  • Repository
public interface SchedulerRepository extends JpaRepository<Scheduler, Long> {

    List<Scheduler> findByNameOrderByModifiedAtDesc(String name); // 수정일 기준 내림차순 정렬
}

  1. 수정과 삭제 기능에 비밀번호를 입력하게 하는 기능
  • Controller
 @PutMapping("/schedulers/{schedulerId}")
    public ResponseEntity<SchedulerUpdateResponse> update(
            @PathVariable Long schedulerId,
            @RequestParam String password, // RequestParam 으로 비밀번호 받기
            @RequestBody SchedulerUpdateRequest request
    ) {
        return ResponseEntity.status(HttpStatus.OK).body(schedulerService.update(schedulerId, password, request)); // 비밀번호 추가 입력
    }

    @DeleteMapping("/schedulers/{schedulerId}")
    public ResponseEntity<Void> delete(
            @PathVariable Long schedulerId,
            @RequestParam String password // RequestParam 으로 비밀번호 받기
    ) {
        schedulerService.delete(schedulerId, password); // 비밀번호 추가 입력
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build();
    }
  • Service
@Transactional
    public SchedulerUpdateResponse update(Long schedulerId, String password, SchedulerUpdateRequest request) {
        Scheduler scheduler = schedulerRepository.findById(schedulerId).orElseThrow(
                () -> new IllegalStateException("존재하지 않는 게시글 입니다.")
        );
        // 비밀번호 확인
        if (!scheduler.getPassword().equals(password)) { // 비밀번호 확인 (맞지 않을 경우)
            throw new IllegalStateException("비밀번호가 틀립니다.");
        }
        ...
        
 @Transactional
    public void delete(Long schedulerId, String password) {
        Scheduler scheduler = schedulerRepository.findById(schedulerId).orElseThrow(
                () -> new IllegalStateException("존재하지 않는 게시글 입니다.")
        );
        // 비밀번호 확인
        if (!scheduler.getPassword().equals(password)) { // 비밀번호 확인 (맞지 않을 경우)
            throw new IllegalStateException("비밀번호가 틀립니다.");
        }
        schedulerRepository.deleteById(schedulerId);
    }

4. 트러블 슈팅

  • RequestParam으로 추가한 name을 작성하지 않아 오류가 발생했다.
  • Query Params에 key값으로 name을 넣으니 정상적으로 작동했다.

5. 마무리

  • 이번 과제의 필수 기능은 전부 구현한 것 같다. 추가적으로 댓글 기능은 좀 더 공부를 하면서 추가해보도록 해야겠다.
profile
개발공부 처음해보는 사람

0개의 댓글