๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Server

Github Action + Docker + Nginx + React ์•ผ๋งค CI/CD ์™„์„ฑ๊ธฐ

by LasBe 2023. 3. 20.
๋ฐ˜์‘ํ˜•

๐Ÿ“’ Github Action + Docker + Nginx + React ์•ผ๋งค CI/CD ์™„์„ฑ๊ธฐ


๐Ÿ“Œ ๊ณ„๊ธฐ

๋นˆ์•ฝํ•œ ์„œ๋ฒ„ ์ง€์‹์„ ๊ฐ–๊ณ  ์žˆ์—ˆ๋˜ ์ €๋Š” ์ž…์‚ฌ ํ›„ ์‚ฌ๋‚ด ๊ตฌ์ถ•๋œ CI/CD ํ™˜๊ฒฝ์„ ๋ณด๊ณ  ์‹ ๋ฌธ๋ฌผ์„ ๋งŒ๋‚œ ์›์ฃผ๋ฏผ๋งˆ๋ƒฅ ๊นœ์ง ๋†€๋ž์Šต๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ข‹์•„๋ณด์ด๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ฐ€ ์ง์ ‘ ํ•ด๋ณด์ง€ ์•Š๊ณ ์„  ์ง์„ฑ์ด ํ’€๋ฆฌ์ง€ ์•Š์ฃ . 

 

๊ทธ๋Ÿฌ๋‹ค ์–ด๋Š๋‚  ๋ช‡ ๊ฐœ์›”๊ฐ„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ๋จผ์ง€ ์Œ“์—ฌ์žˆ๋Š” ๊ฐœ์ธ ์œˆ๋„์šฐ ๋…ธํŠธ๋ถ์ด ๋ˆˆ์— ๋“ค์–ด์™”๊ณ ,

๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด๋ฒ„๋ฆฐ ํ›„ ์šฐ๋ถ„ํˆฌ๋ฅผ ์„ค์น˜ํ•ด์„œ ํ•˜๊ณ  ์žˆ๋˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์ „ํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

 

์„œ๋ฒ„ ์ชฝ ๊ธฐ์ดˆ ํ•˜๋‚˜ ์—†์ด ์‚ฝ์งˆํ–ˆ๋˜ ๊ธฐ์–ต์— ์ €์™€ ๊ฐ™์€ ์ƒํ™ฉ์— ์žˆ์œผ์‹  ๋ถ„๋“ค์—๊ฒŒ

์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•˜๋Š” ๋งˆ์Œ์—์„œ ์“ด ๊ธ€์ด๋‹ˆ ๊ธฐ์ˆ ์ ์ธ ๋ถ€๋ถ„์—์„œ๋Š” ๋งŽ์ด ๋ถ€์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ ๋ถ„๋Ÿ‰ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ์ดˆ์ ์„ ๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋””ํ…Œ์ผํ•œ ๊ฒƒ๋“ค์€ ๋งŽ์ด ์ƒ๋žต๋˜์–ด ๋”ฐ๋กœ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.


๐Ÿ“Œ Docker ์„ค์น˜

// ubuntu ๋„์ปค ์„ค์น˜
$ apt-get install docker

๊ทธ๋ƒฅ ๋„์ปค ์—†์ด nginx๋ฅผ ์‹คํ–‰ํ•ด ๋ฐฐํฌํ•ด๋„ ๋์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ €๋„

์ด๋ฏธ์ง€์™€ ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ตฌ๋™๋˜๋Š” Docker๊ฐ€ ํŽธ๋ฆฌํ•˜๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋„์ปค๋กœ Nginx๋ฅผ ๊ตฌ๋™ํ•˜๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Nginx ์ปจํ…Œ์ด๋„ˆ ์˜ฌ๋ฆฌ๊ธฐ

 

# nginx ์ด๋ฏธ์ง€ pull
$ docker pull nginx

# nginx ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰
$ docker run --name myNginx -d -p 8082:80 nginx

# docker ์‹คํ–‰ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ
$ docker ps

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ pull ๋ฐ›์•„์ค๋‹ˆ๋‹ค.

 

๊ทธ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ƒ์„ฑ, ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

 

myNginx ๋ถ€๋ถ„์€ ๋ณธ์ธ์ด ์›ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ช…์นญ์ด๊ณ ,

์™ธ๋ถ€์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ๋ฅผ ์ด์–ด์ฃผ๋Š” ์˜ต์…˜์€ -p [์™ธ๋ถ€ํฌํŠธ:์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ํฌํŠธ]๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ €๋Š” 80, 8080, 8081 ํฌํŠธ๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉ ์ค‘์ด๋ผ 8082๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ

์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ํฌํŠธ๊ฐ€ ์—†๋Š” ๋ถ„์€ ์›น ์„œ๋ฒ„ ๊ธฐ๋ณธ ํฌํŠธ์ธ 80์œผ๋กœ ์„ค์ •ํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ Github Action, self-hosted runner

github action์€ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ๋กœ์จ ์ž์ฒด ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„๊ฐ€ ์žˆ์ง€๋งŒ

์ €๋Š” ๊ฐœ์ธ ์„œ๋ฒ„๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Runner๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

์ž์‹ ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ ‘์† ํ›„

Setting > Actions/Runners > New self-hosted runner ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์ค๋‹ˆ๋‹ค.

 

์ž์‹ ์˜ ์šด์˜์ฒด์ œ์™€ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•ด ์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์นœ์ ˆํ•˜๊ฒŒ Runner๋ฅผ ์„ค์น˜ ๋ฐ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

๋ช…๋ น์–ด๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. ํด๋” ์ƒ์„ฑ ํ›„ ์ด๋™
  2. ์••์ถ•ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ
  3. ์••์ถ• ํ•ด์ œ
  4. ๋Ÿฌ๋„ˆ์— ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ† ํฐ ์„ค์ •
  5. ์‹คํ–‰

์ œ๊ฐ€ ์ฒ˜์Œ์— ๋ง‰์—ฐํ•˜๊ฒŒ ์–ด๋ ค์› ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋‹ฌ๋ฆฌ ์ •๋ง ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋Ÿฌ๋„ˆ ํŒŒ์ผ์„ ์„ค์น˜ ๋ฐ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•„๊นŒ ์˜ฌ๋ ค๋‘” nginx ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

# ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
$ docker exec -it myNginx bash

exec ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด bash ์‰˜์„ ์‹คํ–‰ํ•ด ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

 

๋Ÿฌ๋„ˆ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์ „์— ๋Ÿฌ๋„ˆ ํŒŒ์ผ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด shasum ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•œ๋ฐ

์ปจํ…Œ์ด๋„ˆ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์น˜๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์•„ ๋จผ์ € ํ•ด๊ฒฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

# apt update
$ apt-get update

# shasum ์„ค์น˜
$ apt-get install libdigest-sha-perl

 

๊ทธ๋Ÿผ ๊ธฐ๋ณธ์ ์ธ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ ๋์œผ๋‹ˆ ์œ„์—์„œ ์ œ๊ณตํ•œ ๋ช…๋ น์–ด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰์‹œ์ผœ ํŒŒ์ผ์„ ๋ฐ›์€ ๋’ค ์••์ถ•์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”Ž Runner, Must not run with sudo

๋‹ค์Œ Configure ๋ถ€๋ถ„์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ๋˜๋Š”๋ฐ

Must not run with sudo๋ผ๋Š” ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋ฉฐ ํ† ํฐ ์„ค์ •์ด ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

  • run-helper.sh
  • config.sh
  • run-helper.sh.template

 

๋ณด์•ˆ ๋•Œ๋ฌธ์— ์‹ฌ์–ด์ง„ ์ฝ”๋“œ๋กœ ๋ณด์ด๋‚˜,

๊ฐœ์ธ ์„œ๋ฒ„ ์—ฐ์Šต์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด RUNNER_ALLOW_RUNASROOT๋ฅผ ์ „์—ญํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋“ฑ๋กํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

# ์ „์—ญํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋ก
$ export RUNNER_ALLOW_RUNASROOT="1"

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
$ echo $RUNNER_ALLOW_RUNASROOT

์œ„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๋ฉด ์ œ๊ณตํ•œ Configure ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ํ† ํฐ์„ ๋“ฑ๋กํ•ด ์ฃผ๊ณ 

๋Ÿฌ๋„ˆ ์„ค์ •์„ ๋งˆ๋ฌด๋ฆฌํ•ด ์ฃผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ €๋Š” ๊ท€์ฐฎ์•„์„œ ์ „๋ถ€ ์—”ํ„ฐํ‚ค๋กœ ์Šคํ‚ตํ–ˆ์Šต๋‹ˆ๋‹ค.

 

์„ค์ •๊นŒ์ง€ ๋งˆ์ณค์œผ๋‹ˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ๋Ÿฌ๋„ˆ๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ nohup ./run.sh &

$ ./run.sh๋กœ ๊ทธ๋ƒฅ ์‹คํ–‰์‹œ์ผœ๋„ ๋˜์ง€๋งŒ

nohup์„ ํ†ตํ•ด ํ„ฐ๋ฏธ๋„์„ ์ข…๋ฃŒํ•ด๋„ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ณ 

