๐Ÿ–ฅ๏ธ ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„: C์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฌํ–‰ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ–ฅ๏ธ ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„: C์–ธ์–ด๋กœ ์‹œ์ž‘ํ•˜๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ฌํ–‰ ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฏธ๋ž˜์˜ ์›น ์„œ๋ฒ„ ๋งˆ์Šคํ„ฐ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ ์‹œ๊ฐ„์„ ๋ณด๋‚ด๋ ค๊ณ  ํ•ด์š”. ๋ฐ”๋กœ C์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๐ŸŽ‰

์—ฌ๋Ÿฌ๋ถ„, ํ˜น์‹œ ์›น ์„œ๋ฒ„๊ฐ€ ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ๋„ค, ๋งž์•„์š”! ์›น ์„œ๋ฒ„๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜, ์šฐ๋ฆฌ๋Š” ์ด ๋งˆ๋ฒ•์˜ ๋น„๋ฐ€์„ C์–ธ์–ด๋กœ ํ’€์–ด๋‚ผ ๊ฑฐ์˜ˆ์š”!

์ด ์—ฌ์ •์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ณผ์ •๊นŒ์ง€ ๋ชจ๋‘ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜Š

์ž, ๊ทธ๋Ÿผ ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„ ๊ตฌํ˜„ ๋ชจํ—˜์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์•ˆ์ „๋ฒจํŠธ ๊ฝ‰ ๋งค์„ธ์š”. ์ด์ œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค! ๐Ÿš€

๐ŸŒŸ ์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๊ฐœ๋… ์ดํ•ดํ•˜๊ธฐ

์šฐ๋ฆฌ์˜ ์—ฌ์ •์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๋จผ์ € ์›น ์„œ๋ฒ„๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ์–ด์š”. ์›น ์„œ๋ฒ„๋Š” ๋‹จ์ˆœํžˆ ๋งํ•ด์„œ ํด๋ผ์ด์–ธํŠธ(์ฃผ๋กœ ์›น ๋ธŒ๋ผ์šฐ์ €)์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ทธ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ๋ณด๋‚ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด์—์š”.

์›น ์„œ๋ฒ„์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณผ๊นŒ์š”?

  • ํด๋ผ์ด์–ธํŠธ์˜ HTTP ์š”์ฒญ ์ˆ˜์‹ 
  • ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค(HTML ํŒŒ์ผ, ์ด๋ฏธ์ง€ ๋“ฑ) ์ฐพ๊ธฐ
  • ์ ์ ˆํ•œ HTTP ์‘๋‹ต ์ƒ์„ฑ
  • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ต ์ „์†ก

์ด๋Ÿฐ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ C์–ธ์–ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด์„œ, ์šฐ๋ฆฌ๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋…๋“ค์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ตํžˆ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€๋กœ๋ถ€ํ„ฐ 1:1๋กœ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜‰

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: ์›น ์„œ๋ฒ„๋Š” 24์‹œ๊ฐ„ 365์ผ ์‰ฌ์ง€ ์•Š๊ณ  ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์š”. ๋งˆ์น˜ ํ•ญ์ƒ ์—ด๋ ค์žˆ๋Š” ์˜จ๋ผ์ธ ์ƒ์ ์ฒ˜๋Ÿผ์š”!

์ด์ œ ์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ๋ณธ๊ฒฉ์ ์œผ๋กœ C์–ธ์–ด๋กœ ๊ตฌํ˜„์„ ์‹œ์ž‘ํ•ด๋ณผ๊นŒ์š”? ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋”ฉ ์‹ค๋ ฅ์ด ํ•œ ๋‹จ๊ณ„ ์—…๊ทธ๋ ˆ์ด๋“œ๋  ์ค€๋น„๋ฅผ ํ•˜์„ธ์š”! ๐Ÿš€

๐Ÿ› ๏ธ C์–ธ์–ด๋กœ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„ํ•˜๊ธฐ: ์ฒซ ๊ฑธ์Œ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ C์–ธ์–ด๋กœ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์šฐ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ๋ชฉํ‘œ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ๊ฐ„๋‹จํ•œ "Hello, World!" ๋ฉ”์‹œ์ง€๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ค„ ๊ฑฐ์˜ˆ์š”.

