AWS DynamoDB 의 record 를 plain json object 로 변환하기

tl;dr

  • aws-sdk에 있는 AWS.DynamoDB.Converterunmarshall() 메소드 사용 (공식문서)
  • 서버와 통신하는 api 호출 함수에서 response로 받는 값을 호출 시점에서 가공해서 전달하자.

DynamoDB 레코드 구조 보기

DynamoDB의 레코드 구조는 매우 짜장스럽다. 아래에서 보듯 key-value 관계가 아니라 각각의 key에 대응하는 value의 속성값을 key로 지니고 해당 key의 value를 가지고 있는 오브젝트가 들어있다.
딱 보면 감이 오겠지만,
S는 string, N은 number, L은 list, M은 map이고 NULL, BOOL은 각각 null과 bool 자료형이다.
이 레코드를 그대로 사용하면 key에 대응하는 value가 null값이라도 오는 경우 매우 짜증스러운 일이 생긴다.
가령 nickname이라는 key를 가진 value에 null값을 허용했다고 하면, 가져다 쓰는 쪽에서는 조건문을 사용해서 nickname의 null 여부를 판단해서 null이 아닌 경우에만 nickname.S를 참조하여 value에 접근할 수 있다.

DynamoDB 레코드를 plain json object로 변환하기

그런 이유로 null이나 undefined가 올 수 있는 key-value를 변수에 할당할 때는 삼항 조건문으로 초기화를 시켜주는 뻘짓들을 지금까지 하다가 결국에는 해당 레코드 구조를 평범한 json 오브젝트로 변경시켜주는 모듈을 제작하겠다는 맘을 먹게 되었다.
그런데 곰곰히 생각해보니 DynamoDB와 node.js가 세상에 나온 날들을 헤아려보면 그런 모듈, 혹은 라이브러리가 아직까지 나오지 않았을리가 없었다. 역시나 검색을 해보니 무려 aws-sdk 차원에서 지원을 해주는 기능이었다. 뭔가 자신이 뻘짓을 하고 있다고 느낄 땐 무조건 공식 문서를 살펴보는 버릇을 들여야 한다.

api와 통신한 response를 가공하여 클라이언트에 전달하기

원래 프로젝트 하나를 파서 설명하려고 했으나 밤이 매우 늦은 관계로 대충 예시만 작성해봤다.
getItem은 가공되지 않은 data 값을 return하고 getUnmarshalledItem은 가공된 data 값을 return하는데 상황에 맞게 사용하면 된다.
예를 들어, React 프로젝트에서 Redux와 Redux 미들웨어로 Redux-Saga 등을 도입한다면 api와 관련한 로직들을 위의 경우처럼 역할을 가진 함수로 나누어 사용할 수 있다.
또한 reselect를 쓰는 경우, api 통신 때마다 response 값을 가공하는 작업이 부담스럽게 느껴지는 경우, store에서 component로 state를 전달하기 전에 사용해도 되고.
밤이고 맘이 급해서 그런지 횡설수설이 심한데 추후에 보강해야겠다...