http4s에서 어떻게 IO#unsafeRunSync
없이 JSON 응답을 반환할 수 있는지 문의가 들어와서 보충설명 드립니다:
슬라이드에서 잠깐 보여드렸던 것처럼 http4s 서버는 Request[F] => F[Response[F]]
형태의 순수 함수입니다. 미들웨어나 루트 합성을 위해 Kleisli
나 OptionT
같은 데이터 타입들이 추가로 쓰이기는 하지만 결국 Request에서 Response로 가는 순수 함수이고, 중간에 데이터베이스 연결 같은 이펙트가 발생할 수 있기 때문에 Request => Response
대신 Request => F[Response]
와 같은 형태를 띄고 있다고 생각하시면 돼요. 아래같은 모듈이라고 생각하셔도 되겠네요.
trait HttpServer[F[_]] {
def handleRequest(req: Request): F[Response]
}