๋จผ์ €, ํ•„์š”ํ•œ ํ—ค๋” ํŒŒ์ผ๋“ค์„ ํฌํ•จ์‹œ์ผœ ๋ณผ๊นŒ์š”?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
  

์ด ํ—ค๋” ํŒŒ์ผ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜์™€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ œ๊ณตํ•ด์ค˜์š”. ๋งˆ์น˜ ์š”๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ์žฌ๋ฃŒ๋“ค์„ ์ค€๋น„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿณ

๋‹ค์Œ์œผ๋กœ, ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ •์˜ํ•ด๋ณผ๊ฒŒ์š”.


#define PORT 8080
  

ํฌํŠธ ๋ฒˆํ˜ธ 8080์„ ์„ ํƒํ•œ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•˜์‹ ๊ฐ€์š”? ์ด ํฌํŠธ๋Š” ์›น ๊ฐœ๋ฐœ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฒˆํ˜ธ ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ๋ฌผ๋ก , ๋‹ค๋ฅธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ, 1024 ๋ฏธ๋งŒ์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•ด์š”!

๐Ÿ’ก ํŒ: ํฌํŠธ ๋ฒˆํ˜ธ๋Š” 0๋ถ€ํ„ฐ 65535๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ 0-1023์€ ์ž˜ ์•Œ๋ ค์ง„ ์„œ๋น„์Šค๋“ค์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” 1024 ์ด์ƒ์˜ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

์ด์ œ ์šฐ๋ฆฌ์˜ main ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”? ์—ฌ๊ธฐ์„œ ์„œ๋ฒ„์˜ ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ์ œ์–ดํ•  ๊ฑฐ์˜ˆ์š”.


int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char *hello = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";

    // ์—ฌ๊ธฐ์— ์„œ๋ฒ„ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ๊ฑฐ์˜ˆ์š”!

    return 0;
}
  

์šฐ์™€! ๋ฒŒ์จ ์šฐ๋ฆฌ์˜ ์›น ์„œ๋ฒ„์˜ ๋ผˆ๋Œ€๊ฐ€ ๋งŒ๋“ค์–ด์กŒ์–ด์š”. ์ด์ œ ์ด ๋ผˆ๋Œ€์— ์‚ด์„ ๋ถ™์—ฌ๋‚˜๊ฐ€๋ฉด์„œ, ์ง„์งœ ๋™์ž‘ํ•˜๋Š” ์›น ์„œ๋ฒ„๋กœ ๋งŒ๋“ค์–ด๋ณผ ๊ฑฐ์˜ˆ์š”. ๐Ÿ˜Š

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๋„ ์ฐจ๊ทผ์ฐจ๊ทผ ์„œ๋ฒ„ ๊ตฌํ˜„์˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ๋ฐŸ์•„๋‚˜๊ฐˆ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿ”Œ ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ ๋ฐ ์„ค์ •ํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •ํ•ด๋ณผ ๊ฑฐ์˜ˆ์š”. ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ๊ฐ€๊ฒŒ๋ฅผ ์—ด๊ธฐ ์œ„ํ•ด ๋ฌธ์„ ์—ด๊ณ  ์†๋‹˜์„ ๋งž์ดํ•  ์ค€๋น„๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”! ๐Ÿช

๋จผ์ €, ์„œ๋ฒ„ ์†Œ์ผ“์„ ์ƒ์„ฑํ•ด๋ณผ๊นŒ์š”?


// ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
    perror("์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");
    exit(EXIT_FAILURE);
}
  

์—ฌ๊ธฐ์„œ socket() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ์†Œ์ผ“์„ ์ƒ์„ฑํ•ด์š”. AF_INET์€ IPv4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , SOCK_STREAM์€ TCP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋œป์ด์—์š”. ๋งˆ์ง€๋ง‰ 0์€ ํ”„๋กœํ† ์ฝœ์„ ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๋ผ๋Š” ์˜๋ฏธ์˜ˆ์š”.

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: ์†Œ์ผ“์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์˜ ๋์ (endpoint)์ด์—์š”. ๋งˆ์น˜ ์ „ํ™”๊ธฐ์™€ ๊ฐ™์ฃ . ์ „ํ™”๊ธฐ๊ฐ€ ์žˆ์–ด์•ผ ํ†ตํ™”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด, ์†Œ์ผ“์ด ์žˆ์–ด์•ผ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”!

