[ODOP] 66일차 - Spring 직접 구현 시 패턴 매치 문제

Spring 을 직접 구현하며 패턴 매치를 수행하는 구간에서 발생한 문제와 해결 방법을 고민하며 작성 한 글입니다. 내일은 AntPathMatcher 를 분석 해 볼 예정입니다.

[ODOP] 66일차 - Spring 직접 구현 시 패턴 매치 문제

Spring 구현 시 패턴 매치 문제

Spring 을 구현해보는 도중 문제가 발생했다

URL 패턴을 분석하는 구간이 올바르게 동작하지 않는다는 것인데, 아래 코드는 Controller 이다

import lombok.RequiredArgsConstructor;
import wsffs.springframework.beans.annotation.Component;
import wsffs.springframework.boot.web.servlet.anno.arguments.PathVariable;
import wsffs.springframework.boot.web.servlet.anno.mappings.GetMapping;
import wsffs.springframework.boot.web.servlet.anno.mappings.PostMapping;
import wsffs.springframework.boot.web.servlet.anno.present.RestController;

@Component
@RestController
@RequiredArgsConstructor
public class DummyController {

  private final DummyService dummyService;

  @GetMapping("/api/dummies")
  public String getDummies() {
    return dummyService.get().toString();
  }

  @PostMapping("/api/dummies")
  public String postDummies() {
    return "post /api/dummies";
  }

  @GetMapping("/api/dummies/{dummyId}")
  public String getPathVariable(@PathVariable("dummyId") Long dummyId) {
    return "GET /api/dummies/{dummyId} | " + dummyId;
  }
}

코드를 잘 보면 3개의 api 가 존재한다

  • GET: /api/dummies
  • POST: /api/dummies
  • GET: /api/dummies/{dummyId}

DummyController 는 DummyService 의 의존성을 주입받아 비즈니스를 수행한다

여기까지 보면 Spring 이 해주는 일을 모두 해주는 것 처럼 보인다

하지만 치명적인 문제가 있다

아래는 3개의 api 를 직접 실행 한 결과이다

올바르게 매핑되고 있지 않다는 것을 알 수 있다

Spring 에 익숙한 사람들은 '어 분명 매핑 제대로 하신 것 같은데 왜 문제가 있지?' 라고 생각할 수 있지만, 위 코드는 직접 구현한 코드라서 스프링처럼 동작하지 않을 수 있다

따라서, PathVariable 이 제대로 적용되지 않고 있는 것이다

결과적으로 이는 패턴의 매치가 제대로 이루어지지 않는 탓이다.

Spring 은 사용자의 api 요청받아서 실행 할 때 요청에 대한 path 를 확인하고, 그에 맞는 메서드를 실행한다

따라서 우리는 @GetMapping, @PostMapping 만으로도 간단하게 api 를 구성 할 수 있는 것이다

그런데 PathVariable 은 특수한 규칙이 존재한다

@GetMapping("/api/dummies/{dummyId}")

생각해보자, 사용자의 요청이 들어왔다

GET: /api/dummies/10000

익숙한 개발자는 이 path 를 보고 "아 dummyId 에 10000 이 들어가겠구나" 라고 유추가 가능 할 것이다

그런데 스프링은 이 동작을 어떻게 수행할까?

좀 더 자세히 말하면, /api/dummies/{dummyId}/api/dummies/10000 이랑 '동등 하다' 라는 결과를 어떻게 알 수 있는 것일까?


내일 Spring 에서 AntPathMatcher 를 통해 패턴 매치가 이루어지는 것을 알아보자