본문 바로가기

경험

Express 라우팅 - 라우트 파라미터 정규식

1. 라우트 경로

https://expressjs.com/ko/guide/routing.html

express에서 요청을 등록할 때는 세가지 요소가 필요하다. 

  1. 메서드 종류 (GET, POST, PUT, DELETE 등)
  2. URL 경로
  3. 해당 요청을 처리할 미들웨어 함수

오늘은 그 중에서도 2번인 URL 경로에 대해 알아보도록 하겠다.

 

 URL 경로는 어디에 들어가는가? 바로 요청 등록 함수첫 번째 매개변수로 들어간다.

값은 문자열과 정규식을 지원한다.

 그 중 문자열 형태를 살펴보자.

  • '/test'로 등록하면 /test로 요청할 때 인식하고
  • '/te?st'로 등록하면 /test 혹은 /tst일 때 인식하고 => 0글자 혹은 1글자
  • '/te+st'로 등록하면 /test, /teest, /teeest ...일 때 인식하고 => 1 이상
  • '/te*st'로 등록하면 /tst, /test, /teest ...일 때 인식한다 => 0글자 이상

위와 같이 요청 등록 시 요청 메서드와의 조합을 통해 엔드포인트를 정의한다고 한다~

 

2. req.params는 무엇인가? 

https://expressjs.com/ko/4x/api.html#req.params

앞서 말했다시피, 라우팅을 등록할 때는 URL 경로와 함께 등록한다. 이때 문자 앞에 " : "를 붙이면 변수로 사용할 수 있게 된다.

 

예를 들어, 아래와 같이 등록한다면, /user/CHERRY로 요청했을 때 req.params.name에는 CHERRY가 할당된다.

app.get('/user/:name', (req, res) => { ... })

 

아래와 같이 변수에 할당할 수도 있다. req.parms의 기본값은 {}으로, 비구조화 할당 문법을 사용할 수도 있다.

아래 코드 중 편한 방법으로 사용하길.

// 1
const name = req.params.name;
const key = req.params.key;

// 2
const {key, name} = req.params;

 

3. req.params의 정규식에 따라 요청을 분리할 순 없는가?

 물론, 할 수 있기에 이 글을 썼다.

답은 아주 간단한다. parms 뒤에 괄호로 정규식을 써주면 된다. 예를 들면 '/test/:name([A-Z]+)'를 쓰면 /test 뒤에 대문자로만 이루워진 요청이 들어오면 해당 요청으로 인식하는 것이다.

 

이를 통해 우린 무엇을 얻을 수 있을까?

 일단, 부가적인 예외상황을 줄일 수 있다. 예를 들어 숫자로만 이루워진 변수를 원할 때, 로직 단에서 isNaN(~~)을 써주는 것보단, '/:~~~([0-9]+)'로 써준다면 바로 parseInt(~~~)를 통해 숫자로 사용할 수 있을 것이다. 즉, 불필요한 예외처리가 사라진다.

 

 또한, 로직을 구분할 수 있다. 문자와 숫자, 특정 문자로 시작하는 요청, 특정 문자로 끝나는 요청 등 특별한 경우의 요청만 따로 구분하여 처리할 수 있는 것이다.

 

 이건 내 경우인데, 내 경우는 app.get('/:type', ...)과 app.get('/:id', ...)를 구분해야하는 상황 속에 놓여 있었다.

마침 type은 문자열로만 이뤄져 있고, id는 숫자로만 이루워져 있어 아래와 같이 등록해줬다.

app.get('/:type([A-Za-z]+)', ...)

app.get('/:id([0-9]+)', ...)

자칫하면, 두 미들웨어를 모두 거쳐 오류가 날 수도 있었지만, 정규식 덕분에 간단하게 해결할 수 있었다.

고마워요! 정규식!