๋‹ค์Œ์œผ๋กœ, ์„œ๋ฒ„ ์†Œ์ผ“์˜ ์˜ต์…˜์„ ์„ค์ •ํ•ด๋ณผ๊ฒŒ์š”.


// ์†Œ์ผ“ ์˜ต์…˜ ์„ค์ •
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
    perror("setsockopt ์‹คํŒจ");
    exit(EXIT_FAILURE);
}
  

์ด ์ฝ”๋“œ๋Š” ์†Œ์ผ“์˜ ์˜ต์…˜์„ ์„ค์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด์—์š”. SO_REUSEADDR์™€ SO_REUSEPORT ์˜ต์…˜์„ ์„ค์ •ํ•จ์œผ๋กœ์จ, ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ํ•  ๋•Œ "์ฃผ์†Œ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘"์ด๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ๊ฐ€๊ฒŒ ๋ฌธ์„ ์—ด ๋•Œ "์˜์—… ์ค‘" ๊ฐ„ํŒ์„ ๊ฑธ์–ด๋‘๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐Ÿšช

์ด์ œ ์„œ๋ฒ„ ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•ด๋ณผ๊นŒ์š”?


// ์„œ๋ฒ„ ์ฃผ์†Œ ์„ค์ •
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
  

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•  ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์žˆ์–ด์š”. INADDR_ANY๋Š” ์„œ๋ฒ„์˜ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ธ๋‹ค๋Š” ์˜๋ฏธ์˜ˆ์š”. ๊ทธ๋ฆฌ๊ณ  htons() ํ•จ์ˆ˜๋Š” ํ˜ธ์ŠคํŠธ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋ฅผ ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ, ์†Œ์ผ“์„ ํŠน์ • ์ฃผ์†Œ์™€ ํฌํŠธ์— ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”.


// ์†Œ์ผ“๊ณผ ์ฃผ์†Œ๋ฅผ ๋ฐ”์ธ๋”ฉ
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
    perror("bind ์‹คํŒจ");
    exit(EXIT_FAILURE);
}

// ์—ฐ๊ฒฐ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ง„์ž…
if (listen(server_fd, 3) < 0) {
    perror("listen ์‹คํŒจ");
    exit(EXIT_FAILURE);
}
  

bind() ํ•จ์ˆ˜๋Š” ์†Œ์ผ“์„ ํŠน์ • ์ฃผ์†Œ์™€ ํฌํŠธ์— ์—ฐ๊ฒฐํ•ด์š”. ๊ทธ๋ฆฌ๊ณ  listen() ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„ ์†Œ์ผ“์„ ์—ฐ๊ฒฐ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ค˜์š”. ์—ฌ๊ธฐ์„œ 3์€ ๋Œ€๊ธฐ์—ด์˜ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•ด์š”. ๋งˆ์น˜ ๊ฐ€๊ฒŒ ์•ž์— 3๋ช…๊นŒ์ง€ ์ค„์„ ์„ค ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ ! ๐Ÿ‘ฅ๐Ÿ‘ฅ๐Ÿ‘ฅ

๐Ÿ’ก ํŒ: ์‹ค์ œ ์„œ๋ฒ„์—์„œ๋Š” ๋Œ€๊ธฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๋” ํฌ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—์š”. ์ด๋ฅผ ํ†ตํ•ด ๋” ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ฃ !

์™€์šฐ! ์ด์ œ ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ผ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ, ์šฐ๋ฆฌ๋„ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ตํ˜€๊ฐ€๊ณ  ์žˆ์–ด์š”. ๐Ÿ‘

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ๊ณ„์†ํ•ด์„œ ์šฐ๋ฆฌ์˜ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„ ์—ฌ์ •์„ ์ด์–ด๋‚˜๊ฐ€๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿค ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ˆ˜๋ฝ ๋ฐ ์š”์ฒญ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์–ด์š”. ๊ทธ๋Ÿผ ์ด์ œ ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ๊นŒ์š”? ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์†๋‹˜์ด ๊ฐ€๊ฒŒ์— ๋“ค์–ด์™€์„œ ์ฃผ๋ฌธ์„ ํ•˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด์š”! ๐Ÿฝ๏ธ

