개발 낙서장

[TIL] 내일배움캠프 20일차 - Spring 개인 과제 - 본문

Java/Sparta

[TIL] 내일배움캠프 20일차 - Spring 개인 과제 -

권승준 2024. 1. 22. 21:29

 

 

오늘의 학습 키워드📚

Spring 개인 과제

 

GitHub - SeungJun-Kwon/MySchedules: 스파르타 코딩클럽 Spring 개인 과제

스파르타 코딩클럽 Spring 개인 과제. Contribute to SeungJun-Kwon/MySchedules development by creating an account on GitHub.

github.com

기존에 했던 앨범 작성 프로젝트 같은 걸 Spring으로 DB 연동해보는 간단한 개인 과제이다.

요구 사항

  • 일정 작성 기능
    • 할일 제목,할일 내용, 담당자, 비밀번호, 작성일을 저장할 수 있습니다.
    • 저장된 게시글의 정보를 반환 받아 확인할 수 있습니다.
      • 반환 받은 게시글의 정보에 비밀번호는 제외 되어있습니다.
  • 선택한 일정 조회 기능
    • 선택한 일정의 정보를 조회할 수 있습니다.
      • 반환 받은 일정 정보에 비밀번호는 제외 되어있습니다.
  • 일정 목록 조회 기능
    • 등록된 일정 전체를 조회할 수 있습니다.
      • 반환 받은 일정 정보에 비밀번호는 제외 되어있습니다.
    • 조회된 일정 목록은 작성일 기준 내림차순으로 정렬 되어있습니다.
  • 선택한 일정 수정 기능
    • 선택한 일정의 할일 제목,할일 내용, 담당자을 수정할 수 있습니다.
      • 서버에 일정 수정을 요청할 때 비밀번호를 함께 전달합니다.
      • 선택한 일정의 비밀번호와 요청할 때 함께 보낸 비밀번호가 일치할 경우에만 수정이 가능합니다.
    • 수정된 일정의 정보를 반환 받아 확인할 수 있습니다.
      • 반환 받은 일정의 정보에 비밀번호는 제외 되어있습니다.
  • 선택한 일정 삭제 기능
    • 선택한 일정을 삭제할 수 있습니다.
      • 서버에 일정 삭제를 요청할 때 비밀번호를 함께 전달합니다.
      • 선택한 일정의 비밀번호와 요청할 때 함께 보낸 비밀번호가 일치할 경우에만 삭제가 가능합니다.
@RestController
@RequestMapping("/api/schedules")
public class ScheduleController {
    private final ScheduleService scheduleService;

    public ScheduleController(ScheduleService scheduleService) {
        this.scheduleService = scheduleService;
    }

    @PostMapping()
    public ScheduleResponseDto createSchedule(@RequestBody ScheduleRequestDto requestDto) {
        return scheduleService.createSchedule(requestDto);
    }

    @GetMapping()
    public List<ScheduleResponseDto> getSchedules(){
        return scheduleService.getSchedules();
    }

    @PutMapping("/{id}/{password}")
    public Long updateSchedule(@PathVariable Long id, @PathVariable String password, @RequestBody ScheduleRequestDto requestDto) {
        return scheduleService.updateSchedule(id, password, requestDto);
    }

    @DeleteMapping("/{id}/{password}")
    public Long deleteSchedule(@PathVariable Long id, @PathVariable String password) {
        return scheduleService.deleteSchedule(id, password);
    }
}

Controller에서는 API 명세에 따라 url값을 받고 id와 비밀번호를 넘겨준다.

@Service
public class ScheduleService {
    private final ScheduleRepository scheduleRepository;

    public ScheduleService(ScheduleRepository scheduleRepository) {
        this.scheduleRepository = scheduleRepository;
    }

    public ScheduleResponseDto createSchedule(ScheduleRequestDto requestDto) {
        Schedule schedule = new Schedule(requestDto);

        Schedule saveSchedule = scheduleRepository.save(schedule);

        return new ScheduleResponseDto(saveSchedule);
    }

    public List<ScheduleResponseDto> getSchedules() {
        return scheduleRepository.findAllByOrderByCreatedAt().stream().map(ScheduleResponseDto::new).toList();
    }

    @Transactional
    public Long updateSchedule(Long id, String password, ScheduleRequestDto requestDto) {
        Schedule schedule = scheduleRepository.findById(id).orElseThrow(() ->
                new IllegalArgumentException("선택한 스케줄이 존재하지 않습니다.")
        );

        if(!schedule.getPassword().equals(password)) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        schedule.update(requestDto);

        return id;
    };

    public Long deleteSchedule(Long id, String password) {
        Schedule schedule = scheduleRepository.findById(id).orElseThrow( () ->
                new IllegalArgumentException("선택한 스케줄이 존재하지 않습니다.")
        );

        if(!schedule.getPassword().equals(password)) {
            throw new IllegalArgumentException("비밀번호가 일치하지 않습니다.");
        }

        scheduleRepository.delete(schedule);

        return id;
    }
}

Service에서는 값이 유효한지 확인한 후 Repository에 DB 작업 요청을 해서 반환한다.

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {
    List<Schedule> findAllByOrderByCreatedAt();
}

Repository에서는 JPA 데이터에 이미 구현된 메소드들을 활용하며 추가로 구현이 필요한 부분은 쿼리 메소드를 구현한다.\

구현 화면

안 이쁘지만 어쩔 수 없다 프론트는 내 분야가 아닌 것 같다....😥

일정을 등록하는 화면이다. 입력 후 유효성 테스트를 진행한 다음 Json 정보를 POST 요청한다.

등록 완료!

 

수정 부분 부터는 HTML로 아직 구현하지 않았으니 Postman에서 테스트해보면, id와 password를 PathVariable로 넘겨주면 Service에서 해당 id가 db에 존재하는지, password가 일치하는지를 체크한 다음 Repository에 수정 요청을 진행한다.

삭제 또한 id와 password를 입력받아 체크한 후에 삭제 요청을 진행해 삭제가 가능하다.

이제 기능적인 부분은 어느 정도 구현을 해놨으니 HTML을 통해 작업이 가능하도록 다듬기만 하면 과제 완료다😀


오늘의 회고💬

JDBC에서 JPA로 넘어가고 JPA 데이터, 쿼리 메소드까지 순차적으로 배우니 처음엔 이해가 잘 가지 않았지만 강의를 들을 수록 조금씩 구조가 이해가 가기 시작했다.

물론 아직 참고하면서 개발해야 하는 단계이지만 서버단에서 어떻게 클라이언트와 통신을 하고 DB에 어떻게 요청을 하는지에 대한 이해가 조금이라도 된 상태에서 참고하면서 진행하니 집중도 더 잘 되고 재밌는 것 같다.

 

내일의 계획📜

Html 부분까지 완료해서 과제를 완전히 마무리하고 Spring 이론 부분에 대한 추가적인 공부가 필요할 것 같다.

Comments