HTTP ํŒจํ‚ท ๋ถ„์„ํ•˜๊ธฐ

2025. 9. 18. 10:33ยท๐ŸŒ WEB
728x90

net ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด HTTP ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ

1. net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„ ์ƒ์„ฑ

 

์šฐ์„  ๊ฐ€์žฅ ๋จผ์ € HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์›น์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

net ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  server.listen ์œผ๋กœ ์ง€์ •๋œ PORT ์— ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ listen ํ•˜๋ฉฐ

socket.on ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

import net from 'net';

// ๊ธฐ๋ณธ HTTP ์„œ๋ฒ„ ์„ค์ •
const PORT = 80;
const HOST = '0.0.0.0';

/**
 * net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„
 * Express ๋“ฑ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ net ๋ชจ๋“ˆ๋กœ HTTP ์„œ๋ฒ„ ๊ตฌํ˜„
 */
const server = net.createServer((socket) => {
  console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ:', socket.remoteAddress + ':' + socket.remotePort);

  // HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
  socket.on('data', (data) => {
    const request = data.toString();
    console.log('์ˆ˜์‹ ๋œ ์š”์ฒญ:');
    console.log(request);

    // ๊ธฐ๋ณธ HTTP ์‘๋‹ต (์ž„์‹œ)
    const response = [
      'HTTP/1.1 200 OK',
      'Content-Type: text/html; charset=utf-8',
      'Connection: close',
      '',
      '<h1>Codestargram Web Server</h1>',
      '<p>net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„๊ฐ€ ์ •์ƒ ๋™์ž‘ ์ค‘์ž…๋‹ˆ๋‹ค.</p>'
    ].join('\r\n');

    socket.write(response);
    socket.end();
  });

  // ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ
  socket.on('close', () => {
    console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ข…๋ฃŒ');
  });

  // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
  socket.on('error', (err) => {
    console.error('์†Œ์ผ“ ์—๋Ÿฌ:', err);
  });
});

// ์„œ๋ฒ„ ์‹œ์ž‘
server.listen(PORT, HOST, () => {
  console.log(`๐Ÿš€ Codestargram Web Server running on http://${HOST}:${PORT}`);
});

// ์„œ๋ฒ„ ์—๋Ÿฌ ์ฒ˜๋ฆฌ
server.on('error', (err) => {
  console.error('์„œ๋ฒ„ ์—๋Ÿฌ:', err);
});

// ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์‹œ ์„œ๋ฒ„ ์ •๋ฆฌ
process.on('SIGINT', () => {
  console.log('\n์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค...');
  server.close(() => {
    console.log('์„œ๋ฒ„ ์ข…๋ฃŒ ์™„๋ฃŒ');
    process.exit(0);
  });
});

 

 

๊ทธ๋ฆฌ๊ณ  node server.js ๋ฅผ ํ†ตํ•ด ์œ„ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด 80๋ฒˆ ํฌํŠธ์—์„œ HTTP ์„œ๋ฒ„๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


์ด ์ƒํƒœ์—์„œ ํ•œ๋ฒˆ http://localhost ์— ์ ‘์†ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํƒญ์— ์ ‘์†ํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ์™€ PORT ์ •๋ณด๊ฐ€ ์ฐํžˆ๊ณ ,

socket.on ์—์„œ ๋“ค์–ด์˜จ HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ธŒ๋ผ์šฐ์ €์— URL ๋กœ ์ ‘์†ํ–ˆ์„ ๋ฟ์ธ๋ฐ, ์–ด๋–ป๊ฒŒ HTTP GET ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜๋Š”์ง€ ๋ฌป๋Š”๋‹ค๋ฉด,

