Sequelize Models Association: Nest 옵션 및 DB Schema 변경

조성철 (JoSworkS)·2020년 1월 20일
0

Sequelize Association의 Nest 옵션

Nest옵션은 Association을 통해 만들어진 Result-set을 보기 좋게, 사용하기 용이하게, 객체형태로 만들어주는 옵션이다.
아래와 같이 Association을 할 때 옵션으로 nest: true 라고 적어서 사용할 수 있다.

      const joinResult = await trails.findAll({
        include: [
          {
            model: locations,
            required: true,
            attributes: ['location1', 'location2', 'location3', 'location4', 'location5'],
            where: {
              id: findRef.locationId,
            },
          },
          {
            model: users,
            required: true,
            where: {
              id: findRef.userId,
            },
          },
          {
            model: categories,
            required: true,
            where: {
              id: findRef.categoryId,
            },
          },
          {
            model: images,
            required: false,
            where: {
              id: findRef.imageId,
            },
          },
        ],
        nest: true,
        raw: true,
      });

테스트한 전/후 결과는 아래와 같다.
nest 옵션 적용 전에는 같은 계층에서 join된 데이터들이 정렬되어 있었지만, 옵션 적용 후에는 json형식이어도 join된 데이터들이 각각의 계층으로 정렬되어 있는 것을 확인할 수 있었으며, 클라이언트에서 parsing을 하면 온전한 객체형태의 데이터로 사용할 수 있게 된다.

적용 전 결과
 {
    id: 1,
    userId: 1,
    locationId: 1,
    categoryId: 1,
    imageId: null,
    title: 'trail1',
    review: 'aaaaaaaaaaaaaaaaaaa',
    adminDistrict: null,
    createdAt: 2020-01-20T15:36:56.000Z,
    updatedAt: 2020-01-20T15:36:56.000Z,
    'location.location1': '[127.1596250438903,37.36655878159279]',
    'location.location2': '[127.16066361895653,37.36655737541724]',
    'location.location3': '[127.16080054662963,37.36724196874028]',
    'location.location4': '[127.15976394906102,37.36818043988212]',
    'location.location5': '[127.15890377295123,37.36713640914249]',
    'user.id': 1,
    'user.email': 'junyong1@naver.com',
    'user.password': 'bfdebd345f9bfa6687cfb8d6d02942351a2f41ad7171b087666442df887170f6883a5b4d975eab5c2dd57ad6f89fa592bf7af0071c31fe191940642991bb9c3f',
    'user.username': 'junyong1',
    'user.createdAt': 2020-01-20T15:36:15.000Z,
    'user.updatedAt': 2020-01-20T15:36:15.000Z,
    'category.id': 1,
    'category.tag': 'With pet',
    'category.createdAt': 2020-01-20T15:36:56.000Z,
    'category.updatedAt': 2020-01-20T15:36:56.000Z,
    'image.id': null,
    'image.fileName': null,
    'image.filePath': null,
    'image.createdAt': null,
    'image.updatedAt': null
  }
적용 후 결과
{
        "id": 1,
        "userId": 1,
        "locationId": 1,
        "categoryId": 1,
        "imageId": null,
        "title": "trail1",
        "review": "aaaaaaaaaaaaaaaaaaa",
        "adminDistrict": null,
        "createdAt": "2020-01-20T15:36:56.000Z",
        "updatedAt": "2020-01-20T15:36:56.000Z",
        "location": [
            "[127.1596250438903,37.36655878159279]",
            "[127.16066361895653,37.36655737541724]",
            "[127.16080054662963,37.36724196874028]",
            "[127.15976394906102,37.36818043988212]",
            "[127.15890377295123,37.36713640914249]"
        ],
        "user": {
            "id": 1,
            "email": "junyong1@naver.com",
            "password": "bfdebd345f9bfa6687cfb8d6d02942351a2f41ad7171b087666442df887170f6883a5b4d975eab5c2dd57ad6f89fa592bf7af0071c31fe191940642991bb9c3f",
            "username": "junyong1",
            "createdAt": "2020-01-20T15:36:15.000Z",
            "updatedAt": "2020-01-20T15:36:15.000Z"
        },
        "category": {
            "id": 1,
            "tag": "With pet",
            "createdAt": "2020-01-20T15:36:56.000Z",
            "updatedAt": "2020-01-20T15:36:56.000Z"
        },
        "image": {
            "id": null,
            "fileName": null,
            "filePath": null,
            "createdAt": null,
            "updatedAt": null
        }
    }

0개의 댓글