다양한 방법으로 API 작성하기
HTTP Code
2xx : 통신 성공
성공적으로 요청이 처리되었음을 의미.
- 200 [OK] : 요청 성공(GET)
- 201 [Created] : 생성 성공(POST)
- 204 [No Contents] : 요청 성공, 반환할 데이터 없음
3xx : 리다이렉트
- 301 [Moved Permanently] : 요청 URI가 새 위치로 옮겨감
- 302 [Found] : 일시적으로 컨텐츠가 이동했을때.
- 304 [Not Modified] : 요청 URI의 내용이 변경X
4xx : client 오류
요청이 올바르지 않음을 의미.
- 400 [Bad Request] : 잘못된 요청(정의되지 않은 요청)
- 401 [Unauthorized] : 인증 실패(인증 없이 접근할 경우 발생)
- 403 [Forbidden] : 서버가 요청을 거부할 때 발생. 권한(인가)이 없을 때.
- 404 [Not Found] : 요청 URI에 대한 리소스 존재X
- 405 [Method Not Allowed] : 서버에서 허용되지 않은 메소드로 요청시 사용.
- 415 [Unsupported Media Type] : 잘못된 데이터 형식
- 429 [Too Many Requests] : 너무 많은 요청 발생
5xx : 서버 오류
- 500 [Internal Server Error] : 서버 내부 오류
@Controller & @RestController
@Controller
HTML 등 view 반환
@RestController
데이터를 JSON/XML 형식으로 반환
내부적으로 @Controller
와 @ResponseBody
를 조합한 형태로
응답 데이터를 자동으로 JSON 형식으로 변환하며 Content-Type을 application/json으로 설정한다.
@ResponseBody
데이터 응답을 JSON 형식으로 변환해 HTTP 응답 본문에 추가
@RequestBody
: HTTP 요청의 본문(body)에 담긴 값을 자바 객체로 매핑하는 역할
@ResponseBody
:자바 객체를 HTTP 응답 본문(body)에 담긴 값으로 매핑하는 역할
1
2
3
4
5
6
7
8
@RestController
@RequestMapping("/api")
public class ExampleController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!"; // JSON 응답: { "message": "Hello, World!" }
}
}
요청 매핑과 데이터 처리
GET/DELETE 메서드: URL에 데이터 포함
GET과 DELETE 메서드는 URL 경로나 쿼리 파라미터를 통해 데이터를 전달받는다.
@PathVariable: URL 경로에서 데이터 추출
1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class MyController {
// http://localhost:8080/api/hello/coco
@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return "Hello, " + name; // Hello, coco
}
}
1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class MyController {
// http://localhost:8080/api/hello/coco
@GetMapping("/hello/{name}")
public String hello(@PathVariable("name") String userName) {
return "Hello, " + userName; // Hello, coco
}
}
@GetMapping
에 지정한 변수의 이름과 메소드 매개변수의 이름을 동일하게 맞추기 어려울 때 위와 같이 작성
@RequestParam : 쿼리 파라미터로 데이터 추출
쿼리 파라미터(Query Parameter)는 URL 뒤에 물음표(?)와 함께 붙는 키-값(Key-Value) 쌍이다.
여러 개의 쿼리 파라미터를 전달하려면 파라미터 사이에 앰퍼샌드(&
)를 추가해서 하나의 문자열(string)로 전달한다.
1
2
3
4
5
6
7
8
9
@RestController
@RequestMapping("/api")
public class MyController {
// http://localhost:8080/api/hello?name=coco&age=5
@GetMapping("/hello")
public String hello(@RequestParam("name") String name, @RequestParam("age") int age) {
return "Hello, " + name + ", " + age; // Hello, coco, 5
}
}
POST/PUT 메서드: HTTP Body에 데이터 포함
🐣 POST와 PUT 메서드는 데이터를 HTTP Body에 JSON 형식으로 전달한다.
@RequestBody: JSON 데이터를 Java 객체로 변환
클라이언트가 전송하는 Json(application/json) 형태의 HTTP Body를
MessageConverter를 통해 Java 객체로 변환시켜주는 역할
→ Body가 존재하지 않는 HTTP Get 메소드에 @RequestBody
를 활용하려고 한다면 에러가 발생
1
2
3
4
5
6
7
8
@RestController
@RequestMapping("/api")
public class MyController {
@PostMapping("/user")
public MyDTO postUser(@RequestBody MyDTO myDTO) {
return myDTO;
}
}
DTO와 같이 객체를 리턴해주는 경우 getter가 없다면 값에 접근하지 못한다. HttpMediaTypeNotAcceptableException 발생
@ModelAttribute: Form 데이터를 객체로 바인딩
Form 데이터를 객체로 매핑할 때 사용
1
2
3
4
let form_data = new FormData()
form_data.append("comment", $("#comment").val())
form_data.append("nickname", nickname)
form_data.append("registryIdx", $("#RegistryId").html())
1
2
3
4
@PostMapping("/comment")
public Comment setComment(@ModelAttribute CommentDto commentDto) {
return commentService.setComment(commentDto);
}
@ModelAttribute에는 매핑시키는 파라미터의 타입이 객체의 타입과 일치하는지 등을 포함한
다양한 검증(Validiation) 작업이 추가적으로 진행되는데,
int형 index 변수에 “1번” 이라는 String형을 넣으려고 한다면, BindException이 발생하게 된다.
Dto와 ResponseEntity
DTO (Data Transfer Object)
계층 간 데이터를 전달하는 데 사용한다.
따라서 로직을 포함하지 않고 순수 데이터만 작성한다.
1
2
3
4
5
public class UserDto {
private String username;
private String email;
// Getters and Setters
}
ResponseEntity
응답 데이터와 상태 코드를 명시적으로 제어할 때 사용
1
2
3
4
@PostMapping("/user")
public ResponseEntity<UserDto> createUser(@RequestBody UserDto userDto) {
return ResponseEntity.status(HttpStatus.CREATED).body(userDto);
}
URI Mapping
특정 uri로 요청을 보내면 Controller에서 어떠한 방식으로 처리할지 정의를 한다.
이때 들어온 요청을 특정 메서드와 매핑하기 위해 사용하는 것이 @RequestMapping
이다.
@RequestMapping
에서 가장 많이사용하는 부분은 value와 method이다.
*value : 요청 받을 url
*method :어떤 요청으로 받을지 정의(POST, GET, PUT, DELETE 등등)
1
2
3
4
5
6
7
8
@RestController
@RequestMapping("/api")
public class MyController {
@RequestMapping(value = "/study", method = RequestMethod.POST)
public String createStudy() {
return "Study Created";
}
}
간편하게 설정하기
스프링 4.3부터는 @PostMapping
, @GetMapping
, @PutMapping
, @DeleteMapping
으로 간결하게 설정 가능하다.
1
2
3
4
5
6
7
8
@RestController
@RequestMapping(value = "/study")
public class StudyController {
@GetMapping("/ch3")
public String studyNoCh3(...) {
...
}
}
studyNoCh3에 들어가기 위해서는 /study/ch3
으로 들어가야 한다.
*@RequestMapping은 Class와 Method에 붙일 수 있고
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping들은 Method에만 붙일 수 있다.
HTTP 메서드별 데이터 처리 예시
데이터 전달 방식
POST/PUT 메서드: 데이터를 HTTP Body에 JSON 형태로 전달.
반드시 JSON.stringify()
를 사용하여 JSON 문자열로 변환 후 전송
1
2
3
4
5
6
7
8
9
10
let data = { username: 'example', contents: 'message' };
$.ajax({
type: "PUT",
url: `/api/${id}`,
contentType: "application/json",
data: JSON.stringify(data),
success: function (response) {
console.log(response);
}
});
GET/DELETE 메서드: 데이터를 URL에 포함하여 전달
1
2
3
4
5
6
7
$.ajax({
type: "DELETE",
url: `/api/${id}`,
success: function (response) {
console.log(response);
}
});
POST
1
2
3
4
@PostMapping("/create")
public UserDto createUser(@RequestBody UserDto userDto) {
return userDto;
}
GET
1
2
3
4
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
return "User ID: " + id;
}
PUT
1
2
3
4
@PutMapping("/update")
public ResponseEntity<UserDto> updateUser(@RequestBody UserDto userDto) {
return ResponseEntity.ok(userDto);
}
DELETE
1
2
3
4
@DeleteMapping("/user/{id}")
public String deleteUser(@PathVariable Long id) {
return "Deleted User ID: " + id;
}
REFERENCE