๋จผ์ €, ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ์ˆ˜๋ฝํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊ฒŒ์š”.


while(1) {
    printf("์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...\n");
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
        perror("accept ์‹คํŒจ");
        exit(EXIT_FAILURE);
    }
    
    // ์—ฌ๊ธฐ์— ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ ์ฒ˜๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฑฐ์˜ˆ์š”!
}
  

์—ฌ๊ธฐ์„œ accept() ํ•จ์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•ด์š”. ์ด ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ์†Œ์ผ“ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์–ด์š”. while(1) ๋ฃจํ”„๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์–ด์š”. ๋งˆ์น˜ ๊ฐ€๊ฒŒ์—์„œ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์†๋‹˜์„ ๋งž์ดํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ฃ ! ๐Ÿ˜Š

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: accept() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์ด ๋“ค์–ด์˜ฌ ๋•Œ๊นŒ์ง€ ๋ธ”๋กœํ‚น(๋Œ€๊ธฐ)๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์—ฐ๊ฒฐ์ด ๋“ค์–ด์˜ค๊ธฐ ์ „๊นŒ์ง€๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์•„์š”!

์ด์ œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊นŒ์š”?


char buffer[1024] = {0};
read(new_socket, buffer, 1024);
printf("ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: %s\n", buffer);

char *response = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";
write(new_socket, response, strlen(response));
printf("Hello ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค\n");

close(new_socket);
  

์ด ์ฝ”๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋“ค์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์–ด์š”:

  1. read() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฝ์–ด๋“ค์ž…๋‹ˆ๋‹ค.
  2. ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ˜์†”์— ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ ์„œ๋ฒ„์—์„œ๋Š” ์ด ๋ถ€๋ถ„์—์„œ ์š”์ฒญ์„ ๋ถ„์„ํ•˜๊ณ  ์ ์ ˆํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•ด์š”.)
  3. write() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ "Hello, World!" ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ, close() ํ•จ์ˆ˜๋กœ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๋‚ด๋Š” ์‘๋‹ต์€ HTTP ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด์š”. "HTTP/1.1 200 OK"๋Š” ์ƒํƒœ ๋ผ์ธ์ด๊ณ , "Content-Type: text/plain"์€ ํ—ค๋”, ๊ทธ๋ฆฌ๊ณ  ๋นˆ ์ค„ ๋‹ค์Œ์˜ "Hello, World!"๊ฐ€ ์‹ค์ œ ์ปจํ…์ธ (๋ฐ”๋””)์˜ˆ์š”.

๐Ÿ’ก ํŒ: ์‹ค์ œ ์›น ์„œ๋ฒ„์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ž์„ธํžˆ ๋ถ„์„ํ•˜๊ณ , ์š”์ฒญ๋œ ๋ฆฌ์†Œ์Šค(์˜ˆ: HTML ํŒŒ์ผ)๋ฅผ ์ฐพ์•„ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ค˜์š”. ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ๋Š” ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ํ•ญ์ƒ ๊ฐ™์€ ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ  ์žˆ์–ด์š”.

์™€! ์ด์ œ ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ์„ ๋ฐ›์•„๋“ค์ด๊ณ , ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์–ด์š”. ์ด๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์šฐ๋ฆฌ๋„ ์ด์ œ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„์„ ์ดํ•ดํ•˜๊ณ  ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์ฃ ! ๐Ÿ‘

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ์šฐ๋ฆฌ๋งŒ์˜ ์›น ์„œ๋ฒ„๋ฅผ ๋ณผ ์ƒ๊ฐ์— ๋ฒŒ์จ ์„ค๋ ˆ์ง€ ์•Š๋‚˜์š”? ๊ณ„์†ํ•ด์„œ ์šฐ๋ฆฌ์˜ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„ ์—ฌ์ •์„ ์ด์–ด๋‚˜๊ฐ€๋ณผ๊นŒ์š”? ๐Ÿš€

๐Ÿš€ ์„œ๋ฒ„ ์‹คํ–‰ ๋ฐ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

