본문 바로가기
인턴

[20일차] Next.js - route.ts 에서 DB 값만 변수에 담기

by 당도-50% 2024. 11. 8.

* route.ts 에서 DB 값만 변수에 담기

 

보통 route.ts 에서 쿼리결과를 변수에 담아 화면으로 보내준다. 

이때 보통 JSON 으로 값이 담기는데  결과가 아래 항목들일 경우를 생각해보자.

 

  1. 컬럼이 여러개이며 행이 여러개일 경우 결과
  2. 컬럼이 한개이며 행이 여러개일 경우 결과
  3. 위 두 경우를 컬럼명을 제외한 값만 담고 싶은 경우 ( 2가지 - PostgreSQL사용 )

 

<<예시>>

 

· 테이블 데이터가 아래와 같다고 가정하자. ( userInfo 테이블 )

userId userName status
user1 Alice Y
user2 Bob Y
user3 Carol Y
user4 Dave N
user5 Eve Y

 

 

1.컬럼이 여러개이며 행이 여러개일 경우 결과

// 쿼리
const query = `
    SELECT "userId"
    	 , "userName"
      FROM public."userInfo"
     WHERE 1=1
       AND "status" = 'Y'
`;

// 쿼리 결과 변수에 담기
const queryResult = await database.any(query);

// 결과
const queryResult = [
  { userId: "user1", userName: "Alice" },
  { userId: "user2", userName: "Bob" },
  { userId: "user3", userName: "Carol" },
  { userId: "user5", userName: "Eve" }
];

return queryResult;


//+++++++++++++++++ response ++++++++++++++++++++
{
  "queryResult": [
    { "userId": "user1", "userName": "Alice" },
    { "userId": "user2", "userName": "Bob" },
    { "userId": "user3", "userName": "Carol" },
    { "userId": "user5", "userName": "Eve" }
  ]
}

 

 

2. 컬럼이 한개이며 행이 여러개일 경우 결과

// 쿼리
const query = `
    SELECT "userId"
      FROM public."userInfo"
     WHERE 1=1
       AND "status" = 'Y'
`;

// 쿼리 결과 변수에 담기
const queryResult = await database.any(query);

// 결과
const queryResult = [
  { userId: "user1" },
  { userId: "user2" },
  { userId: "user3" },
  { userId: "user5" }
];

return queryResult;

//+++++++++++++++++ response ++++++++++++++++++++
{
  "queryResult": [
    { "userId": "user1" },
    { "userId": "user2" },
    { "userId": "user3" },
    { "userId": "user5" }
  ]
}

 

 

3. 위 두 경우를 컬럼명을 제외한 값만 담고 싶은 경우 ( 2가지 - JS 사용 / PostgreSQL사용 ) 

 

  • JavaScript 사용 ( 1번 경우에 값만 변수에 담아보기 )
// 쿼리
const query = `
    SELECT "userId"
         , "userName"
      FROM public."userInfo"
     WHERE 1=1
       AND "status" = 'Y'
`;

// 여러 결과를 담기 위해 database.any() 사용
const queryResult = await database.any(query);

// 퀄리 결과 변수에서 값만 골라 변수에 담기
const resultVal = queryResult.map((obj: any) => Object.values(obj));

// 결과
const queryResult = [
  [ "user1", "Alice" ],
  [ "user2", "Bob" ],
  [ "user3", "Carol" ],
  [ "user5", "Eve" ]
];

return queryResult;

//+++++++++++++++++ response ++++++++++++++++++++
{
  "queryResult": [
      [ "user1", "Alice" ],
      [ "user2", "Bob" ],
      [ "user3", "Carol" ],
      [ "user5", "Eve" ]
  ]
}

 

  • 쿼리 활용 ( 2번 경우에 값만 변수에 담아보기 -  ARRAY_AGG )
// 쿼리
const query1 = `
    SELECT ARRAY_AGG("userId") AS "userId"
      FROM public."userInfo"
     WHERE 1=1
       AND "status" = 'Y'
`;

const query2 = `
    SELECT ARRAY_AGG("userId") AS "userId"
    	 , ARRAY_AGG("userName") AS "userName"
      FROM public."userInfo"
     WHERE 1=1
       AND "status" = 'Y'
`;

// 쿼리 결과 변수에 담기
const query1Result = await database.one(query1);
const query2Result = await database.one(query2);

// 퀄리 결과 변수에서 값만 골라 변수에 담기(resultVal_2 방법 2가지)
const resultVal_1 = query1Result.userId;

const resultVal_2 = {
  userId: query2Result.userId, // ["user1", "user2", "user3", "user5"]
  userName: query2Result.userName // ["Alice", "Bob", "Carol", "Eve"]
};
const resultVal_2.userId = query2Result.userId;
resultVal_2.userName = query2Result.userName;


return {
	resultVal_1, resultVal_2
}


//+++++++++++++++++ response ++++++++++++++++++++
{
  "resultVal_1": [ "user1", "user2", "user3", "user5" ],
  "resultVal_2": {
    "userId": [ "user1", "user2", "user3", "user5" ],
    "userName": [ "Alice", "Bob", "Carol", "Eve" ]
  }
}

 

 

 결론

  • JavaScript (map 사용) : map과 Object.values를 사용하면, 각 객체의 속성값을 2차원 배열로 변환하여 처리한다. 이는 각 행을 개별적으로 배열로 묶어주는 방식이다.
  • SQL (ARRAY_AGG 사용) : ARRAY_AGG는 여러 행의 값을 하나의 배열로 합치는 방식으로, 단일 배열로 모든 값을 합쳐 반환한다.

즉,

  • map을 사용할 때는 각 객체를 개별적으로 배열로 감싸고, 결과는 2차원 배열이 됩니다.
  • ARRAY_AGG는 여러 값을 하나의 배열로 합치기 때문에 1차원 배열을 반환합니다.