요청과 응답
입력을 읽고 출력을 반환해 보세요.
요청과 응답은(는) 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.