2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

Elixir에서 RESTful API를 구축하는 방법은?

_____
Q1: Elixir에서 RESTful API를 구축하기 위한 주요 프레임워크는 무엇인가요?
A1: Elixir에서 가장 널리 사용되는 웹 프레임워크는 Phoenix입니다. Phoenix는 고성능, 확장성, 실시간 기능을 지원하며 RESTful API 개발에 최적화되어 있습니다.

Q2: Phoenix 프로젝트를 생성하려면 어떻게 해야 하나요?
A2: 터미널에서 다음 명령어를 실행합니다:
```bash
mix phx.new my_api --no-html --no-webpack
```
`--no-html`과 `--no-webpack` 옵션은 API 전용 프로젝트 생성을 위해 불필요한 웹 템플릿, 자바스크립트 등을 제외합니다.

Q3: RESTful API용 라우팅 설정은 어떻게 하나요?
A3: `lib/my_api_web/router.ex` 파일에서 `scope "/api", MyApiWeb do` 내에 리소스별 경로를 정의합니다. 예:
```elixir
scope "/api", MyApiWeb do
pipe_through :api

resources "/users", UserController, except: [:new, :edit]
end
```
`pipe_through :api`는 기본적으로 JSON 포맷 요청을 처리하도록 설정된 파이프라인입니다.

Q4: 컨트롤러에서 기본적인 CRUD 액션은 어떻게 구현하나요?
A4: `lib/my_api_web/controllers/user_controller.ex`에 주요 액션들을 아래와 같이 작성합니다:
```elixir
defmodule MyApiWeb.UserController do
use MyApiWeb, :controller

alias MyApi.Accounts
alias MyApi.Accounts.User

def index(conn, _params) do
users = Accounts.list_users()
render(conn, "index.json", users: users)
end

def show(conn, %{"id" => id}) do
user = Accounts.get_user!(id)
render(conn, "show.json", user: user)
end

def create(conn, %{"user" => user_params}) do
with {:ok, %User{} = user} <- Accounts.create_user(user_params) do
conn
|> put_status(:created)
|> put_resp_header("location", Routes.user_path(conn, :show, user))
|> render("show.json", user: user)
end
end

def update(conn, %{"id" => id, "user" => user_params}) do
user = Accounts.get_user!(id)

with {:ok, %User{} = user} <- Accounts.update_user(user, user_params) do
render(conn, "show.json", user: user)
end
end

def delete(conn, %{"id" => id}) do
user = Accounts.get_user!(id)
with {:ok, %User{}} <- Accounts.delete_user(user) do
send_resp(conn, :no_content, "")
end
end
end
```

Q5: JSON 렌더링은 어떻게 설정하나요?
A5: `lib/my_api_web/views/user_view.ex`에 JSON 형태로 변환할 함수를 작성합니다:
```elixir
defmodule MyApiWeb.UserView do
use MyApiWeb, :view

def render("index.json", %{users: users}) do
%{data: render_many(users, __MODULE__, "user.json")}
end

def render("show.json", %{user: user}) do
%{data: render_one(user, __MODULE__, "user.json")}
end

def render("user.json", %{user: user}) do
%{id: user.id, name: user.name, email: user.email}
end
end
```

Q6: 데이터베이스 연동은 어떻게 하나요?
A6: Phoenix 프로젝트 생성 시 Ecto가 설정되어 있으며, Postgres나 다른 DB를 사용 가능합니다. `config/dev.exs`에서 데이터베이스 설정을 하고, migration을 생성 후 실행하여 테이블을 만듭니다. 예:
```bash
mix ecto.gen.migration create_users
mix ecto.migrate
```
`lib/my_api/accounts/user.ex`에는 Ecto 스키마를 정의합니다.

