Post

ResponseEntity, HTTP μƒνƒœ μ½”λ“œ

ResponseEntity, HTTP μƒνƒœ μ½”λ“œ

πŸ“Œ ResponseEntityλž€?

ResponseEntity λŠ” HTTP 응닡을 μ œμ–΄ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” ν΄λž˜μŠ€μ΄λ‹€. 응닡 body, μƒνƒœ μ½”λ“œ, 헀더λ₯Ό μ œμ–΄ν•  수 μžˆλ‹€. HttpEntity λ₯Ό 상속받아 κ΅¬ν˜„λ˜μ—ˆλ‹€.

@ResponseBody λŠ” μ‘λ‹΅μ˜ body만 μ œμ–΄ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 차이가 μžˆλ‹€.

πŸ“Œ ꡬ성 μš”μ†Œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public ResponseEntity(HttpStatusCode status) {
	this(null, null, status);
}

public ResponseEntity(@Nullable T body, HttpStatusCode status) {
	this(body, null, status);
}

public ResponseEntity(MultiValueMap<String, String> headers, HttpStatusCode status) {
	this(null, headers, status);
}

public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatusCode status) {
	this(body, headers, (Object) status);
}

public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, int rawStatus) {
	this(body, headers, (Object) rawStatus);
}

private ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, Object status) {
	super(body, headers);
	Assert.notNull(status, "HttpStatusCode must not be null");
	this.status = status;
}

