HTTP 과목에서 배운 REST·메서드·상태코드가 스프링에서 어떻게 코드로 살아나는지 봐요. 프론트(리액트)가 호출하는 API의 입구가 바로 이 컨트롤러예요.
@RestController는 웹 요청을 받아서 JSON 데이터를 반환하는 컨트롤러예요. 화면(HTML 뷰)을 그려서 돌려주는 게 아니라, 순수한 데이터를 응답으로 내보내요. 그래서 리액트 같은 프론트엔드나 모바일 앱이 이 데이터를 받아 화면을 그리죠.
@로 시작하는 표시(이름표)예요. 코드에 "이건 이런 용도야"라고 쪽지를 붙여 두면, 스프링이 그 표시를 읽고 알아서 일을 처리해줘요. 앞으로 나올 @RestController·@GetMapping이 전부 어노테이션이에요.{ "name": "kim" }처럼 적는 가벼운 텍스트 형식이에요.@Controller는 뷰(HTML 화면)의 이름을 돌려주는 게 기본이에요. 여기에 @ResponseBody를 붙이면 "반환값을 뷰가 아니라 응답 본문(데이터) 그 자체로 보내라"는 뜻이 돼요.
@RestController는 이 둘을 합쳐 놓은 어노테이션이에요. 클래스에 한 번만 붙이면 그 안의 모든 메서드가 데이터(JSON)를 응답해요. REST API를 만들 땐 이걸 씁니다.
@Controller는 "화면을 그려 돌려주는" 전통적 방식, @RestController는 "데이터만 돌려주는" API 방식이에요. 요즘처럼 프론트와 백엔드가 분리된 구조에선 @RestController가 표준이에요.| 어노테이션 | HTTP 메서드 | 역할 |
|---|---|---|
| @GetMapping | GET | 조회 — 데이터를 읽어옴 |
| @PostMapping | POST | 생성 — 새 데이터를 만듦 |
| @PutMapping | PUT | 수정 — 기존 데이터를 바꿈 |
| @DeleteMapping | DELETE | 삭제 — 데이터를 지움 |
클래스 위에 @RequestMapping("/users")로 공통 경로(prefix)를 걸어두면, 각 메서드는 그 뒤에 이어지는 경로만 적으면 돼요. 아래 컨트롤러의 조회 메서드는 결국 GET /users에 연결돼요.
@RestController
@RequestMapping("/users") // 공통 경로: 모든 메서드 앞에 /users
public class UserController {
@GetMapping // GET /users (전체 조회)
public List<User> list() {
return userService.findAll();
}
@PostMapping // POST /users (생성)
public User create(@RequestBody User user) {
return userService.save(user);
}
}
/users/{id}의 {id}처럼 경로의 일부가 곧 값이에요.
// 요청: GET /users/42
@GetMapping("/{id}")
public User get(@PathVariable Long id) { // id = 42
return userService.findById(id);
}
?name=kim&age=20 같은 쿼리 파라미터를 받아요. 주로 검색·필터·페이징 조건에 써요.
?를 붙여 ?name=kim&age=20처럼 추가 조건을 실어 보내는 부분이에요. 여러 개일 땐 &로 이어 붙여요. 쇼핑몰에서 조건을 걸고 검색하면 주소창 끝에 붙는 그 값들이죠.// 요청: GET /users/search?name=kim
@GetMapping("/search")
public List<User> search(@RequestParam String name) { // name = "kim"
return userService.findByName(name);
}
// 요청 본문: { "name": "kim", "age": 20 }
@PostMapping
public User create(@RequestBody User user) { // JSON → User 객체
return userService.save(user);
}
ResponseEntity로 감싸서 반환해요.
@PostMapping
public ResponseEntity<User> create(@RequestBody User user) {
User saved = userService.save(user);
return ResponseEntity
.status(201) // 201 Created
.body(saved); // 본문에 JSON
}
ResponseEntity로 정확히 실어 보낼 수 있어요.우리가 만든 @RestController는 REST API의 입구예요. 브라우저의 리액트가 fetch로 이 API를 호출하면, 컨트롤러가 요청을 받아 서비스·레포지토리로 넘겨 처리하고, 결과를 JSON으로 돌려줘요. 프론트는 그 JSON을 받아 화면을 그려요.