chore: Update environment variables for database connection and add MySQL2 dependency; implement partner API route and database query functionality

This commit is contained in:
yoosangwook 2025-05-20 13:59:58 +09:00
parent e2e5a484ca
commit 2d1184e1c0
8 changed files with 210 additions and 8 deletions

View File

@ -10,8 +10,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api
DB_HOST=asdf
DB_USER=asdf
DB_PASSWORD=asdf
DB_DATABASE=asdf
DB_HOST=202.218.61.226
DB_USER=readonly
DB_PASSWORD=aAjmFW12iHKW84l1
DB_DATABASE=qpartners
DB_PORT=3306

View File

@ -8,8 +8,8 @@ NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api
DB_HOST=asdf
DB_USER=asdf
DB_PASSWORD=asdf
DB_DATABASE=asdf
DB_HOST=202.218.61.226
DB_USER=readonly
DB_PASSWORD=aAjmFW12iHKW84l1
DB_DATABASE=qpartners
DB_PORT=3306

View File

@ -16,6 +16,7 @@
"iron-session": "^8.0.4",
"lucide": "^0.503.0",
"mssql": "^11.0.1",
"mysql2": "^3.14.1",
"next": "15.2.4",
"react": "^19.0.0",
"react-dom": "^19.0.0",
@ -27,6 +28,7 @@
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/mysql": "^2.15.27",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",

89
pnpm-lock.yaml generated
View File

@ -29,6 +29,9 @@ importers:
mssql:
specifier: ^11.0.1
version: 11.0.1
mysql2:
specifier: ^3.14.1
version: 3.14.1
next:
specifier: 15.2.4
version: 15.2.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(sass@1.87.0)
@ -57,6 +60,9 @@ importers:
'@tailwindcss/postcss':
specifier: ^4
version: 4.0.17
'@types/mysql':
specifier: ^2.15.27
version: 2.15.27
'@types/node':
specifier: ^20
version: 20.17.28
@ -676,6 +682,9 @@ packages:
'@tediousjs/connection-string@0.5.0':
resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==}
'@types/mysql@2.15.27':
resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==}
'@types/node@20.17.28':
resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==}
@ -712,6 +721,10 @@ packages:
engines: {node: '>= 4.5.0'}
hasBin: true
aws-ssl-profiles@1.1.2:
resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==}
engines: {node: '>= 6.0.0'}
axios@1.8.4:
resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
@ -826,6 +839,10 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
denque@2.1.0:
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
engines: {node: '>=0.10'}
detect-libc@1.0.3:
resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
engines: {node: '>=0.10'}
@ -911,6 +928,9 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
generate-function@2.3.1:
resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==}
get-intrinsic@1.3.0:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
@ -994,6 +1014,9 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
is-property@1.0.2:
resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==}
is-wsl@3.1.0:
resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
engines: {node: '>=16'}
@ -1112,6 +1135,17 @@ packages:
lodash.once@4.1.1:
resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==}
long@5.3.2:
resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==}
lru-cache@7.18.3:
resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
lru.min@1.1.2:
resolution: {integrity: sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==}
engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'}
lucide@0.503.0:
resolution: {integrity: sha512-ZAVlxBU4dbSUAVidb2eT0fH3bTtKCj7M2aZNAVsFOrcnazvYJFu6I8OxFE+Fmx5XNf22Cw4Ln3NBHfBxNfoFOw==}
@ -1139,6 +1173,14 @@ packages:
engines: {node: '>=18'}
hasBin: true
mysql2@3.14.1:
resolution: {integrity: sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==}
engines: {node: '>= 8.0'}
named-placeholders@1.1.3:
resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==}
engines: {node: '>=12.0.0'}
nanoid@3.3.11:
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@ -1275,6 +1317,9 @@ packages:
engines: {node: '>=10'}
hasBin: true
seq-queue@0.0.5:
resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==}
sharp@0.33.5:
resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
@ -1289,6 +1334,10 @@ packages:
sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
sqlstring@2.3.3:
resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==}
engines: {node: '>= 0.6'}
stackblur-canvas@2.7.0:
resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==}
engines: {node: '>=0.1.14'}
@ -1890,6 +1939,10 @@ snapshots:
'@tediousjs/connection-string@0.5.0': {}
'@types/mysql@2.15.27':
dependencies:
'@types/node': 20.17.28
'@types/node@20.17.28':
dependencies:
undici-types: 6.19.8
@ -1923,6 +1976,8 @@ snapshots:
atob@2.1.2: {}
aws-ssl-profiles@1.1.2: {}
axios@1.8.4:
dependencies:
follow-redirects: 1.15.9
@ -2041,6 +2096,8 @@ snapshots:
delayed-stream@1.0.0: {}
denque@2.1.0: {}
detect-libc@1.0.3:
optional: true
@ -2141,6 +2198,10 @@ snapshots:
function-bind@1.1.2: {}
generate-function@2.3.1:
dependencies:
is-property: 1.0.2
get-intrinsic@1.3.0:
dependencies:
call-bind-apply-helpers: 1.0.2
@ -2230,6 +2291,8 @@ snapshots:
is-number@7.0.0:
optional: true
is-property@1.0.2: {}
is-wsl@3.1.0:
dependencies:
is-inside-container: 1.0.0
@ -2346,6 +2409,12 @@ snapshots:
lodash.once@4.1.1: {}
long@5.3.2: {}
lru-cache@7.18.3: {}
lru.min@1.1.2: {}
lucide@0.503.0: {}
math-intrinsics@1.1.0: {}
@ -2375,6 +2444,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
mysql2@3.14.1:
dependencies:
aws-ssl-profiles: 1.1.2
denque: 2.1.0
generate-function: 2.3.1
iconv-lite: 0.6.3
long: 5.3.2
lru.min: 1.1.2
named-placeholders: 1.1.3
seq-queue: 0.0.5
sqlstring: 2.3.3
named-placeholders@1.1.3:
dependencies:
lru-cache: 7.18.3
nanoid@3.3.11: {}
native-duplexpair@1.0.0: {}
@ -2508,6 +2593,8 @@ snapshots:
semver@7.7.1: {}
seq-queue@0.0.5: {}
sharp@0.33.5:
dependencies:
color: 4.2.3
@ -2544,6 +2631,8 @@ snapshots:
sprintf-js@1.1.3: {}
sqlstring@2.3.3: {}
stackblur-canvas@2.7.0:
optional: true