๊ทธ๊ฒƒ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. URL ์— ์ ‘์†ํ•˜๋ฉด ํ•ด๋‹น ์„œ๋ฒ„์˜ 80๋ฒˆ ํฌํŠธ๋กœ HTTP GET ์š”์ฒญ์„ ๋ณด๋‚ด๋„๋ก ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

  // HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
  socket.on('data', (data) => {
    const request = data.toString();

    console.log(request);
    }

 

 

 

 

๊ฐ€์žฅ ์ฒซ์ค„์€ Request line ์œผ๋กœ์„œ method urI ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „์ด ๋ช…์‹œ๋ฉ๋‹ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ•˜์œ„ HTTP ํ—ค๋”์—๋Š” ๋ณด๋‚ธ์ด์˜ ์‹ ์›, ์ž์‹ ์˜ ํ™˜๊ฒฝ, ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ˆˆ์—ฌ๊ฒจ๋ด์•ผ ํ•  ํ•„๋“œ๋Š” URI ์™€ Accept ์ž…๋‹ˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ ์ž ๊น, URL ๊ณผ URI ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๐Ÿ“Œ URI (Uniform Resource Identifier, ํ†ตํ•ฉ ์ž์› ์‹๋ณ„์ž)

  • ์ •์˜: ์ธํ„ฐ๋„ท ์ƒ์˜ ์–ด๋–ค “์ž์›(Resource)”์„ ์‹๋ณ„(identify) ํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด.
  • ์ฆ‰, ์ด ์ž์›์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ์‹๋ณ„์ž.
  • URI๋Š” ๋‘ ๊ฐ€์ง€ ํ•˜์œ„ ๊ฐœ๋…์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์Œ:
    1. URL (Locator) → ์ž์›์˜ ์œ„์น˜๋ฅผ ์•Œ๋ ค์คŒ (์–ด๋””์— ์žˆ๋Š”์ง€)
    2. URN (Name) → ์ž์›์˜ ์ด๋ฆ„์„ ์•Œ๋ ค์คŒ (์–ด๋–ค ์ด๋ฆ„์„ ๊ฐ–๋Š”์ง€)

๐Ÿ“Œ URL (Uniform Resource Locator, ํ†ตํ•ฉ ์ž์› ์œ„์น˜์ž)

  • ์ •์˜: URI์˜ ํ•œ ์ข…๋ฅ˜๋กœ, ์ž์›์˜ ์œ„์น˜(location) ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ.
  • ์ฆ‰, “์ž์›์ด ์–ด๋””์— ์žˆ๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€” ์•Œ๋ ค์คŒ.
  • ๋ณดํ†ต ์šฐ๋ฆฌ๊ฐ€ ์›น์—์„œ ์“ฐ๋Š” ์ฃผ์†Œ(http://, https://, ftp://)๋Š” ์ „๋ถ€ URL.

 

 

URL

https://www.example.com:443/path/page.html?query=abc#section2
  • https → ์Šคํ‚ด(ํ”„๋กœํ† ์ฝœ)
  • www.example.com:443 → ํ˜ธ์ŠคํŠธ + ํฌํŠธ
  • /path/page.html → ๊ฒฝ๋กœ
  • ?query=abc → ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง
  • #section2 → ํ”„๋ž˜๊ทธ๋จผํŠธ(๋ฌธ์„œ ๋‚ด๋ถ€ ์œ„์น˜)

 


์ฆ‰, URL ์€ ์–ด๋–ค Host ์˜ ์–ด๋–ค Port ์ธ์ง€ ๋“ฑ  ์–ด๋–ค ๊ฒฝ๋กœ(Path) ์— ์ž์›์ด ์œ„์น˜ํ•˜๋Š”์ง€์™€ ๊ด€๋ จํ•œ ์ •๋ณด์ด๊ณ ,

 

URI ๋Š” ๊ฑฐ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€์„œ ๊ฒฝ๋กœ์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๊ทธ ์ค‘ ์–ด๋–ค ์ •ํ™•ํžˆ ์ž์›์„ ์›ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง ๋“ฑ์˜ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

๋”ฐ๋ผ์„œ Url ์œผ๋กœ๋Š” ์ •ํ™•ํžˆ ์–ด๋–ค ์ž์›์„ ์š”๊ตฌํ•˜๋Š”์ง€, Accept ์—์„œ๋Š” ์–ด๋–ค ํŒŒ์ผ ํ˜•์‹์„ ์›ํ•˜๋Š”์ง€  ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

Index.html ๋ฐ˜ํ™˜ํ•˜๊ธฐ

 

์›น์„œ๋ฒ„๋Š” HTML, CSS, JS ๊ฐ™์€ ์ •์  ์ž์›๋“ค์„ ์„œ๋น™ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

SPA ๋Š” ๋ณดํ†ต index.html + bundle.js ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ,

 

http://localhost/index.html ์— ์ ‘์†ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € -> ์„œ๋ฒ„๋กœ index.html ์š”์ฒญ์ด ๋‚ ์•„๊ฐ€๊ณ , 

์šฐ๋ฆฌ๋Š” ์ ์ ˆํ•œ ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์‘๋‹ตํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ € ๊ฐ™์€ ๊ฒฝ์šฐ ๋‚ด๋ถ€ frontend/dist ๊ฒฝ๋กœ์— ์ตœ์ข… ๋นŒ๋“œ๋œ ํ”„๋ก ํŠธ์—”๋“œ ๋ฒˆ๋“ค ํŒŒ์ผ์„ ์œ„์น˜ํ•˜์˜€์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์ ์œผ๋กœ index.html ์„ ์ฝ๊ณ  ์‘๋‹ต์— ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. 

// frontend/dist ๊ฒฝ๋กœ ์„ค์ •
const FRONTEND_DIST_PATH = path.join(process.cwd(), '../frontend/dist');

/**
 * net ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ HTTP ์„œ๋ฒ„
 * Express ๋“ฑ ์™ธ๋ถ€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ net ๋ชจ๋“ˆ๋กœ HTTP ์„œ๋ฒ„ ๊ตฌํ˜„
 */
const server = net.createServer((socket) => {
  const startTime = Date.now();
  const clientAddress = socket.remoteAddress + ':' + socket.remotePort;

  console.log('ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ๋จ:', clientAddress);

  // HTTP ์š”์ฒญ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ 
  socket.on('data', async (data) => {
    try {
      const request = data.toString();

      // HTTP ์š”์ฒญ ํŒŒ์‹ฑ
      const lines = request.split('\r\n');
      const requestLine = lines[0];
      const [method, url] = requestLine ? requestLine.split(' ') : ['', ''];

      // User-Agent ํ—ค๋” ์ถ”์ถœ
      const userAgentLine = lines.find((line) =>
        line.toLowerCase().startsWith('user-agent:')
      );
      const userAgent = userAgentLine
        ? userAgentLine.split(': ')[1]
        : 'Unknown';

      // ์š”์ฒญ ๋กœ๊ทธ ๊ธฐ๋ก
      logRequest(method, url, userAgent, socket.remoteAddress);

      // URI, MIME TYPE ์— ๋”ฐ๋ผ HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜

      let responseBody;
      let statusCode = 200;
      let contentType = 'text/html; charset=utf-8';

      // GET /index.html ๋˜๋Š” GET / ์š”์ฒญ ์ฒ˜๋ฆฌ
      if (method === 'GET' && (url === '/' || url === '/index.html')) {
        try {
          const indexPath = path.join(FRONTEND_DIST_PATH, 'index.html');
          responseBody = await fs.readFile(indexPath, 'utf8');
        } catch (error) {
          logError(error, 'Failed to read index.html');
          statusCode = 404;
          responseBody =
            '<h1>404 Not Found</h1><p>index.html ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.</p>';
        }
      }
 

      const statusText = statusCode === 200 ? 'OK' : 'Not Found';
      const response = [
        `HTTP/1.1 ${statusCode} ${statusText}`,
        `Content-Type: ${contentType}`,
        'Connection: close',
        `Content-Length: ${Buffer.byteLength(responseBody, 'utf8')}`,
        '',
        responseBody,
      ].join('\r\n');

      // ์‘๋‹ต ๋กœ๊ทธ ๊ธฐ๋ก
      const responseTime = Date.now() - startTime;
      logResponse(statusCode, contentType, responseTime);

      socket.write(response);
      socket.end();
    } catch (error) {
      logError(error, 'Request processing error');

      const errorResponse = [
        'HTTP/1.1 500 Internal Server Error',
        'Content-Type: text/html; charset=utf-8',
        'Connection: close',
        '',
        '<h1>500 Internal Server Error</h1><p>์„œ๋ฒ„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.</p>',
      ].join('\r\n');

      socket.write(errorResponse);
      socket.end();
    }
  });

 

๊ทธ๋Ÿฐ๋ฐ index.html ๋งŒ ์‘๋‹ตํ–ˆ๋‹ค๊ณ  ์›นํŽ˜์ด์ง€๊ฐ€ ๊ทธ๋ ค์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

index.html ์„ ํ•ด๋…ํ•˜๋ฉด์„œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค์‹œํ•œ๋ฒˆ bundle.js ํŒŒ์ผ์„ ์š”์ฒญํ• ํ…๋ฐ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋Œ€๋ชฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ bundle.js ๋ฅผ ์ œ๋Œ€๋กœ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

     // GET /bundle.js ์š”์ฒญ ์ฒ˜๋ฆฌ
      else if (method === 'GET' && url === '/bundle.js') {
        try {
          const bundlePath = path.join(FRONTEND_DIST_PATH, 'bundle.js');
          responseBody = await fs.readFile(bundlePath, 'utf8');
          contentType = 'application/javascript; charset=utf-8';
        } catch (error) {
          logError(error, 'Failed to read bundle.js');
          statusCode = 404;
          responseBody = 'console.error("bundle.js not found");';
          contentType = 'application/javascript; charset=utf-8';
        }
      }

 

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด index.html ์— bundle.js ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด์„œ ํ™”๋ฉด์ด ์ œ๋Œ€๋กœ ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๋„คํฌ์›Œํฌ ํƒญ์„ ํ™•์ธํ•ด๋ณด๋ฉด ๋‘๊ฐœ์˜ ์š”์ฒญ+์‘๋‹ต์„ ์ฃผ๊ณ  ๋ฐ›์€ ์‚ฌ์‹ค์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



 

๊ทธ๋ฆฌ๊ณ  ํ•œ๊ฐ€์ง€ ์‹ ๊ธฐํ•œ ์‚ฌ์‹ค์€ ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ /favicon.ico ๋ฅผ ์š”์ฒญํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์ฆ‰, http://example.com/ ์ ‘์† → http://example.com/favicon.ico ์ž๋™ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋„๋ก ์ •์  ๋ฐฐํฌ dist ํด๋”์— favicon.ico์„ ์œ„์น˜์‹œ์ผœ์ค„ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 
์ด๋ฅผ ์œ„ํ•ด์„œ Webpack์— CopyWebpackPlugin ์ถ”๊ฐ€ํ•˜์—ฌpublic ํด๋”์˜ ์ •์  ํŒŒ์ผ๋“ค(favicon.ico ๋“ฑ)์„ dist ํด๋”๋กœ ์ž๋™ ๋ณต์‚ฌํ•˜๊ณ 
์›น์„œ๋ฒ„๋Š” dist ํด๋” ํ•˜๋‚˜๋งŒ ์„œ๋น™ํ•˜๋ฉด ๋˜๋„๋ก ํ†ตํ•ฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
 

CopyWebpackPlugin์ด๋ž€?


 

๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์„ ๊ฒฌ๋””๋Š” ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๊ตฌํ˜„ํ•˜๊ธฐ

์—ฌํƒœ๊นŒ์ง€๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” HTTP ์›น ์„œ๋ฒ„๋ฅผ ๋‹ค๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์š”์ฒญ์˜ ์ˆ˜๊ฐ€ ๊ธ‰์ฆํ•œ๋‹ค๋ฉด,

๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์†Œ ์•„์‰ฝ๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋งŒ์•ฝ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด๋ผ๋ฉด ๊ตณ์ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ˆ˜ํ‰ ํ™•์žฅํ•  ํ•„์š”๋„ ์—†๊ธฐ์— ์žˆ๋Š” ์ž์›์„ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. 

 

๋”ฐ๋ผ์„œ ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ๊ฐ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค/ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด๋ณด๊ณ  ๊ฐ ๋ฐฉ์‹์„ ๋น„๊ต ๋ถ„์„ํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

1. cluster ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•ด CPU ์ฝ”์–ด ์ˆ˜๋งŒํผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ

2. Worker Threads ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ๊ตฌํ˜„

 

 

์ด ๋•Œ, ์„ฑ๋Šฅ ๊ฐœ์„  ํ›„์™€ ์ „์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ํ™•์ธํ•ด๋ณด๊ธฐ ์œ„ํ•ด์„œ  ์›น ์„ฑ๋Šฅ ๋ถ€ํ•˜๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๊ธฐ ์œ„ํ•ด Apache Bench ๋ฅผ ํ™œ์šฉํ•˜๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

Apache Bench (ab)

  • ์•„ํŒŒ์น˜ HTTP ์„œ๋ฒ„์™€ ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ๊ฐ„๋‹จํ•œ ๋ฒค์น˜๋งˆํฌ ๋„๊ตฌ
  • ๊ธฐ๋ณธ ๊ธฐ๋Šฅ: ๋™์‹œ ์ ‘์† ์ˆ˜, ์š”์ฒญ ์ˆ˜๋ฅผ ์ง€์ •ํ•ด์„œ ์„œ๋ฒ„์— ๋ถ€ํ•˜ ๊ฑธ๊ธฐ
  • ์˜ˆ:
    • -n 1000 → ์ด 1000๋ฒˆ ์š”์ฒญ
    • -c 100 → ๋™์‹œ์— 100๊ฐœ ์š”์ฒญ
  • ab -n 1000 -c 100 http://localhost/

 

๐Ÿ’ฅ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹คํŒจ: Apache Bench failed with code 60: Completed 5000 requests
apr_socket_recv: Operation timed out (60)
(base) kimseoyeon@gimseoyeons-MacBook-Air-2 webserver % npm run test:performance

> codestargram-webserver@1.0.0 test:performance
> node test/performanceTest.js

๐Ÿš€ ์›น์„œ๋ฒ„ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์‹œ์ž‘
๐Ÿ“ก ๋Œ€์ƒ ์„œ๋ฒ„: http://127.0.0.1:80
============================================================

๐Ÿ“Š ๊ธฐ๋ณธ ํŽ˜์ด์ง€ ๋กœ๋“œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 1000 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: HTML ํŽ˜์ด์ง€ ๋กœ๋“œ (index.html)

๐Ÿ“Š JavaScript ํŒŒ์ผ ๋กœ๋“œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 500 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/bundle.js
๐Ÿ“ ํ…Œ์ŠคํŠธ: JavaScript ํŒŒ์ผ ๋กœ๋“œ (bundle.js)

๐Ÿ“Š ํŒŒ๋น„์ฝ˜ ๋กœ๋“œ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 500 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/favicon.ico
๐Ÿ“ ํ…Œ์ŠคํŠธ: ํŒŒ๋น„์ฝ˜ ๋กœ๋“œ (favicon.ico)

๐Ÿ“Š ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜ ์ŠคํŠธ๋ ˆ์Šค ํ…Œ์ŠคํŠธ

๐Ÿ”ฅ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜: 1
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 200 -c 1 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋™์‹œ ์—ฐ๊ฒฐ 1๊ฐœ

๐Ÿ”ฅ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜: 5
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 200 -c 5 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋™์‹œ ์—ฐ๊ฒฐ 5๊ฐœ

๐Ÿ”ฅ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜: 10
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 200 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋™์‹œ ์—ฐ๊ฒฐ 10๊ฐœ

๐Ÿ”ฅ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜: 20
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 200 -c 20 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋™์‹œ ์—ฐ๊ฒฐ 20๊ฐœ

๐Ÿ”ฅ ๋™์‹œ ์—ฐ๊ฒฐ ์ˆ˜: 50
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 200 -c 50 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋™์‹œ ์—ฐ๊ฒฐ 50๊ฐœ

๐Ÿ“Š Keep-Alive ์„ฑ๋Šฅ ๋น„๊ต ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 500 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: Keep-Alive ๋น„ํ™œ์„ฑํ™”
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 500 -c 10 -s 60 -g gnuplot.dat -e results.csv -k http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: Keep-Alive ํ™œ์„ฑํ™”

๐Ÿ“Š ์ง€์† ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ (20์ดˆ)
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -t 20 -c 10 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: 20์ดˆ๊ฐ„ ์ง€์† ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ

============================================================
๐Ÿ“Š ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ
============================================================

๐ŸŽฏ HTML ํŽ˜์ด์ง€ ๋กœ๋“œ (index.html)
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 1000
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 7008.74 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 1.43 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3114.24 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.143 ์ดˆ

๐ŸŽฏ JavaScript ํŒŒ์ผ ๋กœ๋“œ (bundle.js)
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 500
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 4468.08 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 2.24 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 163857.07 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.112 ์ดˆ

๐ŸŽฏ ํŒŒ๋น„์ฝ˜ ๋กœ๋“œ (favicon.ico)
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 500
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 5574.26 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 1.79 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 947.19 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.09 ์ดˆ

๐ŸŽฏ ๋™์‹œ ์—ฐ๊ฒฐ 1๊ฐœ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 200
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 1048.29 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 0.95 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 465.79 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.191 ์ดˆ

๐ŸŽฏ ๋™์‹œ ์—ฐ๊ฒฐ 5๊ฐœ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 200
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 6928.81 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 0.72 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3078.72 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.029 ์ดˆ

๐ŸŽฏ ๋™์‹œ ์—ฐ๊ฒฐ 10๊ฐœ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 200
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 8215.24 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 1.22 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3650.33 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.024 ์ดˆ

๐ŸŽฏ ๋™์‹œ ์—ฐ๊ฒฐ 20๊ฐœ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 200
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 9794.80 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 2.04 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 4352.18 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.02 ์ดˆ

๐ŸŽฏ ๋™์‹œ ์—ฐ๊ฒฐ 50๊ฐœ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 200
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 8990.38 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 5.56 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3994.75 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.022 ์ดˆ

๐ŸŽฏ Keep-Alive ๋น„ํ™œ์„ฑํ™”
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 500
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 8943.58 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 1.12 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3973.96 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.056 ์ดˆ

๐ŸŽฏ Keep-Alive ํ™œ์„ฑํ™”
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 500
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 7413.89 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 1.35 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 3294.26 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 0.067 ์ดˆ

๐ŸŽฏ 20์ดˆ๊ฐ„ ์ง€์† ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 12342
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 559.31 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 17.88 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 248.52 KB/sec
   โฐ ์ด ์†Œ์š” ์‹œ๊ฐ„: 22.067 ์ดˆ

๐ŸŽ‰ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ!

 

Cluster ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์„œ๋ฒ„ ๊ตฌํ˜„

 

(base) kimseoyeon@gimseoyeons-MacBook-Air-2 webserver % node test/clusterTest.js
๐Ÿš€ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ์„ฑ๋Šฅ ๋น„๊ต ํ…Œ์ŠคํŠธ ์‹œ์ž‘
๐Ÿ“ก ๋Œ€์ƒ ์„œ๋ฒ„: ClusterPerformanceTester
============================================================

๐Ÿ“Š ๋‹จ์ผ vs ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ์„ฑ๋Šฅ ๋น„๊ต ํ…Œ์ŠคํŠธ

๐Ÿ”น ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๋ชจ๋“œ ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 2000 -c 50 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๋ชจ๋“œ

โณ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ์ „ํ™˜์„ ์œ„ํ•ด ์„œ๋ฒ„ ์žฌ์‹œ์ž‘ ํ•„์š”
๐Ÿ’ก ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜์„ธ์š”:
   USE_CLUSTER=true node webserver/server.js
   ๋˜๋Š”
   node webserver/server.js --cluster

โธ๏ธ  ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ์„œ๋ฒ„ ์‹œ์ž‘ ํ›„ ์•„๋ฌด ํ‚ค๋‚˜ ๋ˆ„๋ฅด์„ธ์š”...

๐Ÿ”น ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ ํ…Œ์ŠคํŠธ
๐Ÿš€ ์‹คํ–‰ ์ค‘: ab -n 2000 -c 50 -s 60 -g gnuplot.dat -e results.csv http://127.0.0.1:80/
๐Ÿ“ ํ…Œ์ŠคํŠธ: ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ

============================================================
๐Ÿ“ˆ ํด๋Ÿฌ์Šคํ„ฐ ์„ฑ๋Šฅ ๋น„๊ต ๋ถ„์„
============================================================

๐Ÿ”น ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค:
   โšก RPS: 6191.91 req/sec
   โฑ๏ธ  ์‘๋‹ต์‹œ๊ฐ„: 8.07 ms
   ๐Ÿ“ˆ ์ „์†ก์†๋„: 2751.29 KB/sec

๐Ÿ”น ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ:
   โšก RPS: 5421.27 req/sec
   โฑ๏ธ  ์‘๋‹ต์‹œ๊ฐ„: 9.22 ms
   ๐Ÿ“ˆ ์ „์†ก์†๋„: 2408.87 KB/sec

๐Ÿ“Š ์„ฑ๋Šฅ ๊ฐœ์„ ๋„:
   โšก RPS ํ–ฅ์ƒ: -12.45%
   โฑ๏ธ  ์‘๋‹ต์‹œ๊ฐ„ ๊ฐœ์„ : -14.22%
   ๐Ÿ“ˆ ์ „์†ก์†๋„ ํ–ฅ์ƒ: -12.45%

โš ๏ธ  ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ์—์„œ ์˜ˆ์ƒ๋ณด๋‹ค ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์ ์Šต๋‹ˆ๋‹ค.
    ๋†’์€ ๋™์‹œ์„ฑ ๋ถ€ํ•˜์—์„œ ๋” ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

============================================================
๐Ÿ“Š ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์š”์•ฝ
============================================================

๐ŸŽฏ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ๋ชจ๋“œ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 2000
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 6191.91 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 8.07 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 2751.29 KB/sec

๐ŸŽฏ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋“œ
   โœ… ์™„๋ฃŒ๋œ ์š”์ฒญ: 2000
   โŒ ์‹คํŒจํ•œ ์š”์ฒญ: 0
   โšก ์ดˆ๋‹น ์š”์ฒญ ์ˆ˜: 5421.27 req/sec
   โฑ๏ธ  ํ‰๊ท  ์‘๋‹ต ์‹œ๊ฐ„: 9.22 ms
   ๐Ÿ“ˆ ์ „์†ก ์†๋„: 2408.87 KB/sec

๐ŸŽ‰ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์™„๋ฃŒ!

๐Ÿ’พ ํด๋Ÿฌ์Šคํ„ฐ ๋น„๊ต ๊ฒฐ๊ณผ ์ €์žฅ๋จ: cluster-performance-test-2025-09-17T13-26-31-597Z.json
(base) kimseoyeon@gimseoyeons-MacBook-Air-2 webserver %

 

 

 

 

 

'๐ŸŒ WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

์›น ์‚ฌ์ดํŠธ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•  (0) 2026.01.19
HTTP Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ  (0) 2025.10.01
Node.js๋กœ ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ: Cluster์™€ Worker Threads  (0) 2025.09.28
HTTP ํŒจํ‚ท ๊ตฌ์กฐ, ์š”์ฒญ ํ—ค๋”/๋ฐ”๋””  (0) 2025.09.17
Web Server ์™€ WAS(Web Application Server)๋ž€ ?  (0) 2025.09.15
'๐ŸŒ WEB' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • HTTP Multipart/form-data ์ง์ ‘ ํŒŒ์„œ ๋งŒ๋“ค๋ฉฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ
  • Node.js๋กœ ๊ณ ์„ฑ๋Šฅ ์›น์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ: Cluster์™€ Worker Threads
  • HTTP ํŒจํ‚ท ๊ตฌ์กฐ, ์š”์ฒญ ํ—ค๋”/๋ฐ”๋””
  • Web Server ์™€ WAS(Web Application Server)๋ž€ ?
์—ฐ์žŽ(lotus leaf)
์—ฐ์žŽ(lotus leaf)
  • ์—ฐ์žŽ(lotus leaf)
    lotus' s develog ๐Ÿƒ
    ์—ฐ์žŽ(lotus leaf)
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (79)
      • โœ๏ธ ๊ฐœ๋ฐœํšŒ๊ณ ๋ก (5)
      • ๐Ÿงฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (3)
      • ๐Ÿ’™ ํ”„๋ก ํŠธ์—”๋“œ(FE) (19)
        • HTML (0)
        • CSS (0)
        • Javascript (0)
        • React (0)
        • Next.js (0)
        • webpack & babel (0)
      • ๐Ÿ’ป ๋ฐฑ์—”๋“œ(BE) (2)
        • Nest.js (0)
        • Express.js (0)
        • MySQL (1)
      • โš™๏ธ ์ธํ”„๋ผ(Devops) (2)
      • ๐Ÿค– AI (1)
      • ๐ŸŒ WEB (8)
      • ๐Ÿ’ป CS (16)
        • ์ž๋ฃŒ๊ตฌ์กฐ (0)
        • ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ (1)
        • ์šด์˜์ฒด์ œ (0)
        • ์ธ๊ณต์ง€๋Šฅ (8)
        • ์›น ๋ณด์•ˆ (1)
        • ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ… (6)
      • ๐Ÿ–‹๏ธ DevLog (1)
      • ๐Ÿฆพ ๋กœ๋ณดํ‹ฑ์Šค (4)
      • ๐Ÿ“— ๋„ค์ด๋ฒ„๋ถ€์ŠคํŠธ์บ ํ”„ ์›น ๋ชจ๋ฐ”์ผ (0)
      • ๐ŸŽฎ Unity(C#) (10)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (4)
        • C (4)
        • C++ (0)
        • Java (0)
        • Python (0)
      • MSA (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ฐฑ์ค€
    ์กฐํ•ฉ
    gaussian rbf svm
    ์ดํ™”์—ฌ์ž๋Œ€ํ•™๊ต #๋„์ „ํ•™๊ธฐ์ œ
    ๋ฆฌ์•กํŠธ
    c++
    ํŒŒ์ผํŠธ๋ฆฌ
    c์–ธ์–ด
    ์ŠคํŒธ๋ฉ”์ผ๋ถ„๋ฅ˜๊ธฐ
    Devops #๋Œ€๊ทœ๋ชจํŠธ๋ž˜ํ”ฝ์ฒ˜๋ฆฌ
    deploy-aws
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    auto-scaling
    C#
    ์ฝ”๋”ํŒจ๋“œ
    advaned detail
    next.js12
    ros bridge
    ๊ธฐ์ดˆ์•Œ๊ณ ๋ฆฌ์ฆ˜
    soft margin svm
    isaac automator
    ์ŠคํŒธ๋ถ„๋ฅ˜๊ธฐ
    ros workspace
    ์ˆœ์—ด
    AWS
    nav2
    client-streaming
    C
    turtlebot
    hard margin svm
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์—ฐ์žŽ(lotus leaf)
HTTP ํŒจํ‚ท ๋ถ„์„ํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”