* route.ts 에서 DB 값만 변수에 담기
보통 route.ts 에서 쿼리결과를 변수에 담아 화면으로 보내준다.
이때 보통 JSON 으로 값이 담기는데 결과가 아래 항목들일 경우를 생각해보자.
- 컬럼이 여러개이며 행이 여러개일 경우 결과
- 컬럼이 한개이며 행이 여러개일 경우 결과
- 위 두 경우를 컬럼명을 제외한 값만 담고 싶은 경우 ( 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차원 배열을 반환합니다.
'인턴' 카테고리의 다른 글
[23일차] classic ASP - DB 연결 (global.asa에서 설정하는 방법) (0) | 2024.11.13 |
---|---|
classic ASP - DB 연결 (공통모듈 만들어 사용하기) (0) | 2024.11.13 |
[19일차] Next.js - rourte.tx에서 변수에 쿼리 값만 담기 (0) | 2024.11.08 |
[18일차] HTML - 기본 (2) | 2024.11.06 |
[17일차] URI 와 웹 브라우저 요청의 흐름 (0) | 2024.11.05 |