[spring]스프링

[Spring 게시판] 8. 기본 폴더 구조 정리5 (controller 파일 생성)

낭만적인 부자 2023. 7. 27. 01:42

기본 폴더 구조 마지막입니다.

 

 

이제 본격적으로 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의 가장 큰 흐름을 이해하였습니다.

앞으로 작성할 코드들도 이에 크게 벗어나지 않게 작성됩니다.