Phoenix API로 낙타 케이스와 뱀 케이스를 자동 변환

12295 단어 ElixirPhoenix
Phoenix에서 API 서버를 구축하면 기본적으로 JSON 응답에 포함된 키의 이름은 뱀 케이스입니다. 그러나 JSON 응답을 다루는 클라이언트 측에서는 언어 편의상 캬멜 케이스를 사용하고 싶은 경우를 생각할 수 있습니다.

이것을 쉽게 실현하는 것이 proper_case 입니다. proper_case 는 맵의 키를 뱀과 낙타 사이에 서로 변환하는 라이브러리이지만, 이것을 Phoenix 프로젝트에서 사용하는 것으로 낙타와 뱀의 자동 변환을 가능하게 합니다.

다음 기사에서는 proper_case를 사용하여 낙타와 뱀으로 변환하는 방법에 대해 설명합니다.

환경



본 기사의 내용은, 이하의 환경에서 동작 확인을 하고 있습니다.
  • Elixir: 1.7.2
  • OTP: 21.0.5

  • API 서버 준비



    설명을 단순화하기 위해 blogscomments라는 테이블이있는 블로그 API를 가정해 보겠습니다.
    mix phx.new 명령에서 json_app 라는 Phoenix 프로젝트를 만들고 router, controller 및 view 를 각각 다음과 같이 설정합니다.

    router.ex
    defmodule JsonAppWeb.Router do
      use JsonAppWeb, :router
    
      pipeline :api do
        plug(:accepts, ["json"])
      end
    
      scope "/api", JsonAppWeb do
        pipe_through(:api)
    
        resources("/blogs", BlogController)
      end
    end
    

    blog_controller.ex
    defmodule JsonAppWeb.BlogController do
      use JsonAppWeb, :controller
    
      alias JsonApp.Contents
      alias JsonApp.Contents.Blog
    
      def index(conn, _params) do
        blogs = Contents.list_blogs()
        render(conn, "index.json", blogs: blogs)
      end
    end
    

    blog_view.ex
    defmodule JsonAppWeb.BlogView do
      use JsonAppWeb, :view
      alias JsonAppWeb.BlogView
    
      def render("blog.json", %{blog: blog}) do
        %{
          id: blog.id,
          blog_title: blog.blog_title,
          blog_body: blog.blog_body,
          comments: blog.blog_comments |> Enum.map(&comments(&1))
        }
      end
    
      def comments(comment) do
        %{
          comment: comment.comment,
          comment_by: comment.comment_by
        }
      end
    end
    

    위와 같이 설정한 후 /api/blogs API를 호출하면 다음과 같은 응답이 반환됩니다.

    JSON 응답
    {
      "data": [
        {
          "id": 1,
          "comments": [
            {
              "comment_by": "Honda",
              "comment": "Congrats!"
            },
            {
              "comment_by": "Naomi",
              "comment": "Wow"
            }
          ],
          "blog_title": "First blog",
          "blog_body": "This is my first blog!"
        }
      ]
    }
    

    이러한 API 상호 작용을 Camel Case로 만들기 위해 다음 섹션에서 proper_case 설정을 시도합니다.

    proper_case 사용



    그럼 proper_case 의 README 에 따라 설정을 합시다.

    설치



    proper_case 를 설치하려면 mix.exs 에 proper_case 의 deps 를 추가합니다.
      defp deps do
        [
          {:proper_case, "~> 1.2"}
        ]
      end
    

    router 설정


    router.ex를 열고 :apipipelineProperCase.Plug.SnakeCaseParams의 플러그를 추가합니다.
      pipeline :api do
        plug(:accepts, ["json"])
        plug(ProperCase.Plug.SnakeCaseParams)
      end
    

    config 설정


    config.exs 를 열고 다음 설정을 추가합니다.
    config :phoenix, :format_encoders, json: ProperCase.JSONEncoder.CamelCase
    

    설정은 이상입니다. view나 controller는 일절 변경할 필요가 없습니다.

    API 응답 확인



    이제 /api/blogs 의 API 응답을 다시 확인해 봅시다.
    {
      "data": [
        {
          "id": 1,
          "comments": [
            {
              "commentBy": "Honda",
              "comment": "Congrats!"
            },
            {
              "commentBy": "Naomi",
              "comment": "Wow"
            }
          ],
          "blogTitle": "First blog",
          "blogBody": "This is my first blog!"
        }
      ]
    }
    

    응답의 JSON 키가 모두 낙타 케이스가 되어 있는지 확인할 수 있습니다.

    또, 여기에서 행한 변경에 의해, API에 건네주는 파라미터도 캬멜 케이스로 할 수 있습니다. 예를 들어 새로 blog를 create 하는 경우에도, blotTitle , blogBody 와 같은 파라미터명을 지정해 리퀘스트를 보낼 수가 있습니다. 이 경우, plug 로 설정한 ProperCase.Plug.SnakeCaseParams 에 의해, controller 에 건네받는 각 파라미터는 자동적으로 뱀 케이스가 됩니다.

    이와 같이 proper_case 를 사용하는 것으로, 클라이언트는 캬멜 케이스, Phoenix는 스네이크 케이스와, 각각의 언어 사양에 따른 형태로 변수명등의 기술에 집중할 수가 있습니다. 매우 편리합니다

    좋은 웹페이지 즐겨찾기