View File

@ -0,0 +1,48 @@
import { NextResponse } from 'next/server'
import executeQuery from '@/libs/partner'
export async function GET(request: Request) {
const sql = `SELECT
r.data_id,
u.id AS user_id,
u.login_id AS user_login_id,
u.password AS user_password,
u.user_name AS user_name,
u.user_name_kana AS user_name_kana,
u.sei AS user_sei,
u.mei AS user_mei,
u.sei_kana AS user_sei_kana,
u.mei_kana AS user_mei_kana,
u.user_tel AS user_tel,
u.user_fax AS user_fax,
u.status AS user_status,
u.seko_id AS user_seko_id,
u.seko_limit AS user_seko_limit,
s.id AS supplier_id,
s.code AS supplier_code,
s.name AS supplier_name,
s.name_kana AS supplier_name_kana,
s.kind AS supplier_kind
FROM
R_DATA r
JOIN
M_USER u ON r.data_id = u.id
JOIN
M_SUPPLIER s ON r.relation_id = s.id
WHERE
u.status = '1'
AND
u.seko_id is not null
AND
u.seko_limit > now()
AND
s.kind = '4'
AND
u.login_id = ?
AND
u.password = ?
`
const data = await executeQuery(sql, [])
console.log('🚀 ~ GET ~ data:', data)
return NextResponse.json(data)
}

View File

@ -1,9 +1,20 @@
'use client'
import { useRouter } from 'next/navigation'
import { useEffect } from 'react'
export default function Main() {
const router = useRouter()
useEffect(() => {
const fetchData = async () => {
const res = await fetch('/api/partner')
console.log('🚀 ~ fetchData ~ res:', res)
const data = await res.json()
console.log('🚀 ~ fetchData ~ data:', data)
}
fetchData()
}, [])
return (
<>
<div className="main-contens">

38
src/libs/partner.tsx Normal file
View File

@ -0,0 +1,38 @@
import { createPool } from 'mysql2'
const pool = createPool({
host: process.env.DB_HOST as string,
user: process.env.DB_USER as string,
password: process.env.DB_PASSWORD as string,
database: process.env.DB_DATABASE as string,
port: Number(process.env.DB_PORT),
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0,
})
pool.getConnection((err, conn) => {
if (err) console.log('Error connecting to db...')
else console.log('Connected to db...!')
conn.release()
})
const executeQuery = (query: string, arrParams: any[]) => {
return new Promise((resolve, reject) => {
try {
pool.query(query, arrParams, (err, data) => {
if (err) {
console.log('🚀 ~ pool.query ~ err:', err)
reject(err)
}
console.log('🚀 ~ pool.query ~ data:', data)
resolve(data)
})
} catch (err) {
console.log('🚀 ~ returnnewPromise ~ err:', err)
reject(err)
}
})
}
export default executeQuery

View File

@ -7,6 +7,7 @@ import { useHeaderStore } from '@/store/header'
import { usePopupController } from '@/store/popupController'
import { useSideNavState } from '@/store/sideNavState'
import { useSessionStore } from '@/store/session'
import { tracking } from '@/libs/tracking'
declare global {
interface Window {
@ -27,6 +28,17 @@ export default function EdgeProvider({ children, sessionData }: EdgeProviderProp
const { setAlertMsg, setAlertBtn, setAlert, setAlert2, setAlert2BtnYes, setAlert2BtnNo } = usePopupController()
const { session, setSession } = useSessionStore()
/**
*
*
*/
const handlePageEvent = (path: string) => {
tracking({
url: path,
data: '',
})
}
/**
* alert - window.alert
* @param msg
@ -88,6 +100,8 @@ export default function EdgeProvider({ children, sessionData }: EdgeProviderProp
}
//사이드바 초기화
reset()
// 페이지 이벤트 트래킹
// handlePageEvent(pathname)
}, [pathname])
return <>{children}</>