[SPRING_입문]/개발일지

[2주차] 개발일지 (2-11) API : POST / PUT / DELETE (後)

Code_Otaku 2022. 6. 17. 15:54

안녕! 안녕! 

오늘은 필자의 승모근 통증으로 인해 미처 다뤄보지 못했던 API의 나머지 기능!

POST / PUT / DELETE 기능에 대해 이야기를 해보자.

누누히 말하는 거지만 각 기능들을 C.R.U.D와 연계해서 이해하는 습관을 들이도록 하자.

그럼

시 ~~~ 작..!

 

1. POST

API란 서버와 클라이언트 간 이루어지는 모든 요청 (Request) 및 응답 (Response)에 관한

일종의 약속 내지 규정이라고 할 수 있다.

POST는 SQL에서 테이블을 생성 (CREATE)하는 기능과 유사하다.

다음 소스코드를 살펴보도록 하자.

 

@Getter
@Setter
@RequiredArgsConstructor

public class CourseRequestDto {

    private final String title;

    private final String tutor;

}
// PostMapping을 통해서, 같은 주소라도 방식이 다름을 구분합니다.
@PostMapping("/api/courses")
public Course createCourse(@RequestBody CourseRequestDto requestDto) {
    // requestDto 는, 생성 요청을 의미합니다.
    // 강의 정보를 만들기 위해서는 강의 제목과 튜터 이름이 필요하잖아요?
    // 그 정보를 가져오는 녀석입니다.

    // 저장하는 것은 Dto가 아니라 Course이니, Dto의 정보를 course에 담아야 합니다.
    // 잠시 뒤 새로운 생성자를 만듭니다.
    Course course = new Course(requestDto);

    // JPA를 이용하여 DB에 저장하고, 그 결과를 반환합니다.
    return courseRepository.save(course);
}

상단 코드는 requestDto 값을 얻어오기 위한 DTO 클래스이다.

 

하단 코드가 POST 방식의 예제 코드라고 할 수 있겠다.

복잡해보이지만 딱 두 군데만 눈 크게 뜨고 쳐다보면 된다.

 

@PostMapping(...)

return courseRepository.save(course);

 

어노테이션을 선언한 후에 테이블을 새롭게 생성해주기 위한 클래스를 따로 만들어준다.

자세한 내용은 코드주석에 다 딸려있으니 그거 참고하시고..

 

마지막으로 리턴값으로 courseRepository.save() 메서드를 사용하여 UPDATE된 값을 DB에 저장하는 작업까지 마무리 해준다.

 

CourseRequestDto requestDto = new CourseRequestDto("웹개발의 봄, Spring", "홍길동");

courseService.update(1L, requestDto);
courseList = courseRepository.findAll();
for (int i = 0; i < courseList.size(); i++) {
    Course course = courseList.get(i);
    System.out.println(course.getId());
    System.out.println(course.getTitle());
    System.out.println(course.getTutor());
}

이미지 파일 참조.. 수구

 

2. PUT

SQL의 UPDATE기능과 유사하다.

이전 시간에 사용한 ARC를 통해 한 눈에 보도록 할까?

 

다음은 소스코드..

 

@PutMapping("/api/courses/{id}")
public Long updateCourse(@PathVariable Long id, @RequestBody CourseRequestDto requestDto) {
    return courseService.update(id, requestDto);
}
@Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
public Long update(Long id, CourseRequestDto requestDto) {
    Course course1 = courseRepository.findById(id).orElseThrow(
            () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
    );
    course1.update(requestDto);
    return course1.getId();
}

이번에도 딱 두 부분만 주목해라.

 

@PutMapping(...)

return couseService.update(id, requestDto);

 

3. DELETE

SQL에서 테이블 로우의 값을 삭제하는 기능과 유사하다.

 

@DeleteMapping("/api/courses/{id}")
public Long deleteCourse(@PathVariable Long id){
    courseRepository.deleteById(id);
    return id;
}

저 @PathVariable을 선언해준 이유는 Long 타입 id 변수 단독으로 값을 저장할 수는 없기 때문읾..

 

여기까지 다뤄봤으면 됐다. 수구..