Q7: RESTful API에서 요청 데이터 유효성 검사는?
A7: Ecto Changeset을 활용해 모델 레벨에서 유효성을 검사합니다. 예:
```elixir
def changeset(user, attrs) do
user
|> cast(attrs, [:name, :email])
|> validate_required([:name, :email])
|> validate_format(:email, ~r/@/)
end
```

Q8: API 요청 미들웨어나 파이프라인 구성은 어떻게 하나요?
A8: `router.ex`에서 파이프라인을 정의해 JSON 요청만 받도록 설정, 예:
```elixir
pipeline :api do
plug :accepts, ["json"]
end
```

Q9: 엘릭서에서 Swagger(OpenAPI) 문서 자동 생성은 가능한가요?
A9: 네, `phoenix_swagger` 라이브러리를 사용해 API 명세서를 자동으로 생성할 수 있습니다.

Q10: RESTful API 테스트는 어떻게 하나요?
A10: `ConnCase`를 이용해 컨트롤러 테스트를 작성합니다. 예:
```elixir
test "lists all users", %{conn: conn} do
conn = get(conn, Routes.user_path(conn, :index))
assert json_response(conn, 200)["data"] == []
end
```

---

요약:
1. Phoenix 설치 및 프로젝트 생성 (`mix phx.new`)
2. 데이터베이스 연동 및 스키마 정의 (Ecto)
3. 라우팅 설정 (`router.ex`에서 `resources` 사용)
4. 컨트롤러에 CRUD 액션 구현
5. JSON 뷰 생성 및 렌더링
6. Changeset으로 유효성 검증
7. 테스트 코드 작성 및 Swagger 문서 생성

이 과정을 통해 Elixir에서 RESTful API를 체계적이고 효율적으로 개발할 수 있습니다.
Elixir는 높은 성능과 동시성을 제공하는 프로그래밍 언어로, 주로 웹 애플리케이션과 API를 구축하는 데 사용됩니다.

Elixir의 웹 프레임워크인 Phoenix는 RESTful API를 구축하는 데 매우 유용한 도구입니다.

이 글에서는 Elixir와 Phoenix를 사용하여 RESTful API를 구축하는 방법에 대해 단계별로 설명하겠습니다.

1. Elixir 및 Phoenix 설치 먼저 Elixir와 Phoenix를 설치해야 합니다.

Elixir는 Erlang VM 위에서 실행되므로 Erlang도 함께 설치해야 합니다.

