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

요청과 응답

입력을 읽고 출력을 반환해 보세요.

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

값으로서의 요청

http4s에서 Request[F]는 메서드, URI, 헤더, HTTP 버전, 스트리밍 본문을 담은 변경할 수 없는 값입니다. 순수 접근자를 사용해 검사하며 제자리에서 변경하지 않습니다.

요청을 변경하려면 withHeaders, withUri 또는 이와 유사한 조합자로 복사본을 만듭니다.

val r: Request[IO] = Request[IO](
  method = Method.GET,
  uri = uri"/health"
)

스트리밍 본문

요청 또는 응답의 본문은 fs2.Stream[F, Byte]입니다. 본문은 지연 방식으로 효과와 함께 소비되므로 대용량 페이로드 전체를 메모리에 올려둘 필요가 없습니다.

일반적으로 원시 바이트를 직접 다루지 않고 EntityDecoder가 대신 디코딩하도록 합니다.

// raw access (rarely needed)
val bytes: fs2.Stream[IO, Byte] = request.body

본문 디코딩하기

EntityDecoder[F, A]는 본문 스트림을 A로 변환하는 방법을 알고 있습니다. req.as[A]를 호출해 디코딩하면 F[A]가 반환되며, 본문 형식이 잘못된 경우 효과가 실패합니다.

String용 기본 디코더가 제공되며, 더 풍부한 디코더는 JSON 모듈에서 제공됩니다.

HttpRoutes.of[IO] {
  case req @ POST -> Root / "echo" =>
    req.as[String].flatMap(body => Ok(body))
}

요청 바인딩하기

사례 내부에서 요청 객체에 접근하려면 @로 바인딩하세요. 여기서 req는 전체 요청의 이름이면서 패턴은 여전히 메서드와 경로에 일치합니다.

바인더가 없으면 분해된 부분만 사용할 수 있어 본문이나 헤더를 읽을 수 없습니다.

HttpRoutes.of[IO] {
  case req @ PUT -> Root / "name" =>
    req.as[String].flatMap(n => Ok(s"set $n"))
}

헤더 읽기

헤더는 request.headers에 있습니다. 형식이 지정된 헤더 모델에는 headers.get[H]를 사용하고, 임의의 이름에는 headers.get(CIString("X-Custom"))을 사용하세요.

Authorization과 Content-Type 같은 형식이 지정된 헤더는 값을 대신 파싱하고 검증합니다.

import org.http4s.headers.Authorization

val auth: Option[Authorization] =
  request.headers.get[Authorization]

응답 만들기

Ok, Created, NotFound와 같은 DSL 응답 생성기는 F[Response[F]]를 반환하는 함수입니다. 인수를 전달하면 EntityEncoder를 통해 본문이 설정됩니다.

각 생성기는 상태 코드에 대응하므로 Created(...)는 201을 생성합니다.

Ok("all good")          // 200
Created("made it")      // 201
NotFound("missing")     // 404

상태 코드 직접 지정하기

편의 생성기가 없거나 사용자 지정이 필요한 상태 코드에는 명시적인 Status로 Response[F]를 만들고 withEntity를 연결하세요.

이를 통해 하나의 표현식에서 상태 코드, 헤더, 본문을 모두 제어할 수 있습니다.

import org.http4s.{Response, Status}

Response[IO](Status.Accepted)
  .withEntity("queued")
  .pure[IO]

본문 인코딩하기

EntityEncoder[F, A]는 값을 응답 본문으로 직렬화하고 Content-Type을 설정합니다. String 및 바이트 인코더가 기본 제공되며 JSON 인코더는 circe에서 제공합니다.

Ok(value)에 값을 전달하면 http4s가 암시적으로 인코더를 찾습니다.

// String encoder is implicit; sets text/plain
val resp: IO[Response[IO]] = Ok("plain text body")

응답 헤더 설정하기

헤더를 생성기에 추가 인수로 전달하거나 응답 효과에 .map(_.putHeaders(...))를 연결해 헤더를 추가하세요.

형식이 지정된 헤더 모델은 올바르게 형식화된 값을 보장합니다. 예를 들어 201 Created 응답의 Location 헤더가 있습니다.

import org.http4s.headers.Location

Created("ok").map(_.putHeaders(
  Location(uri"/items/42")
))

디코딩 실패 처리하기

본문을 디코딩할 수 없으면 req.as[A]가 F 효과를 실패시킵니다. req.attemptAs[A].value를 사용하면 F[Either[DecodeFailure, A]]를 얻을 수 있으며, 왼쪽 값인 경우 400으로 응답합니다.

이렇게 하면 잘못된 입력 처리를 명시적이고 전체적으로 유지할 수 있습니다.

req.attemptAs[String].value.flatMap {
  case Right(b) => Ok(b)
  case Left(_)  => BadRequest("bad body")
}

쿠키와 리디렉션

response.addCookie(ResponseCookie(name, value))로 쿠키를 설정하세요. 리디렉션에는 3xx 생성기와 Location 헤더를 사용합니다.

SeeOther(Location(uri))는 관용적인 게시물-리디렉션-가져오기 응답인 303을 수행합니다.

import org.http4s.headers.Location

SeeOther(Location(uri"/login"))
  .map(_.addCookie("sid", "abc123"))

빠른 확인

안전한 본문 디코딩에 대해 생각해 보세요.

요약

요청과 응답은 스트리밍 fs2 본문을 포함하는 변경 불가능한 값입니다. EntityDecoder를 통해 as/attemptAs로 디코딩하고, EntityEncoder로 인코딩합니다.

빌더로 상태 코드를 설정하고, 타입이 지정된 헤더는 안전하게 유지되며, 쿠키와 리디렉션은 단순한 응답 변환으로 처리됩니다.

자주 묻는 질문

“요청과 응답” 강의는 무료인가요?

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

“요청과 응답”에서 뭘 배우나요?

입력을 읽고 출력을 반환해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

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

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

“요청과 응답” 강의는 얼마나 걸리나요?

대부분의 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(으)로 돌아가기