ResponseEntity λŠ” μ„Έ κ°€μ§€ μš”μ†Œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλ‹€.

  • HttpStatus λŠ” β€˜200 OK’, β€˜404 Not Found’와 같은 HTTP μƒνƒœ μ½”λ“œ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.
  • HttpHeaders λŠ” `Content-type’과 같은 HTTP 헀더 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.
  • HttpBody λŠ” μ‹€μ œ 응닡 body 데이터λ₯Ό λ‹΄κ³  μžˆλ‹€.

πŸ“Œ HTTP μƒνƒœ μ½”λ“œ

일단 μ–΄λ–€ μ’…λ₯˜μ˜ HTTP μƒνƒœ μ½”λ“œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•΄λ³΄μž.

크게 5κ°€μ§€ 그룹이 μ‘΄μž¬ν•œλ‹€.

  • 1xx: νŠΉμ • 정보λ₯Ό μ œκ³΅ν•  λ•Œ μ‚¬μš©ν•œλ‹€. μš”μ²­μ„ λ°›μ•˜μœΌλ©° ν”„λ‘œμ„ΈμŠ€λ₯Ό 계속 진행함을 μ˜λ―Έν•œλ‹€.
    • 100 Continue: μ„œλ²„κ°€ μš”μ²­μ˜ 첫 뢀뢄을 λ°›κ³  아직 μˆ˜μ‹ μ΄ λλ‚˜μ§€ μ•Šμ•˜μŒμ„ μ˜λ―Έν•˜λ©° λ‚˜λ¨Έμ§€ 뢀뢄을 계속 보내도 μ’‹λ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
    • 101 Switching Protocols: μš”μ²­μ˜ Upgrade 헀더에 따라 μ„œλ²„κ°€ ν”„λ‘œν† μ½œμ„ λ³€κ²½ν•˜κ³  μžˆλŠ” μƒνƒœμ΄λ‹€.
    • 102 Processing: μ„œλ²„κ°€ μš”μ²­μ„ μˆ˜μ‹ ν–ˆκ³ , 처리 μ€‘μ΄μ§€λ§Œ 응닡을 보낼 수 μ—†λŠ” μƒνƒœμ΄λ‹€.
  • 2xx: μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆμŒμ„ μ˜λ―Έν•œλ‹€.
    • 200 OK: μš”μ²­μ΄ μ„±κ³΅μ μœΌλ‘œ 처리된 μƒνƒœμ΄λ‹€.
    • 201 Created: μš”μ²­μ΄ μ„±κ³΅ν•˜μ—¬ μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λœ μƒνƒœμ΄λ‹€.
    • 202 Accepted: μš”μ²­μ΄ μ ‘μˆ˜λ˜μ—ˆμœΌλ‚˜ 아직 μ²˜λ¦¬λ˜μ§€ μ•Šμ€ μƒνƒœμ΄λ‹€.
    • 204 No Content: μš”μ²­μ€ μ„±κ³΅ν–ˆμœΌλ‚˜ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보낼 응닡 bodyκ°€ μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 206 Partial Content: ν΄λΌμ΄μ–ΈνŠΈκ°€ Range 헀더λ₯Ό 톡해 λ¦¬μ†ŒμŠ€μ˜ μΌλΆ€λ§Œ μš”μ²­ν–ˆμ„ λ•Œ ν•΄λ‹Ή μ½˜ν…μΈ κ°€ μ„±κ³΅μ μœΌλ‘œ μ „μ†‘λ˜μ—ˆμŒμ„ μ˜λ―Έν•œλ‹€.
  • 3xx: μš”μ²­μ„ μ™„λ£Œν•˜κΈ° μœ„ν•΄ λ¦¬λ‹€μ΄λ ‰μ…˜ν•΄μ•Ό 함을 μ˜λ―Έν•œλ‹€.
    • 301 Moved Permanently: μš”μ²­ν•œ λ¦¬μ†ŒμŠ€μ˜ URIκ°€ 영ꡬ적으둜 λ³€κ²½λ˜μ—ˆμŒμ„ μ˜λ―Έν•œλ‹€. μ‘λ‹΅μ˜ Location 헀더에 μƒˆλ‘œμš΄ URI을 ν¬ν•¨μ‹œν‚¨λ‹€.
    • 302 Found: μš”μ²­ν•œ λ¦¬μ†ŒμŠ€κ°€ μΌμ‹œμ μœΌλ‘œ λ‹€λ₯Έ URI에 μžˆλŠ” μƒνƒœμ΄λ‹€.
    • 304 Not Modified: ν΄λΌμ΄μ–ΈνŠΈλŠ” μΊμ‹œλœ 파일의 버전이 λ³€κ²½λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ μ„œλ²„μ— 쑰건뢀 μš”μ²­μ„ λ³΄λ‚΄λŠ”λ°, ν•΄λ‹Ή 버전이 λ³€κ²½λ˜μ§€ μ•Šμ•˜μŒμ„ μ˜λ―Έν•œλ‹€.
    • 307 Temporary Redirect: 302와 μœ μ‚¬ν•˜λ‚˜ λ¦¬λ‹€μ΄λ ‰νŠΈ μ‹œ κΈ°μ‘΄ μš”μ²­μ˜ HTTP λ©”μ„œλ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ μ‚¬μš©ν•΄μ•Ό 함을 μ˜λ―Έν•œλ‹€.
    • 308 Permanent Redirect: 301κ³Ό μœ μ‚¬ν•˜λ‚˜ λ¦¬λ‹€μ΄λ ‰νŠΈ μ‹œ κΈ°μ‘΄ μš”μ²­μ˜ HTTP λ©”μ„œλ“œλ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  κ·ΈλŒ€λ‘œ μ‚¬μš©ν•΄μ•Ό 함을 μ˜λ―Έν•œλ‹€.
  • 4xx: ν΄λΌμ΄μ–ΈνŠΈμ˜ 였λ₯˜λ‘œ μ„œλ²„κ°€ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 400 Bad Request: 잘λͺ»λœ λ¬Έλ²•μœΌλ‘œ 인해 μ„œλ²„κ°€ μš”μ²­μ„ 이해할 수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 401 Unauthorized: μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μžμ˜ μš”μ²­μž„μ„ μ˜λ―Έν•œλ‹€.
    • 403 Forbidden: μ„œλ²„κ°€ μš”μ²­μ„ μˆ˜μ‹ ν–ˆμœΌλ‚˜ ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  κΆŒν•œμ΄ μ—†μŒμ„ λ‚˜νƒ€λ‚Έλ‹€.
    • 404 Not Found: μš”μ²­ν•œ λ¦¬μ†ŒμŠ€λ₯Ό 찾을 수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 405 Method Not Allowed: μš”μ²­ν•œ URIλŠ” μ‘΄μž¬ν•˜λ‚˜ ν•΄λ‹Ή URIμ—μ„œ ν—ˆμš©λ˜μ§€ μ•ŠλŠ” HTTP λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ κ²½μš°μ΄λ‹€.
    • 409 Conflict: μš”μ²­μ΄ μ„œλ²„μ˜ ν˜„μž¬ μƒνƒœμ™€ μΆ©λŒν•˜μ—¬ μ™„λ£Œλ  수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 415 Unsupported Media Type: μš”μ²­μ˜ Content-Type 을 μ§€μ›ν•˜μ§€ μ•ŠμŒμ„ μ˜λ―Έν•œλ‹€.
    • 429 Too Many Requests: νŠΉμ • μ‹œκ°„ λ™μ•ˆ λ„ˆλ¬΄ λ§Žμ€ μš”μ²­μ΄ 보낸 μƒνƒœμ΄λ‹€.
  • 5xx: μ„œλ²„ μΈ‘ 였λ₯˜λ‘œ μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 500 Internal Server Error: μ„œλ²„μ— μ—¬μƒμΉ˜ λͺ»ν•œ λ¬Έμ œκ°€ λ°œμƒν•œ μƒνƒœμ΄λ‹€.
    • 502 Bad Gateway: κ°œμ΄νŠΈμ›¨μ΄ λ˜λŠ” ν”„λ‘μ‹œ μ„œλ²„κ°€ μ‹€μ œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ„œλ²„λ‘œλΆ€ν„° 잘λͺ»λœ 응닡을 λ°›μ•˜μŒμ„ μ˜λ―Έν•œλ‹€.
    • 503 Service Unavailable: μ„œλ²„κ°€ κ³ΌλΆ€ν•˜ λ˜λŠ” μœ μ§€λ³΄μˆ˜ λ“±μœΌλ‘œ 인해 μš”μ²­μ„ μ²˜λ¦¬ν•  수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€.
    • 504 Gatewat Timeout: κ²Œμ΄νŠΈμ›¨μ΄ λ˜λŠ” ν”„λ‘μ‹œ μ„œλ²„κ°€ μ‹€μ œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” μ„œλ²„λ‘œλΆ€ν„° μ‹œκ°„ λ‚΄ 응닡을 λ°›μ§€ λͺ»ν–ˆμŒμ„ μ˜λ―Έν•œλ‹€.

πŸ“Œ 생성 방법

1
2
3
4
5
6
7
8
9
10
11
// μƒμ„±μžλ₯Ό μ‚¬μš©ν•˜λŠ” 방법
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "value");
return new ResponseEntity<>(user, headers, HttpStatus.OK);

// λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” 방법
return ResponseEntity
    .status(HttpStatus.CREATED)
    .header("Location", "/users/123")
    .body(createdUser);

μƒμ„±μžμ™€ λΉŒλ” νŒ¨ν„΄ 두 κ°€μ§€ 방법이 μ‘΄μž¬ν•˜λŠ”λ°, 보톡 λΉŒλ” νŒ¨ν„΄μ„ 많이 μ‚¬μš©ν•œλ‹€.

πŸ“Œ μž₯점

ResponseEntity λ₯Ό μ‚¬μš©ν•˜λ©΄ μš”μ²­ 처리 결과에 따라 μ μ ˆν•œ μƒνƒœ μ½”λ“œλ₯Ό μ„€μ •ν•  수 μžˆλ‹€. λ˜ν•œ μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ λ°œμƒν•œ μ˜ˆμ™Έμ— 따라 컨트둀러 κ³„μΈ΅μ—μ„œ ꡬ체적인 μ—λŸ¬ 응닡을 생성할 수 μžˆλ‹€.

This post is licensed under CC BY 4.0 by the author.