- Elixir 설치 : Elixir 공식 웹사이트([elixir-lang.org](https://elixir-lang.org/))에서 설치 방법을 확인할 수 있습니다.

- Phoenix 설치 : Phoenix를 설치하려면, Elixir가 설치된 후에 다음 명령어를 실행합니다.

```bash mix archive.install hex phx_new ```

2. 새로운 Phoenix 프로젝트 생성 Phoenix 프로젝트를 생성하려면 다음 명령어를 사용합니다.

```bash mix phx.new my_api --no-html --no-webpack ``` `--no-html`과 `--no-webpack` 플래그는 API만 필요하므로 HTML 및 Webpack 관련 설정을 생략합니다.

프로젝트 디렉토리로 이동합니다.

```bash cd my_api ```

3. 의존성 설치 프로젝트의 의존성을 설치하려면 다음 명령어를 실행합니다.

```bash mix deps.get ```

4. 데이터베이스 설정 Phoenix는 Ecto라는 데이터베이스 라이브러리를 사용합니다.

`config/dev.exs` 파일을 열어 데이터베이스 설정을 수정합니다.

PostgreSQL을 사용하는 경우 다음과 같이 설정할 수 있습니다.

```elixir config :my_api, MyApi.Repo, username: "postgres", password: "postgres", database: "my_api_dev", hostname: "localhost", pool_size: 10 ``` 데이터베이스를 생성하려면 다음 명령어를 실행합니다.

```bash mix ecto.create ```

5. 스키마 및 마이그레이션 생성 RESTful API를 구축하기 위해 필요한 데이터 모델을 정의합니다.

예를 들어, `Post`라는 리소스를 생성한다고 가정해 보겠습니다.

```bash mix phx.gen.schema Post posts title:string body:text ``` 이 명령어는 `Post` 스키마와 관련된 마이그레이션 파일을 생성합니다.

생성된 마이그레이션 파일을 데이터베이스에 적용하려면 다음 명령어를 실행합니다.

```bash mix ecto.migrate ```

6. 컨트롤러 및 라우팅 설정 이제 API의 엔드포인트를 정의할 차례입니다.

`lib/my_api_web/controllers` 디렉토리에 `post_controller.ex` 파일을 생성하고 다음과 같이 작성합니다.

```elixir defmodule MyApiWeb.PostController do use MyApiWeb, :controller alias MyApi.Post alias MyApi.Repo action_fallback MyApiWeb.FallbackController def index(conn, _params) do posts = Repo.all(Post) render(conn, "index.json", posts: posts) end def create(conn, %{"post" => post_params}) do with {:ok, %Post{} = post} <- Post.create_post(post_params) do conn |> put_status(:created) |> put_resp_header("location", Routes.post_path(conn, :show, post)) |> render("show.json", post: post) end end def show(conn, %{"id" => id}) do post = Repo.get!(Post, id) render(conn, "show.json", post: post) end def update(conn, %{"id" => id, "post" => post_params}) do post = Repo.get!(Post, id) with {:ok, %Post{} = post} <- Post.update_post(post, post_params) do render(conn, "show.json", post: post) end end def delete(conn, %{"id" => id}) do post = Repo.get!(Post, id) with {:ok, %Post{}} <- Post.delete_post(post) do send_resp(conn, :no_content, "") end end end ``` 이제 라우팅을 설정해야 합니다.

`lib/my_api_web/router.ex` 파일을 열고 다음과 같이 수정합니다.

```elixir scope "/api", MyApiWeb do pipe_through :api resources "/posts", PostController, except: [:new, :edit] end ```

7. JSON 응답 설정 API는 JSON 형식으로 응답해야 하므로, `lib/my_api_web/views/post_view.ex` 파일을 생성하고 다음과 같이 작성합니다.

```elixir defmodule MyApiWeb.PostView do use MyApiWeb, :view def render("index.json", %{posts: posts}) do %{data: render_many(posts, MyApiWeb.PostView, "post.json")} end def render("show.json", %{post: post}) do %{data: render_one(post, MyApiWeb.PostView, "post.json")} end def render("post.json", %{post: post}) do %{ id: post.id, title: post.title, body: post.body } end end ```

8. 서버 실행 모든 설정이 완료되었으므로, 서버를 실행하여 API를 테스트할 수 있습니다.

```bash mix phx.server ``` 이제 `http://localhost:4000/api/posts`에서 API를 호출할 수 있습니다.

Postman이나 cURL을 사용하여 GET, POST, PUT, DELETE 요청을 테스트할 수 있습니다.



9. 테스트 및 문서화 API를 구축한 후에는 테스트를 작성하고 문서화하는 것이 중요합니다.

Elixir의 `ExUnit`을 사용하여 테스트를 작성할 수 있으며, `ExDoc`을 사용하여 API 문서를 생성할 수 있습니다.

결론 Elixir와 Phoenix를 사용하여 RESTful API를 구축하는 과정은 비교적 간단합니다.

이 글에서는 기본적인 설정과 CRUD 기능을 구현하는 방법을 설명했습니다.

추가적으로 인증, 권한 관리, 에러 처리 등을 구현하여 API를 더욱 완성도 있게 만들 수 있습니다.

Elixir의 동시성과 성능 덕분에 대규모 애플리케이션에서도 안정적으로 작동할 수 있습니다.

작성자: 이준호 [비회원] | 작성일자: 1년 전 2025-01-02 06:21:44
조회수: 161 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.