1. 라우트 경로
https://expressjs.com/ko/guide/routing.html
express에서 요청을 등록할 때는 세가지 요소가 필요하다.
- 메서드 종류 (GET, POST, PUT, DELETE 등)
- URL 경로
- 해당 요청을 처리할 미들웨어 함수
오늘은 그 중에서도 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]+)', ...)
자칫하면, 두 미들웨어를 모두 거쳐 오류가 날 수도 있었지만, 정규식 덕분에 간단하게 해결할 수 있었다.
고마워요! 정규식!
'경험' 카테고리의 다른 글
[React / Github Pages] BrowserRouter basename 오류 (0) | 2023.06.02 |
---|---|
[JavaScript 정규식] 태그, 태그 안 내용까지 지우기 (0) | 2023.04.27 |
서버 이관 - 서버 이관 처음할 때 필요했던 것들 (0) | 2023.02.17 |
[Spring][MySql] Unknown system variable 'query_cache_size’ (0) | 2022.10.25 |
[MySql] [Oracle] 정렬 시 Null 위치 컨트롤하기 (0) | 2022.09.13 |