Skip to content
Our Sponsors
Open in Anthropic

Routing ​

웹 서버는 요청의 경로와 메서드를 사용하여 올바른 리소스를 찾습니다. 이를 "라우팅"이라고 합니다.

HTTP 동사 메서드, 경로 및 일치할 때 실행할 함수로 경로를 정의할 수 있습니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .get('/', 'hello')
    .get('/hi', 'hi')
    .listen(3000)

http://localhost:3000으로 이동하여 웹 서버에 액세스할 수 있습니다.

기본적으로 웹 브라우저는 페이지를 방문할 때 GET 메서드를 보냅니다.

localhost

GET

TIP

위의 대화형 브라우저를 사용하여 파란색 강조 영역 위로 마우스를 가져가면 각 경로 간의 다른 결과를 볼 수 있습니다.

Path type ​

Elysia의 경로는 3가지 유형으로 그룹화할 수 있습니다:

  • static paths - 리소스를 찾기 위한 정적 문자열
  • dynamic paths - 세그먼트가 모든 값이 될 수 있음
  • wildcards - 특정 지점까지의 경로가 무엇이든 될 수 있음

모든 경로 유형을 함께 사용하여 웹 서버의 동작을 구성할 수 있습니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .get('/id/1', 'static path')
    .get('/id/:id', 'dynamic path')
    .get('/id/*', 'wildcard path')
    .listen(3000)
localhost

GET

Static Path ​

정적 경로는 서버에서 리소스를 찾기 위한 하드코딩된 문자열입니다.

ts
import { Elysia } from 'elysia'

new Elysia()
	.get('/hello', 'hello')
	.get('/hi', 'hi')
	.listen(3000)

Dynamic path ​

동적 경로는 일부를 일치시키고 값을 캡처하여 추가 정보를 추출합니다.

동적 경로를 정의하려면 콜론 :과 그 뒤에 이름을 사용할 수 있습니다.

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
get
('/id/:id', ({
params
: {
id
} }) =>
id
)
.
listen
(3000)

여기서 동적 경로는 /id/:id로 생성됩니다. 이는 Elysia에게 /id/1, /id/123, /id/anything과 같은 값으로 :id 세그먼트의 값을 캡처하도록 지시합니다.

localhost

GET

1

요청 시 서버는 다음과 같이 응답해야 합니다:

PathResponse
/id/11
/id/123123
/id/anythinganything
/id/anything?name=saltanything
/idNot Found
/id/anything/restNot Found

동적 경로는 나중에 사용할 수 있는 ID와 같은 것을 포함하는 데 적합합니다.

명명된 변수 경로를 경로 매개변수 또는 줄여서 params라고 합니다.

Multiple path parameters ​

원하는 만큼 많은 경로 매개변수를 가질 수 있으며, 그러면 params 객체에 저장됩니다.

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
get
('/id/:id', ({
params
: {
id
} }) =>
id
)
.
get
('/id/:id/:name', ({
params
: {
id
,
name
} }) =>
id
+ ' ' +
name
)
.
listen
(3000)


localhost

GET

1

서버는 다음과 같이 응답합니다:

PathResponse
/id/11
/id/123123
/id/anythinganything
/id/anything?name=saltanything
/idNot Found
/id/anything/restanything rest

Optional path parameters ​

때때로 정적 경로와 동적 경로가 같은 핸들러를 해결하기를 원할 수 있습니다.

매개변수 이름 뒤에 물음표 ?를 추가하여 경로 매개변수를 선택적으로 만들 수 있습니다.

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
get
('/id/:id?', ({
params
: {
id
} }) => `id ${
id
}`)
.
listen
(3000)

localhost

GET

Wildcards ​

동적 경로는 단일 세그먼트를 캡처할 수 있지만 와일드카드는 경로의 나머지 부분을 캡처할 수 있습니다.

와일드카드를 정의하려면 별표 *를 사용할 수 있습니다.

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
get
('/id/*', ({
params
}) =>
params
['*'])
.
listen
(3000)

localhost

GET

1

Path priority ​

Elysia는 다음과 같은 경로 우선순위를 가집니다:

  1. static paths
  2. dynamic paths
  3. wildcards

경로가 정적 경로로 해결되고 동적 경로가 있는 경우, Elysia는 동적 경로가 아닌 정적 경로를 해결합니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .get('/id/1', 'static path')
    .get('/id/:id', 'dynamic path')
    .get('/id/*', 'wildcard path')
    .listen(3000)
localhost

GET

HTTP Verb ​

HTTP는 주어진 리소스에 대해 수행할 원하는 작업을 나타내기 위한 일련의 요청 메서드를 정의합니다.

여러 HTTP 동사가 있지만 가장 일반적인 것은 다음과 같습니다:

GET ​

GET을 사용하는 요청은 데이터만 검색해야 합니다.

POST ​

지정된 리소스에 페이로드를 제출하여 종종 상태 변경이나 부작용을 일으킵니다.

PUT ​

요청의 페이로드를 사용하여 대상 리소스의 모든 현재 표현을 대체합니다.

