경로 변수 처리

주소의 일부분을 변수로 활용하는 경로 변수 처리 방법에 대해서 살펴본다

경로 변수란

경로 변수(Path Variable)란 경로의 일부분에 데이터를 작성하여 변수처럼 사용하는 것을 말한다. 다음과 같은 경우가 경로 변수에 해당한다.

마지막 엔드포인트(/) 뒤에 검색분류를 전달하여 서버에서 이를 수신하고 전달된 값에 맞게 처리하여 목록을 출력하도록 구성되어 있다. 만약 요청 파라미터로 처리했다면 다음과 같은 형태를 가질 것이다.

  • https://www.sysout.co.kr/home/link/list?q=라이브러리

  • https://www.sysout.co.kr/home/link/list?q=디자인

Controller Mapping 구현

프로젝트는 boot03parameter를 사용한다. 생성 과정은 다음 문서에서 확인할 수 있다.

요청 파라미터 처리

DemoController에 다음과 같이 매핑 코드를 추가한다.

@RequestMapping("/test4/name/{name}/score/{score}")
@ResponseBody
public String test4(@PathVariable String name, @PathVariable int score) {
	return "name = " + name + ", score = " + score;
}

접속 테스트

브라우저에 다음 주소를 입력하여 접속하면 정상적으로 데이터가 입력되는 것을 확인할 수 있다.

경로 변수를 구현할 때 더 짧게 구현하고 싶다면 다음과 같이 매핑을 작성하는 것도 가능하다.

@RequestMapping("/test4/{name}/{score}")

하지만 위와 같이 매핑을 구성하면 주소만 보고 해당 데이터를 감지하기 어려운 경우가 발생한다. 예를 들어 name, score가 아니라 name, nickname를 저장하는 매핑을 만들었다고 가정해보면 이유를 알 수 있다.

//1
@RequestMapping("/test4/name/{name}/nickname/{nickname}")
//2
@RequestMapping("/test4/{name}/{nickname}")

1번의 경우 /test4/name/홍길동/nickname/홍반장과 같은 형태를 감지하여 이름과 성별이 명확하게 구분되지만 2번의 경우 /test4/홍길동/홍반장과 같은 형태의 주소를 감지하여 처리하기 때문에 두 데이터 중 이름과 닉네임을 구분하는 것이 어려워 굳이 경로변수를 사용해야 할 이유가 사라진다.

@ModelAttribute 사용

@ModelAttribute로 경로 변수의 데이터도 자동으로 입력받을할 수 있다. DemoController에 확인을 위하여 /test5 매핑을 생성한다.

@RequestMapping("/test5/name/{name}/score/{score}")
@ResponseBody
public String test5(@ModelAttribute DemoEntity entity) {
	return entity.toString();
}

접속 테스트

브라우저에 다음 주소를 입력하여 접속하면 정상적으로 데이터가 입력되는 것을 확인할 수 있다.

경로 변수의 장점

경로 변수를 사용했을 때의 장점은 무엇이 있을까?

깔끔한 주소 구성이 가능하다는 점이 가장 큰 장점이다. 별 것 아닌거 같아도 거추장스러운 주소에 명확한 의미를 부여하여 사용할 수 있다. 따라서 파라미터가 적은 상세 페이지 등이 경로 변수로 구성했을 때 가장 효과적이다.

  • http://www.sysout.co.kr/webbook/1

위와 같은 주소는 1번 웹북을 보여주는 페이지의 주소로 적합하다. 기존의 요청 파라미터 형태로 보여주는 것보다 훨씬 더 간결하다는 장점이 있다.

  • http://www.sysout.co.kr/webbook?webbook_no=1

경로 변수의 단점

경로 변수에는 장점만 있는 것이 아니다. 단점 또한 명확하기 때문에 상황에 맞게 선택하는 것이 중요하다.

  • 사용할 수 없는 글자(ex : /, whitespace, ...)가 존재한다.

  • 데이터가 많아질수록 지저분해진다.

  • 데이터가 선택적으로 있는 상황을 처리하기 어렵다.

경로 변수에 정규표현식 사용

경로 변수에 문자열을 저장할 경우 공백 등의 글자가 문제가 될 수 있다. 또한 원하는 형식만 받을 수도 있으며, 이러한 기능들을 지원하기 위해 경로 변수 선언 구문에 정규표현식을 작성할 수 있다.

경로 변수에 전화번호 형식의 데이터만 수신할 수 있도록 정규표현식을 추가해본다.

Controller Mapping 생성

전화번호는 010으로 시작하며 대시를 포함하여 총 13자리가 입력되도록 구성하였다.

@RequestMapping("/test6/{phone:010-\\d{4}-\\d{4}}")
@ResponseBody
public String test6(@PathVariable String phone) {
	return "phone = " + phone;
}

다음 주소를 입력하여 원하는 전화번호 형식일 경우만 데이터가 수신되고 나머지는 404 not found가 발생하는 것을 확인할 수 있다.

Last updated