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.getElysia.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