๋“œ๋””์–ด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์›น ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•  ์‹œ๊ฐ„์ด ์™”์–ด์š”! ์ด ๊ณผ์ •์€ ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งŒ๋“  ์š”๋ฆฌ๋ฅผ ๋ง›๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜‹

๋จผ์ €, ์šฐ๋ฆฌ์˜ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณผ๊นŒ์š”?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define PORT 8080

int main() {
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    char *hello = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";

    // ์„œ๋ฒ„ ์†Œ์ผ“ ์ƒ์„ฑ
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("์†Œ์ผ“ ์ƒ์„ฑ ์‹คํŒจ");
        exit(EXIT_FAILURE);
    }

    // ์†Œ์ผ“ ์˜ต์…˜ ์„ค์ •
    int opt = 1;
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        perror("setsockopt ์‹คํŒจ");
        exit(EXIT_FAILURE);
    }

    // ์„œ๋ฒ„ ์ฃผ์†Œ ์„ค์ •
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // ์†Œ์ผ“๊ณผ ์ฃผ์†Œ๋ฅผ ๋ฐ”์ธ๋”ฉ
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind ์‹คํŒจ");
        exit(EXIT_FAILURE);
    }

    // ์—ฐ๊ฒฐ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ง„์ž…
    if (listen(server_fd, 3) < 0) {
        perror("listen ์‹คํŒจ");
        exit(EXIT_FAILURE);
    }

    while(1) {
        printf("์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...\n");
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
            perror("accept ์‹คํŒจ");
            exit(EXIT_FAILURE);
        }

        char buffer[1024] = {0};
        read(new_socket, buffer, 1024);
        printf("ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: %s\n", buffer);

        write(new_socket, hello, strlen(hello));
        printf("Hello ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค\n");

        close(new_socket);
    }

    return 0;
}
  

์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณผ๊นŒ์š”? ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”:


gcc -o webserver webserver.c
./webserver
  

๋งŒ์•ฝ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ๋˜์—ˆ๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์ผ ๊ฑฐ์˜ˆ์š”:


์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...
  

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ๐ŸŽ‰ ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์„œ๋ฒ„๊ฐ€ ์ง€๊ธˆ ์‹คํ–‰ ์ค‘์ด์—์š”. ์ด์ œ ์ด ์„œ๋ฒ„๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”.

๐Ÿ” ์•Œ์•„๋‘์„ธ์š”: ์‹ค์ œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณด์•ˆ, ์„ฑ๋Šฅ, ์•ˆ์ •์„ฑ ๋“ฑ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋งŽ์•„์š”. ์šฐ๋ฆฌ์˜ ์˜ˆ์ œ๋Š” ํ•™์Šต์„ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์ด์—์š”.

์„œ๋ฒ„๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด์š”. ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•ด๋ณด์„ธ์š”:


http://localhost:8080
  

์™€์šฐ! "Hello, World!" ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์ด๋‚˜์š”? ๐ŸŒŸ

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ curl ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์˜ˆ์š”. ์ƒˆ๋กœ์šด ํ„ฐ๋ฏธ๋„ ์ฐฝ์„ ์—ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์„ธ์š”:


curl http://localhost:8080
  

์ด ๋ช…๋ น์–ด๋„ "Hello, World!" ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•  ๊ฑฐ์˜ˆ์š”.

์„œ๋ฒ„ ํ„ฐ๋ฏธ๋„๋กœ ๋Œ์•„๊ฐ€๋ณด๋ฉด, ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ๊ณผ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”:


