0Pricing
Scala for Backend Engineering & Functional Programming · 강의

라우트와 HttpRoutes

함수형 방식으로 엔드포인트를 정의해 보세요.

라우트와 HttpRoutes은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

http4s란 무엇인가

http4s는 cats-effect와 fs2 스트림을 기반으로 만든 Scala용 순수 함수형 HTTP 라이브러리입니다. 요청과 응답은 변경할 수 없는 값이며, 효과는 IO와 같은 다형적 효과 형식 F[_]에 담깁니다.

서블릿을 변경하는 대신 요청을 효과가 적용된 선택적 응답으로 변환하는 함수로 HTTP 서비스를 표현합니다.

HttpRoutes 형식

핵심 추상화는 Kleisli[OptionT[F, *], Request[F], Response[F]]의 별칭인 HttpRoutes[F]입니다. OptionT는 일치하지 않을 수 있는 경로를 모델링하며, 이 경우 응답을 반환하지 않습니다.

이 시그니처를 직접 작성하는 경우는 드뭅니다. 대신 HttpRoutes.of 생성자와 부분 함수로 경로를 만듭니다.

import cats.effect.IO
import org.http4s._
import org.http4s.dsl.io._

val routes: HttpRoutes[IO] = HttpRoutes.of[IO] {
  case GET -> Root / "hello" => Ok("hi")
}

http4s DSL

DSL 임포트 org.http4s.dsl.io._는 GET, Root, 경로 구분 기호 /와 같은 패턴 추출기와 Ok, NotFound와 같은 응답 생성기를 가져옵니다.

경로는 PartialFunction[Request[F], F[Response[F]]]입니다. 일치하지 않는 사례는 그대로 다음 사례로 넘어갑니다.

import org.http4s.dsl.io._

HttpRoutes.of[IO] {
  case GET -> Root => Ok("root")
  case GET -> Root / "ping" => Ok("pong")
}

경로 일치시키기

경로 패턴은 왼쪽에서 오른쪽으로 읽습니다. Root는 맨 앞의 슬래시이고, 각 / "segment"는 하나의 리터럴 경로 세그먼트와 일치합니다.

화살표 ->는 HTTP 메서드와 경로를 구분합니다. 따라서 GET -> Root / "users"는 GET /users와 일치합니다.

HttpRoutes.of[IO] {
  case GET -> Root / "users" => Ok("all users")
  case GET -> Root / "users" / "me" => Ok("current user")
}

경로 변수

경로에서 소문자로 된 바인더는 해당 세그먼트를 String으로 캡처합니다. 여기서 id는 /users/ 뒤에 나타나는 값을 바인딩합니다.

캡처된 세그먼트는 항상 문자열입니다. 더 풍부한 형식으로 직접 파싱하거나 다음에 나오는 추출기 객체를 사용해야 합니다.

HttpRoutes.of[IO] {
  case GET -> Root / "users" / id =>
    Ok(s"user $id")
}

형식이 지정된 경로 추출기

http4s는 IntVar와 LongVar 같은 추출기를 제공하며, 세그먼트를 해당 형식으로 파싱할 수 있을 때만 일치합니다. 숫자가 아닌 세그먼트가 나오면 다음 사례로 넘어갑니다.

UUID와 같은 도메인 형식에는 unapply를 사용해 사용자 지정 추출기를 정의할 수 있습니다.

HttpRoutes.of[IO] {
  case GET -> Root / "users" / IntVar(id) =>
    Ok(s"numeric user $id")
}

메서드 일치시키기

-> 앞의 메서드 추출기에는 GET, POST, PUT, DELETE, PATCH 등을 사용할 수 있습니다. 같은 경로라도 메서드가 다르면 별도의 사례가 됩니다.

경로는 일치하지만 메서드가 일치하지 않으면 http4s가 자동으로 405 Method Not Allowed를 응답합니다.

HttpRoutes.of[IO] {
  case GET -> Root / "items" => Ok("list")
  case POST -> Root / "items" => Created("made")
  case DELETE -> Root / "items" / IntVar(i) => NoContent()
}

경로 결합하기

HttpRoutes[F]는 SemigroupK를 구성하므로 <+> 연산자로 여러 경로 그룹을 조합할 수 있습니다. 응답을 생성하는 첫 번째 그룹이 선택됩니다.

이를 통해 기능별로 경로를 별도의 값으로 나눈 뒤 한곳에서 병합할 수 있습니다.

import cats.syntax.semigroupk._

val all = userRoutes <+> itemRoutes <+> healthRoutes

경로를 HttpApp으로 변환하기

서버에는 부분 함수가 아니라 전체 함수가 필요합니다. HttpRoutes[F]는 일치하는 경로가 없을 때 404를 제공하는 .orNotFound를 사용해 HttpApp[F]으로 변환합니다.

HttpApp[F]은 Kleisli[F, Request[F], Response[F]]이며 항상 응답을 반환합니다.

import org.http4s.HttpApp

val app: HttpApp[IO] = routes.orNotFound

미들웨어로 감싸기

미들웨어는 HttpRoutes[F] => HttpRoutes[F] 형식의 함수입니다(HttpApp에 적용할 수도 있습니다). 경로 로직을 건드리지 않고 서비스를 감싸 로깅, CORS, gzip 또는 인증을 추가합니다.

기본 제공 예로는 org.http4s.server.middleware의 Logger, CORS, GZip이 있습니다.

import org.http4s.server.middleware.Logger

val logged = Logger.httpApp(logHeaders = true, logBody = false)(app)

경로에서 쿼리 매개변수 사용하기

쿼리 매개변수는 QueryParamDecoderMatcher를 확장한 매처 객체로 일치시킵니다. 경로 패턴에서 :? 뒤에 나타납니다.

없을 수도 있는 매개변수에는 OptionalQueryParamDecoderMatcher를 사용하세요. 이 경우 Option을 얻습니다.

object NameParam extends QueryParamDecoderMatcher[String]("name")

HttpRoutes.of[IO] {
  case GET -> Root / "hi" :? NameParam(n) => Ok(s"hi $n")
}

빠른 확인

경로 조합에 대한 이해도를 확인해 보세요.

요약

HttpRoutes.of와 DSL로 경로를 만들고, 메서드와 경로를 일치시키며, IntVar와 매처로 변수를 캡처하고, <+>로 그룹을 조합했습니다.

경로는 부분 함수입니다. .orNotFound를 사용하면 전체 함수인 HttpApp이 되며, 미들웨어는 여러 서비스에 공통으로 필요한 기능을 추가하도록 서비스를 감쌉니다.

자주 묻는 질문

“라우트와 HttpRoutes” 강의는 무료인가요?

네 — “라우트와 HttpRoutes” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“라우트와 HttpRoutes”에서 뭘 배우나요?

함수형 방식으로 엔드포인트를 정의해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“라우트와 HttpRoutes” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 라우트와 HttpRoutes
  2. 요청과 응답
  3. JSON 엔드포인트
  4. 애플리케이션 제공하기
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기