도서/기술

[책] 데이터 지향 프로그래밍 - 10, 11장 데이터 베이스 작업과 웹 서비스

egg528 2025. 1. 25. 19:53

DOP에서 DB 데이터를 다루는 방식


[
  {
      "title": "7 Habits of Highly Effective People",
      "isbn": "978-1982137274",
      "publication _year": 1989
  },
  {
      "title": "The Power of Habit",
      "isbn": "978-0812981605",
      "publication_year": 2012
  }
]

  DOP에서 DB 데이터는 이전까지 다뤄온 메모리 데이터와 차이가 없다. 기본적으로 데이터는 맵으로 관리되고 배열로 각 데이터를 담아둔다. 이처럼 기존과 동일한 방식으로 DB 데이터를 다루기 때문에 JSON 스키마와 같이 기존에 데이터 관리를 위해 적용하던 모든 것들은 DB데이터에도 동일하게 적용이 가능하다.

 

 

 DOP에서 DB에서 데이터를 가져올 때 위 사진과 같은 과정을 거친다. 드라이버가 결과를 맵 리스트로 반환한다면 별다른 작업이 필요 없고, 그렇지 않다면 변환해주는 유틸 함수를 활용해 드라이버의 반환 값에서 리스트 맵 형태로 변환을 하면 된다. 

 

let dbClient;

const ajv = new Ajv({ allErrors: true });

const title = "habit";

const matchingBooksQuery = `
  SELECT title, isbn
  FROM books
  WHERE title LIKE '%' || $1 || '%'
`;

const books = dbClient.query(matchingBooksQuery, [title]);

if (!ajv.validate(dbSearchResultSchema, books)) {
  const errors = ajv.errorsText(ajv.errors);
  throw "Internal error: Unexpected result from the database: " + errors;
}

JSON.stringify(books);

 이 과정을 코드로 나타내면 위와 같다. 다만 이 코드에서는 JSON 스키마를 활용해 양식을 검증하는 로직이 추가되었다.

 

 

 

데이터 저장 및 조작하기


class CatalogDB {
  static addMember(member) {
    const addMemberQuery = `
      INSERT INTO members (email, encrypted_password)
      VALUES ($1, $2)
    `;

    dbClient.query(addMemberQuery, _.at(member, ["email", "encryptedPassword"]));
  }
}

 DB에 데이터를 저장하는 과정은 어렵지 않다. 위 코드는 회원 데이터를 DB에 추가하는 메서드인데 _at 메서드를 활용해 맵 내부에서 원하는 데이터들을 편리하게 추출할 수 있다. 이 내용은 맵으로 구성된 데이터를 DB에 INSERT할 수 있는 편리한 방법이다.

 

 

 DB 데이터 조작은 특별한 부분이 없다. DB 데이터 또한 리스트 맵 데이터를 다루기에 범용 함수들을 쉽게 적용할 수 있다.

 

 

 

DOP에서 클라이언트 응답 데이터를 다루는 방식


 DOP에서 데이터는 데이터일 뿐이다. 데이터의 원천이 메모리이든, DB이든 외부 클라이언트의 요청이든 DOP에서 데이터는 동일하게 맵으로 표현된다. 이러한 접근은 Application에서 데이터를 다루는 단일한 방식(범용 함수)을 가능하게 하고 외부 구성 요소와 느슨한 결합 관계를 가진다. (이 책에서는 lodash를 적극 활용한다.)

 

 

 

DOP가 지향하는 내부 구성요소 간의 관계


 DOP에서 시스템 내부를 구축할 때와 외부를 구축할 때는 다르지 않다. 외부 시스템과(DB, 외부 클라이언트) 범용 데이터 컬렉션 즉, 리스트 맵을 주고 받는다. 내부 시스템도 마찬가지이다. 각 로직은 리스트 맵 혹은 맵을 매개변수로 받고 리스트 맵을 반환한다. 이러한 방식은 시스템 내부 요소들간의 관계를 느슨하게 만든다. 즉, 각 메서드가 특정 로직에서만 사용될 수 있기 보다는 범용적으로 사용될 수 있는 기반이 된다.

 

 

 

내 생각


 핵심은 DOP에서 데이터는 데이터일 뿐 어디에 저장되어 있는지, 어디서 왔는지는 중요하지 않다. 메모리에 저장된 데이터이든, DB에 저장된 데이터이든 외부 클라이언트의 응답 데이터이든 Application단에서 데이터는 맵으로 관리한다. 이렇게 되면 시스템 내부에서 데이터를 다루는 작업은 통일될 수 있다. 즉, DB 데이터를 다루는 작업, 외부 클라이언트 응답 데이터를 다루는 작업이 다르지 않다는 의미이다.

 

 이처럼 모두 데이터는 범용 자료 구조로, 내부 시스템은 범용적인 로직으로 두면 각 요소들의 관계는 느슨해질 것이고 변화에 유연한 시스템이 될 것 같다. 하지만 새로운 방식이라 실제로 이 방식으로 Application을 만들어봐야 어떤 장단이 있는지? 모든 서비스에 적용이 가능할지?와 같은 물음에 답이 가능할 것 같다.