PATCH ​

리소스에 부분 수정을 적용합니다.

DELETE ​

지정된 리소스를 삭제합니다.


각각의 다른 동사를 처리하기 위해 Elysia는 Elysia.get과 유사하게 기본적으로 여러 HTTP 동사에 대한 내장 API를 가지고 있습니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .get('/', 'hello')
    .post('/hi', 'hi')
    .listen(3000)
localhost

GET

Elysia HTTP 메서드는 다음 매개변수를 받습니다:

  • path: 경로 이름
  • function: 클라이언트에 응답하는 함수
  • hook: 추가 메타데이터

HTTP 메서드에 대해 더 자세히 알아보려면 HTTP Request Methods를 참조하세요.

Custom Method ​

Elysia.route를 사용하여 사용자 정의 HTTP 메서드를 허용할 수 있습니다.

typescript
import { Elysia } from 'elysia'

const app = new Elysia()
    .get('/get', 'hello')
    .post('/post', 'hi')
    .route('M-SEARCH', '/m-search', 'connect') 
    .listen(3000)
localhost

GET

Elysia.route는 다음을 받습니다:

  • method: HTTP 동사
  • path: 경로 이름
  • function: 클라이언트에 응답하는 함수
  • hook: 추가 메타데이터

TIP

RFC 7231에 따르면 HTTP 동사는 대소문자를 구분합니다.

Elysia로 사용자 정의 HTTP 동사를 정의할 때 대문자 규칙을 사용하는 것이 좋습니다.

ALL method ​

Elysia는 Elysia.get 및 Elysia.post와 동일한 API를 사용하여 지정된 경로에 대한 모든 HTTP 메서드를 처리하기 위한 Elysia.all을 제공합니다.

typescript
import { Elysia } from 'elysia'

new Elysia()
    .all('/', 'hi')
    .listen(3000)
localhost

GET

경로와 일치하는 모든 HTTP 메서드는 다음과 같이 처리됩니다:

PathMethodResult
/GEThi
/POSThi
/DELETEhi

Handle ​

대부분의 개발자는 API를 테스트하기 위해 Postman, Insomnia 또는 Hoppscotch와 같은 REST 클라이언트를 사용합니다.

그러나 Elysia는 Elysia.handle을 사용하여 프로그래밍 방식으로 테스트할 수 있습니다.

typescript
import { Elysia } from 'elysia'

const app = new Elysia()
    .get('/', 'hello')
    .post('/hi', 'hi')
    .listen(3000)

app.handle(new Request('http://localhost/')).then(console.log)

Elysia.handle은 서버로 전송된 실제 요청을 처리하는 함수입니다.

TIP

단위 테스트의 모의와 달리 서버로 전송된 실제 요청처럼 동작할 것으로 기대할 수 있습니다.

그러나 단위 테스트를 시뮬레이션하거나 만드는 데도 유용합니다.

Group ​

웹 서버를 만들 때 동일한 접두사를 공유하는 여러 경로가 있는 경우가 많습니다:

typescript
import { Elysia } from 'elysia'

new Elysia()
    .post('/user/sign-in', 'Sign in')
    .post('/user/sign-up', 'Sign up')
    .post('/user/profile', 'Profile')
    .listen(3000)
localhost

POST

이는 Elysia.group으로 개선할 수 있으며, 여러 경로를 함께 그룹화하여 동시에 접두사를 적용할 수 있습니다:

typescript
import { 
Elysia
} from 'elysia'
new
Elysia
()
.
group
('/user', (
app
) =>
app
.
post
('/sign-in', 'Sign in')
.
post
('/sign-up', 'Sign up')
.
post
('/profile', 'Profile')
) .
listen
(3000)
localhost

POST

이 코드는 첫 번째 예제와 동일하게 동작하며 다음과 같이 구성되어야 합니다:

PathResult
/user/sign-inSign in
/user/sign-upSign up
/user/profileProfile

.group()은 그룹과 가드를 함께 사용하는 보일러플레이트를 줄이기 위해 선택적 가드 매개변수를 받을 수도 있습니다:

typescript
import { 
Elysia
,
t
} from 'elysia'
new
Elysia
()
.
group
(
'/user', {
body
:
t
.
Literal
('Rikuhachima Aru')
}, (
app
) =>
app
.
post
('/sign-in', 'Sign in')
.
post
('/sign-up', 'Sign up')
.
post
('/profile', 'Profile')
) .
listen
(3000)

그룹화된 가드에 대한 자세한 정보는 scope에서 확인할 수 있습니다.

Prefix ​

생성자에 prefix를 제공하여 그룹을 별도의 플러그인 인스턴스로 분리하여 중첩을 줄일 수 있습니다.

typescript
import { Elysia } from 'elysia'

const users = new Elysia({ prefix: '/user' })
    .post('/sign-in', 'Sign in')
    .post('/sign-up', 'Sign up')
    .post('/profile', 'Profile')

new Elysia()
    .use(users)
    .get('/', 'hello world')
    .listen(3000)
localhost

GET