Responsive Advertisement

Node.js์—์„œ MySQL ๋ฐ์ดํ„ฐ ์ œํ•œํ•˜๊ธฐ: LIMIT ์‚ฌ์šฉ๋ฒ•

MySQL์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ํŠน์ • ์กฐ๊ฑด์— ๋งž๋Š” ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ LIMIT ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •ํ•œ ๊ฐœ์ˆ˜๋งŒํผ์˜ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Node.js์™€ MySQL์„ ์—ฐ๋™ํ•˜์—ฌ LIMIT์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Node.js์™€ MySQL ์—ฐ๊ฒฐ ์„ค์ •

MySQL ๋ฐ์ดํ„ฐ๋ฅผ ์ œํ•œํ•˜์—ฌ ์กฐํšŒํ•˜๊ธฐ ์ „์—, ๋จผ์ € Node.js์™€ MySQL ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด mysql2 ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ , MySQL ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. mysql2 ํŒจํ‚ค์ง€ ์„ค์น˜

MySQL๊ณผ Node.js๋ฅผ ์—ฐ๋™ํ•˜๋ ค๋ฉด mysql2 ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋Š” MySQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์—ฐ๋™์„ ์‰ฝ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.

$ npm init -y
$ npm install mysql2

์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด mysql2 ํŒจํ‚ค์ง€๋ฅผ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. MySQL ์—ฐ๊ฒฐ ์„ค์ •

๋‹ค์Œ์€ MySQL ์„œ๋ฒ„์™€์˜ ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ธฐ๋ณธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด MySQL์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// app.js

const mysql = require('mysql2');

// MySQL ์—ฐ๊ฒฐ ์„ค์ •
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'your-password',
    database: 'node_mysql'
});

// MySQL ์—ฐ๊ฒฐ
connection.connect((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
});

MySQL์—์„œ LIMIT ์‚ฌ์šฉํ•˜๊ธฐ

MySQL์˜ LIMIT ์ ˆ์€ ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”์—์„œ ์ƒ์œ„ 10๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ์กฐํšŒํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด LIMIT์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1. ๊ธฐ๋ณธ์ ์ธ LIMIT ์‚ฌ์šฉ๋ฒ•

๋‹ค์Œ์€ users ํ…Œ์ด๋ธ”์—์„œ ์ฒซ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

