엔드 포인트(Endpoint)

엔드포인트란

엔드포인트는 외부(클라이언트)에서 소프트웨어 서비스나 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));
    }
}

TagController.java

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 데이터가 서버로 들어오는 통로 역할도 한다.