이번엔 사용자 서비스의 제일 밀접한 부분, Controller 를 만들어 보자
MVC 패턴은 View 에서 사용자의 앞단을 정의하지만, MSA 아키텍쳐가 점점 상용화 되면서 Spring ORM을 사용하기 좋은 환경이 되었고, 지금까지 하고있는 Spring 구조, Controller-Service-Repository 구조로 발전해 왔다.
따라서 기존의 View 부분을, API를 설계해, 프론트와 완전히 분리하여, 단순하게 JSON데이를 주고받는 것 만으로 구현이 가능해졌다.
자 이제 해보자!
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 매핑이 어떻게 일어나는지에 대해서만 생각하자
'Spring > Spring Boot' 카테고리의 다른 글
[Spring] JPA Auditting 과 TimeStamp Class (createAt, UpdateAt 자동 기록) (0) | 2021.11.22 |
---|---|
[Spring] 09. DI(의존성 주입) 과 IOC 컨테이너 (0) | 2021.11.12 |
[Spring] 07. DTO를 사용하는 이유 - Data Transfer Object (0) | 2021.11.11 |
[Spring] 06. Lombok - getter, Setter, 기본타입 생성자 코드 중복 없애기 (0) | 2021.11.11 |
[Spring] 05. JPA - CRUD (Spring Service layer) (0) | 2021.11.11 |