์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...
ํด๋ผ์ด์–ธ  ํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋ฉ”์‹œ์ง€: GET / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.68.0
Accept: */*

Hello ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค
์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘...
  

์™€! ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์›น ์„œ๋ฒ„๊ฐ€ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ์–ด์š”. ์ •๋ง ๋Œ€๋‹จํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ‘

๐Ÿ’ก ํŒ: ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ Ctrl+C๋ฅผ ๋ˆ„๋ฅด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ./webserver ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ผ์š”!

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ C์–ธ์–ด๋กœ ๊ฐ„๋‹จํ•œ ์›น ์„œ๋ฒ„๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์–ด์š”. ์ด๋Š” ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณธ ๊ฒƒ๊ณผ ๊ฐ™์•„์š”. ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ธฐ์ดˆ๋ฅผ ์ง์ ‘ ๊ฒฝํ—˜ํ•ด๋ณด์…จ์ฃ ! ๐Ÿš€

๋ฌผ๋ก , ์ด ์„œ๋ฒ„๋Š” ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์‹ค์ œ ์›น ์„œ๋ฒ„๋Š” ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์ฃ . ์˜ˆ๋ฅผ ๋“ค๋ฉด:

  • ๋‹ค์–‘ํ•œ HTTP ๋ฉ”์†Œ๋“œ (GET, POST, PUT, DELETE ๋“ฑ) ์ฒ˜๋ฆฌ
  • ์ •์  ํŒŒ์ผ ์„œ๋น™ (HTML, CSS, JavaScript, ์ด๋ฏธ์ง€ ๋“ฑ)
  • ๋™์  ์ฝ˜ํ…์ธ  ์ƒ์„ฑ
  • ๋ณด์•ˆ ๊ธฐ๋Šฅ (HTTPS, ์ธ์ฆ ๋“ฑ)
  • ๋™์‹œ์— ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ ์ฒ˜๋ฆฌ (๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๋˜๋Š” ๋น„๋™๊ธฐ I/O)

์ด๋Ÿฐ ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์„œ๋ฒ„๋ฅผ ์ ์  ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์–ด์š”. ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๊ณ  ๋ฐœ์ „์‹œ์ผœ ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ ! ๐Ÿ˜Š

์—ฌ๋Ÿฌ๋ถ„์˜ ์ฒซ ์›น ์„œ๋ฒ„ ๊ตฌํ˜„์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ถ•ํ•˜๋“œ๋ ค์š”! ๐ŸŽ‰ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ ์›น์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ง์ ‘ ๊ตฌํ˜„๊นŒ์ง€ ํ•ด๋ณด์…จ์–ด์š”. ์ด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋ณต์žกํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

๋‹ค์Œ ๋‹จ๊ณ„๋กœ๋Š” ์–ด๋–ค ๊ฒƒ์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•ด ๋“œ๋ฆด๊ฒŒ์š”:

  1. ์„œ๋ฒ„๊ฐ€ ์‹ค์ œ HTML ํŒŒ์ผ์„ ์„œ๋น™ํ•˜๋„๋ก ๊ฐœ์„ ํ•ด๋ณด๊ธฐ
  2. POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ์ถ”๊ฐ€ํ•˜๊ธฐ
  3. ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ๊ตฌํ˜„ํ•˜๊ธฐ
  4. ๊ฐ„๋‹จํ•œ ๋กœ๊น… ์‹œ์Šคํ…œ ์ถ”๊ฐ€ํ•˜๊ธฐ
  5. ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

์ด ๋ชจ๋“  ๊ณผ์ •์ด ๋•Œ๋กœ๋Š” ์–ด๋ ต๊ณ  ๋„์ „์ ์œผ๋กœ ๋Š๊ปด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์žฌ๋Šฅ๋„ท์—์„œ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐฐ์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ํ•œ ๋‹จ๊ณ„์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‚˜์•„๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋Š์ƒˆ ํ›Œ๋ฅญํ•œ ์›น ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ’ช

์—ฌ๋Ÿฌ๋ถ„์˜ ์›น ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์—ฌ์ •์„ ์‘์›ํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ํ˜ธ๊ธฐ์‹ฌ์„ ๊ฐ€์ง€๊ณ  ํ•™์Šตํ•˜๊ณ  ์‹คํ—˜ํ•ด๋ณด์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ์–ธ์ œ๋“  ์งˆ๋ฌธ์ด ์žˆ๋‹ค๋ฉด, ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ๋ฌผ์–ด๋ณด์„ธ์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ, ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฌ˜๋ฏธ๋‹ˆ๊นŒ์š”! ๐ŸŒฑ

ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ฆ๊ฑฐ์šด ์ฝ”๋”ฉ ๋˜์„ธ์š”! ๐Ÿš€๐Ÿ‘จโ€๐Ÿ’ป๐Ÿ‘ฉโ€๐Ÿ’ป