웹의 자원을 URI로 구분, HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용
→ 자원에 대한 행위를 명확하게 표현하는 아키텍처 스타일
restAPI 설계
json
@RestController
@RequestBody
@PathVariable
Test (postman 사용)
| 어노테이션 | 설명 |
|---|---|
@RestController | @Controller + @ResponseBody / 반환값을 JSON/XML 형태로 자동 변환해 클라이언트에 응답. REST API에 적합 |
@ResponseBody | Java 객체를 JSON 또는 XML로 변환하여 응답 본문에 반환 (단독 사용 가능) |
@PathVariable | URL 경로에 포함된 변수 값 추출 (예: /user/{id}) |
@CrossOrigin | CORS 허용 설정 (다른 도메인에서 요청 허용) |
@RequestBody | HTTP Body의 JSON 데이터를 Java 객체로 매핑 |
package org.zerock.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SampleVO {
private Integer mno;
private String firstName;
private String lastName;
}
package org.zerock.domain;
import lombok.Data;
@Data
public class Ticket {
private int tno;
private String owner;
private String grade;
}
...
@RestController
@Log4j
public class SampleController2 {
// 기본형
@GetMapping("/getSample")
public SampleVO getSample() {
return new SampleVO(100, "채", "정윤");
}
...
mapToObj → SampleVO → collect(Collectors.toList())
@GetMapping("/getList")
public List<SampleVO> getList(){
return IntStream.range(1, 10).mapToObj(i ->
new SampleVO(i, "first"+i, "last"+i))
.collect(Collectors.toList());
}
// 클라이언트가 서버에게 json을 넘김 - PostMapping
// 이때 json으로 넘어오는 것을 ticket으로 변환하고 싶다! - (@RequestBody)
@PostMapping("/ticket")
public Ticket convert(@RequestBody Ticket ticket) {
log.info("convert.............." + ticket);
return ticket;
}

// url 안에 데이터값을 담아서 전달하고 싶을때는 중괄호로 표현
// 중괄호 개수만큼 @PathVariable 설정, 어떤 변수에 담을지 설정
@GetMapping("/product/{cat}/{pid}")
public String[] getPath(@PathVariable("cat") String cat,
@PathVariable("pid") int pid) {
return new String[] {"category: " + cat, " product: " + pid};
}

| 목적 | 사용 예시 |
|---|---|
| 상태코드 설정 | ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid") |
| 성공 응답 | ResponseEntity.ok(data) |
| 헤더 설정 | new ResponseEntity<>(body, headers, HttpStatus.OK) |
| 조건부 응답 처리 | if-else로 다르게 ResponseEntity 리턴 |
// ✅ 1. 상태코드만 설정
@GetMapping("/bad-request")
public ResponseEntity<String> badRequest() {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Invalid");
}
// ✅ 2. 200 OK 성공 응답
@GetMapping("/ok")
public ResponseEntity<String> okResponse() {
return ResponseEntity.ok("Everything is fine!");
}
// ✅ 3. 201 Created
@PostMapping("/created")
public ResponseEntity<String> createdResponse() {
String newResource = "New resource created!";
return new ResponseEntity<>(newResource, HttpStatus.CREATED);
}
// ✅ 4. 조건부 응답
@GetMapping("/user/{id}")
public ResponseEntity<String> getUser(@PathVariable Long id) {
if (id == 1) {
return ResponseEntity.ok("User1"); // 200 OK
} else {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found"); // 404
}
}
// ✅ 5. 헤더 포함 응답
@GetMapping("/with-header")
public ResponseEntity<String> withHeader() {
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "HeaderValue");
return new ResponseEntity<>("Hello with header!", headers, HttpStatus.OK);
}