기본 폴더 구조 마지막입니다.
이제 본격적으로 API 요청 경로를 스프링의 내부 로직과 연결하겠습니다.
Controller는 어떤 경로로 어떤 요청을 받아 어떤 값을 어떤 방식으로 응답할지 결정하는 곳입니다.
그것을 위해 Service 파일을 사용해요.
이제 Controller - Service - Repository의 관계를 아시겠나요?
이런 과정이 모두 DispatcherServlet을 통해 진행되는데
우리 눈에는 보이지 않으니 신경쓰지 맙시다.
우리는 얼른 돈을 벌어야 하니까요.
먼저 위 파일을 열어줍시다!
↓
package com.homepage.board.controller;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.homepage.board.entity.Post;
import com.homepage.board.service.BoardService;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardController {
private final BoardService boardService;
@GetMapping("/{postId}")
public ResponseEntity<Post> getPostById(@PathVariable("postId") Long postId){
Post post= boardService.getPostById(postId);
return ResponseEntity.ok(post);
}
}
BoardController.java의 코드입니다.
하나하나 분석해 볼게요
@RestController
자주 쓰긴 하지만 무엇인지 모르고 넘어가기 쉬운 @RestController입니다.
앞서 작성한 코드에서는 @Service, @Repository, @Entity와 같은 어노테이션을 사용함으로써
해당 클래스의 역할을 선언해줬습니다.
Controller 파일도 @Controller를 선언해주면 됩니다.
@RestController는 @Controller에 @ResponseBody를 추가한 것입니다.
@ResponseBody는 반환형, 즉 결과값을 JSON이나 XML형식으로
전달한다는 뜻입니다.
만약 @Controller를 사용하지 않고 같은 결과를 내고싶으면
@Controller
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardController {
private final BoardService boardService;
@GetMapping("/{postId}")
@ResponseBody
public ResponseEntity<Post> getBoardById(@PathVariable("postId") Long postId) {
Post post = boardService.getPostById(postId);
return ResponseEntity.ok(post);
}
}
이렇게 해주면 됩니다.
다음으로
@RequestMapping("/board")
우리가 서버를 실행하고 api 요청을 보낼 때,
http://localhost:8080 뒤에 붙는 PATH 입니다.
아래에 있는
@GetMapping("/{postId}")
와 합쳐져서
http://localhost:8080/board/{postId} 의 요청과 mapping, 이어주는 겁니다.
private final BoardService boardService;
Controller는 Service의 함수들을 호출하여 사용합니다.
그러기 위해서 선언해주는 부분이에요.
public ResponseEntity<Post> getPostById(@PathVariable("postId") Long postId){
Post post= boardService.getPostById(postId);
return ResponseEntity.ok(post);
}
ResponseEntity는 <> 사이에 반환하려는 타입을 설정하는 제네릭 클래스입니다.
저는 Post값을 반환해주고 싶으니 제 마음대로 ResponseEntity<> 사이에 Post를 넣어주겠습니다.
그러면 API를 호출한 클라이언트 쪽에서는 최종적으로
Post의 값을 JSON 형식으로 전달받게 됩니다.
또한 @PathVariable("postId")는 URL 경로에서 {postd}를 추출하여 우리가 설정한
Long 타입의 postId라는 이름으로 저장합니다.
만약 http://localhost:8080/board/13을 입력했다면,
postId에는 13이 Long타입으로 들어가겠죠.
이렇게 작성된 결과물을 ResponseEntity.ok()를 이용하면
성공적으로 모든 과정이 수행되었을 때, OK를 의미하는 상태코드 200을 전달합니다.
상태코드에 대해서는 따로 포스팅 하겠습니다.
자 이제 우리는 Spring의 가장 큰 흐름을 이해하였습니다.
앞으로 작성할 코드들도 이에 크게 벗어나지 않게 작성됩니다.
'[spring]스프링' 카테고리의 다른 글
[Spring 게시판] 10. 게시물 등록·조회 API + 포스트맨 사용법 (0) | 2023.08.01 |
---|---|
[Spring 게시판] 9. JPA 환경에서 스프링 실행 + DataSource 연결 에러 (0) | 2023.08.01 |
[Spring 게시판] 7. 기본 폴더 구조 정리4 (service파일 생성) (0) | 2023.07.14 |
[Spring 게시판] 6. 기본 폴더 구조 정리3 (repository 파일 생성) (0) | 2023.07.11 |
[Spring 게시판] 5. 기본 폴더 구조 정리2 (entity, dto 파일 생성) (0) | 2023.07.10 |