Programming Ecto (Darin Wilson, Eric Meadows-Jonsson, 2019) 독후감
elixir 언어에서 표준으로 쓰는 데이터베이스 래퍼(wrapper)이자 쿼리 생성기 라이브러리인 ecto를 설명한 책이다. 잘못 사용하고 있는 게 있지 않을까? 편한 걸 놔두고 어렵게 사용하고 있지 않을까? 이런 걸 배우고 싶어서 이 책을 선택했다. 생각보단 영양가가 없었다. ecto에 대해선 Programming Phoenix 1.4 책에서 더 많이 배운 것 같다. 그래도 소득이 있었다. context에 대해 다시 생각해볼 수 있었고 다형성 연관(polymorphic association)과 embedded_schema를 배울 수 있었다.
초반에 나온 테스트 팁이 유용했다. iex에서 반복해서 입력하는 import, require 문은 .iex.exs 파일을 만들어서 입력하면 매번 입력하지 않아도 된다. iex가 실행될 때, .iex.exs 파일이 있으면 실행한다. iex로 긴 코드를 힘들게 입력하지 말고 테스트 내용을 담은 파일을 만들고 mix run priv/repo/playground.exs 처럼 실행해서 결과를 확인하란 팁도 유용했다. 그러게 이렇게 실행하면 훨씬 편한데, iex에서 매번 입력했다.
관련 기능을 노출하고 그룹 짓는 전용 모듈인 contexts에 대한 설명이 좋았다. phoenix 프레임워크에서 강제해서 익숙해지긴 했는데, 종종 함수를 어떤 모듈에 넣어야 할지 고민한다. 명확한 기준이 없으면 함수를 contexts 모듈에 넣어야 할지, 해당 contexts의 하위 모듈에 넣어야 할지 매번 고민하게 된다. 이름 짓기도 어렵지만 함수를 어디에 정의할지 정하기도 어렵다. 사이드 이팩트가 없는 pure 코드는 하위 모듈에 넣고 사이드 이팩트가 있는 impure 코드는 contexts 모듈에 정의한다. pure 코드들을 그룹 지어 impure 코드와 상호작용하는 게 contexts 모듈이라고 할 수 있다. phoenix 프레임워크에선 contexts 모듈 하위 모듈로 ecto schema를 정의하고 저장소에 접근해 사이드이팩트를 만드는 코드는 모두 contexts 모듈에 정의한다. contexts 모듈 크기가 커질 것 같은데, 이렇게 안 한다고 해서 안 커질까? 분명 커질 게 뻔하다. 그래서 난 괜찮은 디자인이라 생각한다.
다형성 연관(polymorphic association)을 구현하는 3가지 방법도 재미있었다. 항상 foreign key를 여러 개 만들어서 해결하곤 했는데, 다른 구현 방법을 구경할 수 있었다. 한 번도 사용해 본 적이 없는 embedded_schema 사용법이 재미있었다. embedded_schema는 연관 데이터를 컬럼에 json으로 시리얼라이즈해서 쓰는 용도로 만들었다. 이런 용도로는 사용할 일이 없어서 관심을 기울이지 않았다. 데이터베이스에 매핑되는 schema로 변환하기 전 중간 단계로 사용하는 방법 때문에 관심이 갔다. 이런 용도면 나도 사용할 일이 많다. embedded_schema도 schema처럼 changeset, validation 등 ecto에서 사용한 기능을 모두 사용할 수 있다. 사용자가 입력하는 UI 필드에 매핑하는 embedded_schema를 만들어서 검증한 후 계정과 프로필 schema로 변환해서 데이터베이스에 삽입할 수 있다.