Spring/Spring Boot

[Spring] 08. Controller 만들기 - 스피링 API (Get, POST, PUT, DELETE)

민돌v 2021. 11. 11. 21:51

이번엔 사용자 서비스의 제일 밀접한 부분, Controller 를 만들어 보자

 

MVC 패턴은 View 에서 사용자의 앞단을 정의하지만, MSA 아키텍쳐가 점점 상용화 되면서 Spring ORM을 사용하기 좋은 환경이 되었고, 지금까지 하고있는 Spring 구조,   Controller-Service-Repository 구조로 발전해 왔다.

따라서 기존의 View 부분을, API를 설계해, 프론트와 완전히 분리하여, 단순하게 JSON데이를 주고받는 것 만으로 구현이 가능해졌다.

 

자 이제 해보자!

Controller ! !

 

API

👉 클라이언트 - 서버 간의 약속입니다.

클라이언트가 정한대로 서버에게 요청(Request)을 보내면, 서버가 요구사항을 처리하여 응답(Response)을 반환합니다.

 

REST

👉 REST란, 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄을 의미합니다.

여기서 사용하는 동사는 CRUD를 지칭합니다.

생성(POST)/조회(GET)/수정(PUT)/삭제(DELETE) 요청

 


 

1. GET (READ)

먼저 GET 요청  데이터 조회 API를 만들어보자

Controller 패키지를 만든후 LectureController.java를 만든다.

 

LectureController.java

@RequiredArgsConstructor
@RestController
public class LectureController {

    private final LectureRepository lectureRepository;

    @GetMapping("/api/lectures")
    public List<Lecture> getLectures() {
        return lectureRepository.findAll();
    }
}

@RequiredArgsConstructor

- 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다. 

 

@RestController

- @Controller에 @ResponseBody가 결합된 어노테이션

- Rest전용 컨트롤러로, IOC에게 Rest bean Controller 객체임을 명시해준다.

 

@RequestMapping(주소) - GetMapping

- 서버의 URL과 특정 처리를 연동(매핑)시키는 구조이다.

 

전체 코드

Get, Post, put, Delete

@RequiredArgsConstructor
@RestController
public class LectureController {

    private final LectureRepository lectureRepository;
    private final LectureService lectureService;

    @GetMapping("/api/lectures")
    public List<Lecture> getLectures() {
        return lectureRepository.findAll();
    }

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

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

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

    @PutMapping("/api/lectures/{id}")
    public Long updateLecture(@PathVariable Long id, @RequestBody LectureRequestDto requestDto) {
        return lectureService.update(id, requestDto);
    }

    @DeleteMapping("/api/lectures/{id}")
    public Long deleteLecture(@PathVariable Long id) {
        lectureRepository.deleteById(id);
        return id;
    }
}

위 코드도 서비스에 연동해야하지만, API 매핑이 어떻게 일어나는지에 대해서만 생각하자