엔드포인트란
엔드포인트는 외부(클라이언트)에서 소프트웨어 서비스나 API에 접근할 수 있도록 공개된 통신의 종단점-끝점을 의미한다.
Spring에서의 엔드포인트
Spring MVC나 Spring Boot에서 만드는 Controller 안의 메서드 하나하나가 엔드포인트이다.
- URL 경로(Path): 어디로 갈 것인가 (예:
/api/users) - HTTP 메서드(Method): 어떤 행위를 할 것인가 (예:
GET,POST)
예시
다음은 TagController.java 코드의 일부이다. 이 코드는 태그라는 리소스를 관리하기 위해 여러 엔드포인트를 갖고 있다.
package com.moyalist.backend.controller;
import com.moyalist.backend.dto.QuestionResponseDto;
import com.moyalist.backend.dto.TagRequestDto;
import com.moyalist.backend.dto.TagResponseDto;
import com.moyalist.backend.service.TagService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api/tags")
@RequiredArgsConstructor
public class TagController {
private final TagService tagService;
@GetMapping
public ResponseEntity<List<TagResponseDto>> getAllTags() {
// 모든 태그 반환
return ResponseEntity.ok(tagService.getAllTags());
}
@GetMapping("/{id}")
public ResponseEntity<TagResponseDto> getTag(@PathVariable Long id) {
// 특정 태그 반환
return ResponseEntity.ok(tagService.getTag(id));
}
@PostMapping
public ResponseEntity<TagResponseDto> createTag(@RequestBody Map<String, String> request) {
Long userId = Long.parseLong(request.get("userId"));
String name = request.get("name");
return ResponseEntity.ok(tagService.createTag(userId, name));
}
@PutMapping("/{id}")
public ResponseEntity<TagResponseDto> updateTag(@RequestBody TagRequestDto request, @PathVariable Long id) {
return ResponseEntity.ok(tagService.updateTag(id, request));
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteTag(@PathVariable Long id) {
tagService.deleteTag(id);
return ResponseEntity.noContent().build();
}
@GetMapping("/{id}/questions")
public ResponseEntity<List<QuestionResponseDto>>
getQuestionByTagId(@PathVariable Long id) {
return ResponseEntity.ok(tagService.getQuestionsByTagId(id));
}
}
Tag 엔드포인트
클래스 상단에 @RequestMapping("/api/tags")가 선언되어 있으므로, 모든 엔드포인트의 기본 주소는 /api/tags로 시작한다.
| HTTP 메서드 | 엔드포인트 경로(Path) | 역할 |
|---|---|---|
| GET | /api/tags |
저장된 모든 태그 목록을 가져옴 |
| GET | /api/tags/{id} |
특정 ID를 가진 태그 하나를 조회함 |
| POST | /api/tags |
새로운 태그를 생성함 |
| PUT | /api/tags{id} |
기존 태그 정보를 수정함 |
| DELETE | /api/tags/{id} |
특정 태그를 삭제함 |
| GET | /api/tags/{id}/questions |
특정 태그가 달린 궁금증 목록을 가져옴 |
경로 변수
@GetMapping("/{id}")나@DeleteMapping("/{id}")에서 보이는{id}는 고정된 주소가 아니라 변하는 값이다.- 사용자가
/api/tags/10으로 요청을 보내면, Spring은{id}자리에10을 넣어서getTag(10L)메서드를 실행한다. - 이를 동적 엔드포인트라고 부르기도 한다.
같은 경로, 다른 목적
/api/tags/{id}라는 똑같은 주소를 사용하는 엔드포인트가 3개나 있다(GET, PUT, DELETE).- GET으로 보내면 조회를 하고
- PUT으로 보내면 수정을 하며
- DELETE로 보내면 삭제를 한다.
- 이렇게 같은 URL이라도 HTTP 메서드에 따라 행위를 달리하는 것이 RESTful API 설계의 핵심이다.
Request Body
createTag메서드를 보면@RequestBody Map<String, String> request가 있다.- 엔드포인트는 단순 주소만 있는 게 아니라, 사용자가 보내는 JSON 데이터가 서버로 들어오는 통로 역할도 한다.