& ์˜ต์…˜์„ ํ†ตํ•ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊นƒํ—ˆ๋ธŒ์— ๋Ÿฌ๋„ˆ๊ฐ€ idle ์ƒํƒœ๋กœ ํ‘œ์‹œ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ Github Action, workflow

์ด์ œ ๋Ÿฌ๋„ˆ ์ค€๋น„๋Š” ๋๋‚ฌ๊ณ  ์›ํ•˜๋Š” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด

ํ”„๋กœ์ ํŠธ ํด๋” ๋ฃจํŠธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋”์™€ yml ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

 

๊นƒํ—ˆ๋ธŒ์—์„œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ธ์‹์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํด๋”๋ช…์€ ๊ผญ .github/workflows๋กœ ์ง€์ •ํ•ด ์ฃผ์„ธ์š”

 

๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŒŒ์ผ์„ ์ž‘์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

 

๋ถ„๋Ÿ‰ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋งŒ ์ฃผ์„์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ  ๋‚˜๋จธ์ง€์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

name: CD

on:
  push:
    # main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•˜๋ฉด ์ž‘๋™
    branches: [ main ]

jobs:
  build:
    runs-on: self-hosted
    steps:    
      # ์ œ๊ณตํ•˜๋Š” checkout ์•ก์…˜์„ ์ด์šฉํ•ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ
      - uses: actions/checkout@v3
      
      - run: pwd
      - run: ls -al
      
      # ๋…ธ๋“œ ์•ก์…˜์„ ํ†ตํ•ด npm ๋ช…๋ น์–ด ์‚ฌ์šฉ
      - uses: actions/setup-node@v3
        with:
          node-version: 16
      - run: npm install
      - run: npm run build

 

๊ทธ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ปค๋ฐ‹ ํ›„ ํ‘ธ์‹œํ•˜๋ฉด ๊นƒํ—ˆ๋ธŒ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ๋นŒ๋“œ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“Œ Nginx ์„ค์ •

์ž๋™์œผ๋กœ ๋นŒ๋“œ๊นŒ์ง€ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ •์  ํŒŒ์ผ๋“ค์„ ์„œ๋น™ํ•  ์›น ์„œ๋ฒ„์ธ Nginx ๋˜ํ•œ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ๊ฒ ์ฃ ?

# default.conf
server{
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
    	# ๋นŒ๋“œ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ํด๋” ๊ฒฝ๋กœ
        root   /actions-runner/_work/runner-ex/runner-ex/build;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

nginx ์„ค์ •ํŒŒ์ผ์€ listen ๋ถ€๋ถ„์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ๋ช…์‹œํ–ˆ๋˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํฌํŠธ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๊ณ 

root ๋ถ€๋ถ„์— ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ์ด ์กด์žฌํ•˜๋Š” build ํด๋” ์œ„์น˜๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ nginx ํŒŒ์ผ์„ ๊ณ ์ •์œผ๋กœ ๋ฐ•์•„๋‘์–ด๋„ ๋˜์ง€๋งŒ ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋•Œ

workflow์— ํฌํ•จ๋˜์–ด ์ž๋™ํ™”๋œ๋‹ค๋ฉด ์ •๋ง ํŽธํ•˜๊ฒ ์ฃ ?

 

# ๊ธฐ์กด ์„ค์ • ํŒŒ์ผ ์‚ญ์ œ
- run: rm /etc/nginx/conf.d/default.conf
# checkout ํ•˜๋ฉฐ ๋ฐ›์•„์˜จ ์„ค์ •ํŒŒ์ผ ์ด๋™
- run: mv default.conf /etc/nginx/conf.d/
# ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ ์šฉ์„ ์œ„ํ•œ nginx ์žฌ์‹คํ–‰
- run: service nginx reload

๊ทธ๋Ÿผ deploy.yml ํŒŒ์ผ์˜ steps์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

์ด์ œ ํ‘ธ์‹œํ•˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ๋์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์ œ๋Œ€๋กœ ๋ฐฐํฌ๊ฐ€ ๋˜์—ˆ๋‚˜ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ œ ip ์ฃผ์†Œ์™€ ์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€ ์ ‘์† ํฌํŠธ์ธ 8082๋ฅผ ์ด์šฉํ•ด ์ ‘์†ํ•ด ๋ณด๋‹ˆ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!


๊ธ€์ด ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์ด ๊ธธ์–ด์กŒ๋Š”๋ฐ ์ฒ˜์Œ์œผ๋กœ ๋„์ „ํ•˜์‹œ๋Š” ๋ถ„๋“ค๊ป˜ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

 

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€


์˜คํ”ˆ ์ฑ„ํŒ