반응형
1. Location
헤더란?
Location
헤더는 HTTP 응답 헤더 중 하나로, 서버가 클라이언트에게 새로 생성된 리소스의 URI를 명시적으로 전달할 때 사용됩니다. 주로 POST
요청으로 리소스를 생성한 후 응답 코드 201(Created)와 함께 제공되며, 클라이언트가 생성된 리소스를 쉽게 접근할 수 있도록 돕습니다.
2. Location
헤더가 필요한 이유
RESTful API 설계에서 Location
헤더는 다음과 같은 이유로 유용합니다.
- 리소스 위치 명확화: 클라이언트는
Location
헤더에 포함된 URI를 통해 서버가 생성한 리소스의 정확한 위치를 알 수 있습니다. 예를 들어, 차단된 계정에 대한 URI를 전달받으면 클라이언트는 해당 URI를 통해 차단 상태를 쉽게 조회하거나 해제 요청을 할 수 있습니다. - 후속 작업의 간편화: 차단 리소스에 대한 추가 작업(조회, 해제 등)을 쉽게 수행할 수 있습니다. 클라이언트는 URI를 사용하여 후속 요청을 간편하게 처리할 수 있습니다.
- RESTful 설계 원칙 준수: RESTful API 설계에서 생성된 리소스의 위치를 클라이언트에게 제공함으로써 명확하고 일관된 리소스 관리를 할 수 있습니다.
3. Location
헤더 사용 예시: 계정 차단
Java Spring Boot에서 계정을 차단하는 API에서 Location
헤더를 포함하여 새로 생성된 차단 리소스 URI를 제공하는 방법을 살펴보겠습니다.
차단 API 예시 코드
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
@PostMapping("/api/v1/block")
public ResponseEntity<Void> block(@RequestBody BlockRequest blockRequest, @CurrentProfile Long blockerProfileId) {
Block block = blockService.create(blockRequest, blockerProfileId); // 차단 리소스 생성
URI location = ServletUriComponentsBuilder.fromCurrentRequest() // 현재 요청 URI 가져오기
.path("/{blockId}") // 새로 생성된 리소스의 ID 경로 추가
.buildAndExpand(block.getBlockId()) // {blockId} 부분에 실제 ID 값 설정
.toUri(); // URI 객체로 변환
return ResponseEntity.created(location).build(); // 201 응답과 Location 헤더 포함
}
ServletUriComponentsBuilder.fromCurrentRequest()
: 현재 요청 URI를 기반으로 새 URI 생성.path("/{blockId}")
: URI 끝에/blockId
를 추가하여 새로 생성된 차단 리소스의 URI 형식을 만듭니다..buildAndExpand(block.getBlockId())
:{blockId}
부분에 실제 생성된 차단 ID를 채워 최종 URI를 완성합니다..toUri()
: URI 객체로 변환하여ResponseEntity.created(location).build()
와 함께 응답을 생성합니다.
응답 예시
위의 코드가 실행되면, 서버는 다음과 같은 형태의 응답을 클라이언트에게 보냅니다.
HTTP/1.1 201 Created
Location: http://yourserver/api/v1/block/12345
4. 결론
Location
헤더는 RESTful API에서 새로 생성된 리소스의 위치를 명확히 전달함으로써, 클라이언트가 리소스에 쉽게 접근하고 후속 작업을 효율적으로 수행할 수 있도록 돕습니다. 계정 차단과 같은 리소스 생성 시 Location
헤더를 포함하면 클라이언트에게 보다 직관적이고 명확한 API 경험을 제공합니다.
반응형
'Spring > Spring' 카테고리의 다른 글
[Spring] JWT 서명 검증의 원리 (0) | 2024.07.24 |
---|---|
Spring Data JPA: 메서드 이름 기반 쿼리와 @Query 애노테이션 기반 쿼리 비교 (0) | 2024.06.06 |
[GitHub] 빈 패키지 commit 하기(.gitkeep) (0) | 2024.06.02 |
[GitHub] 협업시 GitHub 커밋 유형별 규칙 (0) | 2024.06.02 |
[Spring] 도메인형 패키지 구조로의 전환 (0) | 2024.06.01 |