memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

@Controller 어노테이션을 이용하면 기본적으로 view 페이지를 찾아서 띄어주는 역할을 한다.

하지만 REST API를 개발해야하는 상황이라면 각 메소드마다 @ResponseBody를 붙여서 데이터를 그대로 반환하도록 할 수 있다. (아래 글  참고)

 

2021.05.17 - [Spring] - @ResponseBody를 이용하여 데이터 반환

 

@ResponseBody를 이용하여 데이터 반환

보통은 @Controller 어노테이션을 이용하여 Controller 를 생성했을때, (ViewResolver에 의해) return 값으로 반환하는 문자열 이름의 view 페이지를 띄어준다. (아래 예시 코드 참고) 더보기 HelloCotroller.java..

memostack.tistory.com

 

하지만, 위 방법은 번거롭기 때문에 @RestController를 사용하면 편하다.

 

@RestController

@Controller 와 @ResponseBody를 이용하여 API를 작성할 때는 아래와 같이 했지만,

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class FirstController {

    @ResponseBody // View 페이지가 아닌 응답값 그대로 반환하기 위해 사용
    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    public String helloWorld() {
        return "hello world";
    }

}

 

@RestController를 사용하면, 아래처럼 @ResponseBody 어노테이션을 붙이지 않아도 된다.

  • 아래 예제에서는 메소드가 1개지만, 메소드가 여러개인 경우 @Controller와 @ResponseBody를 이용할때보다 훨씬 간편
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SecondController {

    @RequestMapping(value = "/hellospring", method = RequestMethod.GET)
    public String helloSpring() {
        return "Hello Spring";
    }

}

Hello Spring

 

예제. 회원 REST API

이를 활용하여 간단한 회원 CRUD REST API를 생성해보면,

  • 비즈니스 로직은 생략
@RestController
@RequestMapping("/api/v1/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 모든 회원 정보를 가져오는 API
     * @return ResponseEntity<List<UserResponse>> 200 OK, 회원 정보 목록
     */
    @GetMapping("")
    public ResponseEntity<List<UserResponse>> getAllUser() {
        List<UserResponse> userList = userService.getAllUser();
        return ResponseEntity.status(HttpStatus.OK).body(userList);
    }

    /**
     * 회원 정보를 가져오는 API
     * @param id 회원의 ID (PK)
     * @return ResponseEntity<UserResponse> 200 OK, 회원 정보
     */
    @GetMapping("/{id}")
    public ResponseEntity<UserResponse> getUser(@PathVariable("id") long id) {
        UserResponse userResponse = userService.getUser(id);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).body(userResponse);
    }
    
    /**
     * 회원 가입 API
     * @param userRequest 회원 정보
     * @return ResponseEntity<UserResponse> 201 Created, 가입된 회원의 정보
     */
    @PostMapping("")
    public ResponseEntity<UserResponse> signUp(@RequestBody UserRequest userRequest) {
        UserResponse user = userService.insert(userRequest);
        return ResponseEntity.status(HttpStatus.CREATED).body(user);
    }

    /**
     * 회원 정보 수정 API
     * @param id 회원의 ID (PK)
     * @param userRequest 회원 정보
     * @return ResponseEntity<UserResponse> 200 OK, 수정된 회원의 정보
     */
    @PutMapping("/{id}")
    public ResponseEntity<UserResponse> update(@PathVariable("id") long id, @RequestBody UserRequest userRequest) {
        UserResponse user = userService.update(userRequest);
        return ResponseEntity.status(HttpStatus.OK).body(user);
    }

    /**
     * 회원 탈퇴(삭제) API
     * @param id 회원의 ID (PK)
     * @return ResponseEntity<Object> 204 No Content
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<Object> delete(@PathVariable("id") long id) {
        userService.delete(id);
        return ResponseEntity.status(HttpStatus.NO_CONTENT).body(null);
    }
}
반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.tistory.com/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!