// ์ฒซ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ
const selectQuery = 'SELECT * FROM users LIMIT 5';

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
connection.query(selectQuery, (err, results) => {
    if (err) {
        console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ:', results);
});

์œ„ ์ฝ”๋“œ๋Š” users ํ…Œ์ด๋ธ”์—์„œ ์ƒ์œ„ 5๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋งŒ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. LIMIT 5๋Š” ๊ฒฐ๊ณผ๋ฅผ 5๊ฐœ๋กœ ์ œํ•œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

2. LIMIT์™€ OFFSET ์‚ฌ์šฉํ•˜๊ธฐ

LIMIT์€ OFFSET๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OFFSET์€ ๊ฒฐ๊ณผ์—์„œ ๋ช‡ ๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ฌ์ง€ ์„ค์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 6๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// 6๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ 5๊ฐœ ๋ฐ์ดํ„ฐ ์กฐํšŒ
const selectQuery = 'SELECT * FROM users LIMIT 5 OFFSET 5';

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
connection.query(selectQuery, (err, results) => {
    if (err) {
        console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ:', results);
});

์œ„ ์ฟผ๋ฆฌ๋Š” 6๋ฒˆ์งธ ๋ ˆ์ฝ”๋“œ๋ถ€ํ„ฐ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ฒ˜์Œ 5๊ฐœ์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ๊ทธ ์ดํ›„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

3. LIMIT์™€ ORDER BY ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ

๋ณดํ†ต LIMIT์€ ORDER BY์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ์ƒ์œ„ ๋ช‡ ๊ฐœ๋งŒ ์กฐํšŒํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๊ฐ€์ž…ํ•œ ์‚ฌ์šฉ์ž 3๋ช…์„ ์กฐํšŒํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๊ฐ€์ž…์ผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ 3๋ช… ์กฐํšŒ
const selectQuery = 'SELECT * FROM users ORDER BY created_at DESC LIMIT 3';

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
connection.query(selectQuery, (err, results) => {
    if (err) {
        console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('์ตœ๊ทผ ๊ฐ€์ž…ํ•œ ์‚ฌ์šฉ์ž:', results);
});

์œ„ ์ฟผ๋ฆฌ๋Š” ORDER BY created_at DESC๋กœ ์‚ฌ์šฉ์ž์˜ ๊ฐ€์ž…์ผ์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•œ ํ›„, ๊ฐ€์žฅ ์ตœ๊ทผ์— ๊ฐ€์ž…ํ•œ 3๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

4. LIMIT์™€ ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ตฌํ˜„

๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ  ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. LIMIT๊ณผ OFFSET์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํ•œ ํŽ˜์ด์ง€์— ํ‘œ์‹œํ•  ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ์„ค์ •ํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํ•œ ํŽ˜์ด์ง€๋‹น ๋ฐ์ดํ„ฐ ์ˆ˜
const page = 2;   // 2๋ฒˆ์งธ ํŽ˜์ด์ง€
const limit = 5;  // ํ•œ ํŽ˜์ด์ง€์— 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ
const offset = (page - 1) * limit;

// ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฟผ๋ฆฌ
const selectQuery = 'SELECT * FROM users LIMIT ? OFFSET ?';
const data = [limit, offset];

// ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
connection.query(selectQuery, data, (err, results) => {
    if (err) {
        console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log(`ํŽ˜์ด์ง€ ${page}์˜ ๋ฐ์ดํ„ฐ:`, results);
});

์œ„ ์ฝ”๋“œ์—์„œ๋Š” ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ์™€ ํŽ˜์ด์ง€๋‹น ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ LIMIT๊ณผ OFFSET์„ ํ™œ์šฉํ•œ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. 2๋ฒˆ์งธ ํŽ˜์ด์ง€์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉฐ, ํ•œ ํŽ˜์ด์ง€์— 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ

๋ฐ์ดํ„ฐ ์กฐํšŒ ์ž‘์—…์ด ๋๋‚˜๋ฉด MySQL ์—ฐ๊ฒฐ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. connection.end() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด MySQL ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ
connection.end((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
});

์ „์ฒด ์ฝ”๋“œ ์˜ˆ์‹œ

์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ, ์ƒ์œ„ 5๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ์ „์ฒด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// app.js

const mysql = require('mysql2');

// MySQL ์—ฐ๊ฒฐ ์„ค์ •
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'your-password',
    database: 'node_mysql'
});

// MySQL ์—ฐ๊ฒฐ
connection.connect((err) => {
    if (err) {
        console.error('MySQL ์—ฐ๊ฒฐ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
        return;
    }
    console.log('MySQL์— ์„ฑ๊ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');

    // LIMIT์„ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ฟผ๋ฆฌ
    const selectQuery = 'SELECT * FROM users LIMIT 5';

    // ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํ–‰
    connection.query(selectQuery, (err, results) => {
        if (err) {
            console.error('๋ฐ์ดํ„ฐ ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
            return;
        }
        console.log('์กฐํšŒ๋œ ๋ฐ์ดํ„ฐ:', results);

        // MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ
        connection.end((err) => {
            if (err) {
                console.error('MySQL ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ:', err);
                return;
            }
            console.log('MySQL ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
        });
    });
});

๊ฒฐ๋ก 

Node.js์—์„œ MySQL์„ ์‚ฌ์šฉํ•  ๋•Œ LIMIT ์ ˆ์„ ํ™œ์šฉํ•˜๋ฉด ์›ํ•˜๋Š” ๊ฐœ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋น ๋ฅด๊ฒŒ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LIMIT๊ณผ OFFSET์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€๋„ค์ด์…˜๋„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด, ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™”์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œ์ผœ๋ณด์„ธ์š”!

๋Œ“๊ธ€ ์“ฐ๊ธฐ