๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- old dev log

[Best Of the Best ํ™œ๋™๊ธฐ] 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ ํ›„๊ธฐ - ์ธํ”„๋ผ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ ํ–ˆ๋˜ ๊ณ ๋ฏผ๋“ค

by Wonit 2021. 8. 25.

์˜ค๋Š˜์€ BoB 10๊ธฐ ๋ณด์•ˆ์ œํ’ˆ๊ฐœ๋ฐœ ํŠธ๋ž™์˜ ๋ณด์•ˆ ์†”๋ฃจ์…˜ ์ œ์ž‘ ์ˆ˜์—…์—์„œ ํ•œ๋‹ฌ๋™์•ˆ ์ง„ํ–‰ํ•œ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ•œ๋‹ค.

ํ•ด๋‹น ๊ธ€์€ ์ด 2๋ถ€์ž‘์œผ๋กœ ํŒ€ ๋นŒ๋”ฉ๊ณผ ํ˜‘์—… ๊ณผ์ • ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค ์„ค๋ช… ๋ฐ ๊ฐœ๋ฐœ ๊ณผ์ • ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ”„๋กœ์ ํŠธ github ๋ฐ”๋กœ๊ฐ€๊ธฐ -> ๋ณด์•ˆ ์œ„ํ˜‘ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„ ์†”๋ฃจ์…˜ github

 

GitHub - dhslrl321/L7-monitor: ๐Ÿ” L7 ์—์„œ ๋™์ž‘ํ•˜๋Š” Access Log ๊ธฐ๋ฐ˜ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„ ๋ฐ ๋ณด์•ˆ ์œ„ํ˜‘ ๋ถ„์„ ์„œ๋น„์Šค

๐Ÿ” L7 ์—์„œ ๋™์ž‘ํ•˜๋Š” Access Log ๊ธฐ๋ฐ˜ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„ ๋ฐ ๋ณด์•ˆ ์œ„ํ˜‘ ๋ถ„์„ ์„œ๋น„์Šค (BoB 10 ๊ธฐ ๋ณด์•ˆ์ œํ’ˆ๊ฐœ๋ฐœ 1์ฐจ ํŒ€ ํ”„๋กœ์ ํŠธ) - GitHub - dhslrl321/L7-monitor: ๐Ÿ” L7 ์—์„œ ๋™์ž‘ํ•˜๋Š” Access Log ๊ธฐ๋ฐ˜ ํŠธ๋ž˜ํ”ฝ ๋ถ„์„ ๋ฐ ๋ณด

github.com


 

์ง€๋‚œ ์‹œ๊ฐ„์€ Back End ๋ฅผ Spring Boot๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ ํ–ˆ๋˜ ๊ธฐ์ˆ ์  ๊ณ ๋ฏผ๊ณผ ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐ๋ฅผ ํ–ˆ์—ˆ๋‹ค.

 

์˜ค๋Š˜์€ Front์™€ Back ์„ ์ ์ ˆํžˆ ๋‚˜๋ˆ ์ฃผ๋Š” ์ธํ”„๋ผ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

์•„๋ž˜ ๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ๊ฐ€ ์„ค๊ณ„ํ•œ ์•„ํ‚คํ…์ณ์ด๋‹ค.

 

 

์šฐ๋ฆฌ ์„œ๋น„์Šค๋ฅผ ์ž์„ธํžˆ ๋ณธ๋‹ค๋ฉด Nginx๊ฐ€ ์œ„์น˜ํ•ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ Computing Machine ์—์„œ 2๊ฐœ์˜ ์„œ๋ฒ„๊ฐ€ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋‹ค.

 

  1. React View ๋ฅผ Render ํ•  ์›น์„œ๋ฒ„
  2. API๋ฅผ ๋ฐ˜ํ™˜ํ•  WAS

 

์ด ๋‘˜์„ ๋‚˜๋Š” ํ•˜๋‚˜์˜ Port๋กœ ํ•ฉ์น˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

์‚ฌ์‹ค ๋‘ ๊ฐœ์˜ ํฌํŠธ๋ฅผ ์—ด์–ด์„œ ์šด์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ฒ ์ง€๋งŒ, SSL ํ†ต์‹ ์ด๋‚˜ ์ถ”ํ›„ SaaS๋กœ ๋ฐœ์ „ํ•ด ์ธ์ฆ ๋กœ์ง์ด ์žˆ๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํฌํŠธ๋กœ ์šด์˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์•„๋ณด์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ Reverse Proxy๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค ํ–ˆ๋‹ค.

 

Reverse Proxy๋Š” Nginx๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋กœ๋Š” Nginx๊ฐ€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ๋” ๋น ๋ฅด๋‹ค ๋ญ๋‹ค ํ•˜๋Š” ์žฅ์ ์ด ์žˆ๊ฒ ์ง€๋งŒ ๋‚˜๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋‚ด๊ฐ€ ์จ๋ด์„œ ์˜€์—ˆ๋‹ค..

 

์ด๊ฒŒ ํƒ€๋‹นํ•˜์ง€ ๋ชปํ•œ ๊ธฐ์ˆ  ์„ ์ •์˜ ์ด์œ ๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ ์กฐ์ง ๋‚ด๋ถ€์—์„œ๋Š” ๊ฐœ๋ฐœ๊ณผ ๊ตฌํ˜„์ด ํ•œ ์‹œ๊ฐ€ ๊ธ‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋งˆ์ €๋„ ํƒ€๋‹นํ•œ ๊ฒƒ์ด ๋˜์–ด๋ฒ„๋ ธ๋‹ค ใ…Žใ…Ž..

 

๋˜ํ•œ ๋ฐฐํฌ์™€ ํŒจํ‚ค์ง•์€ docker-compose ์™€ shell-script ๋ฅผ ์ ์ ˆํžˆ ์ด์šฉํ–ˆ๊ณ , ์ด ๊ณผ์ •์—์„œ ์–ด๋–ค ์„ค์ •์„ ํ–ˆ์—ˆ๋Š”์ง€๋ฅผ ๊ณต์œ ํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

Nginx์˜ Reverse Proxy

 

๋‚˜๋Š” ๋ชจ๋“  ์„œ๋ฒ„๋ฅผ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ๊ตฌ๋™ํ•˜๊ณ ์ž ํ•˜์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด nginx ์˜ ๋ฉ”์ธ ์„ค์ • ํŒŒ์ผ์ธ nginx.conf ํŒŒ์ผ์„ ์ •์˜ํ•ด์ฃผ๊ณ  Dockerfile ์„ ๋งŒ๋“ค์–ด dockerizing ์„ ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ”๋‹ค.

 

upstream front-server {
  server front-container:5000;
}

upstream backend-server {
  server back-container:8080;
}

server {
  listen 80;
  server_name l7-monitor;

  location / {
    proxy_pass http://front-server;
  }

  location /api {
    proxy_pass http://backend-server;
  }
}

 

์šฐ์„  ์„ค์ •์„ ํ™•์ธํ•ด๋ณด์ž.

 

server ๋ธ”๋ก์—์„œ nginx ์ž์ฒด๋ฅผ 80 ํฌํŠธ๋ฅผ Listening ํ•˜๊ฒŒ ํ•œ๋‹ค. ์ด๋Š” ๋‹ค์Œ์— ์žˆ์„ ๋ฐฐํฌ์™€ ํŒจํ‚ค์ง•์—์„œ ํ˜ธ์ŠคํŠธ PC์˜ 80 ํฌํŠธ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์ค€๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  2๊ฐœ์˜ Upstream ์„œ๋ฒ„๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, 2๊ฐœ์˜ Upstream ์„œ๋ฒ„๋Š” ๊ฐ๊ฐ 80 ํฌํŠธ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์ด URL Matching ์„ ํ†ตํ•ด์„œ Front์™€ Back์œผ๋กœ ๊ฐ๊ฐ ํฌ์›Œ๋”ฉ์ด ๋œ๋‹ค.

 

Upstream ์„œ๋ฒ„ ๊ฐ๊ฐ์€ Front ์„œ๋ฒ„์™€ Back ์„œ๋ฒ„ ๊ฐ๊ฐ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์ค€๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ ๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์ด Host Name์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ์ ์–ด์ฃผ์–ด Host ๋ฅผ ์‹๋ณ„ํ•˜๊ฒŒ ํ•˜์—ฌ, ๋™์ผํ•œ Bridge Network ์—์„œ Host Name ์œผ๋กœ IP๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.

 

์ด์ œ ํ•ด๋‹น nginx.conf ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ Dockerfile ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ–ˆ๋‹ค.

 

FROM nginx:latest

WORKDIR /proxy

COPY ./nginx.conf /etc/nginx/nginx.conf

RUN rm -rf /etc/nginx/conf.d/default.conf

ENTRYPOINT ["nginx", "-g", "daemon off;"]

EXPOSE 80

 

๊ทธ๋ฆฌ๊ณ  nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ Listening ํ•˜๊ณ  ์žˆ๋Š” 80 ํฌํŠธ๋ฅผ ํฌ์›Œ๋”ฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

 

Dockerizing๊ณผ ๋ฐฐํฌ ์—์„œ ๋งŒ๋‚œ ์—ฌ๋Ÿฌ ์ƒํ™ฉ๋“ค

์ด์ œ Front, Back, Proxy ๋ชจ๋‘ ๊ตฌ์„ฑ์„ ํ–ˆ์œผ๋‹ˆ ๊ฐ๊ฐ์˜ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ Dockerfile ์„ ์‹คํ–‰์‹œ์ผœ๋ณผ ๋•Œ๊ฐ€ ์™”๋‹ค.

 

๊ทผ๋ฐ ๊ฐ‘์ž๊ธฐ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋๋‹ค.

 

์•ž์—์„œ ๊ณ„์† ๋‚˜๋Š” Saas ๋ฅผ ์™ธ์ณค์ง€๋งŒ ๊ฒฐ๊ตญ์€ On-Premise ๊ฐ€ ๋˜์—ˆ๋‹ค! ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ด ์‹œ์  ๋ถ€ํ„ฐ ๋ณ€๊ฒฝ์ด ๋˜์—ˆ๋˜ ๊ฒƒ์ด๋‹ค..

 

๊ทธ๋ž˜์„œ On-Premise ์— ๋งž๊ฒŒ ๊ตฌ์„ฑ์„ ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ๊ทธ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

 

๊ธฐ์กด์—๋Š” SaaS ํ˜•ํƒœ๋กœ, Front์™€ Back์„ ์šฐ๋ฆฌ๊ฐ€ ์šด์˜์„ ํ•˜๊ณ  ์ธ์ฆ์„ ๊ฑฐ์นœ ํ›„ ํ•ด๋‹น ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋งŒ ์‹œ๊ฐํ™” ํ•˜๋ฉด ๋˜์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ On-Premise ์—์„œ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Front, Back ๋ชจ๋‘๋ฅผ ๊ณ ๊ฐ์ด ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ†ต์œผ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ธฐ์กด์— ์žˆ๋˜ Dockerfile ๋“ค์„ ์ˆ˜์ •ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

 

์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ๋„์ปค ์ด๋ฏธ์ง€์— ์–ด๋–ป๊ฒŒ ๋™์ ์œผ๋กœ ๊ณ ๊ฐ์˜ IP๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

IP๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ผ์€ ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ์ค‘์š”ํ•˜๋‹ค.

 

์šฐ์„  ๊ฐ„๋‹จํ•˜๊ฒŒ IP๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ผ๋ฉด CORS ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ Backend ์—์„œ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ๊ฒƒ ๋ถ€ํ„ฐ์„œ IP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆํ•˜๊ณ  ๋™์ž‘ํ•œ๋‹ค.

 

๊ฒฐ๊ตญ ๋™์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ IP๋ฅผ ์ง€์ •ํ–ˆ๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์„ ์ง๋ฉดํ–ˆ๋‹ค.

 

  1. React ์—์„œ .env๋กœ ๋™์  IP ์ฃผ์ž…
  2. Spring Boot ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋™์  IP ์ฃผ์ž…

 

React ์—์„œ .env๋กœ ๋™์  IP ์ฃผ์ž…

 

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

 

๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•ฑ ๋‚ด๋ถ€์—์„œ process.env.REACT_APP... ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค๋ฉด

 

REACT_APP_HOST_IP=192.168.0.2

 

์ด๋ผ๋Š” env ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์‹ค์ œ ์•ฑ ๋‚ด๋ถ€์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

import axios from "axios";

export const SERVER = axios.create({
  baseURL: "http://" + process.env.REACT_APP_HOST_IP,
  headers: {
    "Content-Type": "application/json",
  },
});

 

์ด๋Ÿฐ ๋ฐฉ์‹์„ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ๋„์ปค๋ผ์ด์ง•์„ ํ•  ๋•Œ, env ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ณผ์ •์—์„œ ๋„์ปค ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ env ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜์ด ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋„์ปค๋ผ์ด์ง• ์‹œ์— ๋™์ ์œผ๋กœ .env ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ฐฉํ–ฅ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

์ด ๋ง์ด ๋ฌด์Šจ๋ง์ด๋ƒ๋ฉด, ์šฐ์„  ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— create-env-file.sh ๋ผ๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

 

#/bin/bash
touch .env
for envvar in "$@"

do
  echo "$envvar" >> .env
done

 

ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋Š” sh ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ฃผ์–ด์ง€๋Š” args ๋กœ env ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Dockerfile ์—์„œ๋Š”

 

...
# env ๋ณ€์ˆ˜ ํ• ๋‹น ๋ฐ ์ƒˆ๋กœ์šด .env ํŒŒ์ผ ์ƒ์„ฑ
ARG REACT_APP_HOST_IP
RUN sh create-env-file.sh REACT_APP_BACK_END_URL=$REACT_APP_HOST_IP
...

 

๊ณผ ๊ฐ™์ด ํ•ด๋‹น ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ์„œ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  docker-compose ๋กœ ํ•ด๋‹น ๋„์ปคํŒŒ์ผ์„ build ์‹œ์ผœ๋ฒ„๋ฆฌ๋ฉด์„œ ๋™์‹œ์— IP๋ฅผ ARGS๋กœ ์ œ๊ณตํ•ด๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.

 

version: "3"

services:
  front:
    container_name: front-container
    build:
      context: ./frontend
      args:
        REACT_APP_HOST_IP: 172.17.0.1
    image: l7-frontend

 

์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Spring Boot ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Spring Boot ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋™์  IP ์ฃผ์ž…

 

Spring Boot ์—์„œ IP๋ฅผ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€๋ถ„์€ ๋ฐ”๋กœ CORS Filter ๋ฅผ ๋งŒ๋“œ๋Š” ์‹œ์ ์— ํ•ด๋‹น๋œ๋‹ค

 

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    @Value("${boribob.host-ip}")
    private String HOST_IP;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // ์ƒ๋žต
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader("Access-Control-Allow-Origin", "http://" + HOST_IP + "/");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods","*");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers",
                "Origin, X-Requested-With, Content-Type, Accept, Authorization");


        if("OPTIONS".equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        }else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        // ์ƒ๋žต
    }
}

 

์—ฌ๊ธฐ์„œ Value ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์— ์กด์žฌํ•˜๋Š” ์™ธ๋ถ€ ์„ค์ •๊ฐ’์„ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ทธ๋Ÿผ ๋˜ ์–ด๋–ป๊ฒŒ ์™ธ๋ถ€ ์„ค์ •๊ฐ’์„ ์ „๋‹ฌํ• ๊นŒ?๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์•„์•ผ ํ•œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‚˜๋Š” java -jar ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ์‹œ์ ์— IP๋ฅผ ์™ธ๋ถ€ ํ™˜๊ฒฝ์œผ๋กœ ์ฃผ์ž…๋ฐ›๋„๋ก ํ•˜์˜€๋‹ค.

 

์šฐ์„  application.yml ์— default ip ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฏธ๋ฆฌ build๋ฅผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Dockerfile ์—์„œ ๋ฐ›๋Š” env ๋กœ IP๋ฅผ ์ฃผ์ž…๋ฐ›๊ณ  java -jar ์— ์™ธ๋ถ€ ํ™˜๊ฒฝ์„ ์ฃผ์ž…ํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ๋‚˜์˜จ Dockerfile ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

 

FROM openjdk:17-ea-11-jdk-slim

WORKDIR /server

ARG DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Seoul
RUN apt-get install -y tzdata

COPY ./L7-Monitor.jar l7-monitor.jar

ARG HOST_IP

ENV HOST_IP=${HOST_IP}

ENTRYPOINT ["java", "-jar", "l7-monitor.jar", "--spring.datasource.url=jdbc:mysql://bori-db-container/bob_l7?characterEncoding=utf8", "--boribob.host-ip=$HOST_IP"]

 

์—ฌ๊ธฐ์„œ ENV HOST_IP=${HOST_IP} ๋ผ๋Š” ์ปค๋งจ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

 

ํ•ด๋‹น ์ปค๋งจ๋“œ๋Š” ENTRYPOINT ์—์„œ ARGS ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ENV๋กœ ํ•œ ๋ฒˆ ๊ฑฐ์ณ๊ฐ€๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์™„์„ฑ๋œ docker-compose ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

version: "3"

services:
  db:
    container_name: bori-db-container
    image: lauvsong/bori-db:210821
    restart: always
    ports:
      - "3306:3306"

  front:
    container_name: front-container
    build:
      context: ./frontend
      args:
        REACT_APP_HOST_IP: 172.17.0.1
    image: l7-frontend

  back:
    container_name: back-container
    build:
      context: ./backend
      args:
        HOST_IP: 172.17.0.1
    image: dhslrl321/boribob-l7:backend
    depends_on:
      - db

  proxy:
    container_name: proxy-container
    build:
      context: ./reverse-proxy
    image: reverse-proxy

    ports:
      - "80:80"
    depends_on:
      - front
      - back

 

์•„์˜ˆ docker-compose ์—์„œ ๋นŒ๋“œํ•˜์ง€ ์•Š์•˜๋”๋ผ๋ฉด... ๋” ์ข‹์•˜์„ํ…๋ฐ..

 


ํ”„๋กœ์ ํŠธ๋ฅผ ๋๋‚ด๋ฉฐ...

 

์œ„์˜ ๊ตฌ์„ฑ ๋ฐฉ์‹์—์„œ ์•„์‰ฌ์›€์ด ๋งŽ์ด ์กด์žฌํ•œ๋‹ค.

 

์‚ฌ์‹ค์ƒ On-Premise ๋กœ ์ƒํ’ˆ์„ ๋ฐฐํฌํ•˜๊ณ  ํŒจํ‚ค์ง•์„ ํ•œ๋‹ค๋ฉด ์ €๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๋„์ปค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์˜ณ์ง€ ๋ชปํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

์‹ฌ์ง€์–ด docker-compose.yml ์„ ๊ณ ๊ฐ์ด ์ง์ ‘ ์—ด์–ด ์ž์‹ ์˜ IP๋ฅผ ๋„ฃ๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ ๋งค์šฐ ๋ฌธ์ œ๋ผ๊ณ  ์ง€์ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ๋” ์‹œ๊ฐ„์ด ์žˆ์—ˆ๋‹ค๋ฉด docker-compose.yml ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ด ๊ณผ์ •์„ ์ž๋™ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ–ˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ ๋‹ค๋ฉด app.conf๊ณผ execute-service.sh ํŒŒ์ผ์„ ์ œ๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ IP๋ฅผ app.conf ์—์„œ ๋ช…์‹œํ•˜์—ฌ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋™์ ์œผ๋กœ docker-compose ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ณ ๋ คํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿผ Backend Application ์€ ๊ดœ์ฐฎ์€๊ฐ€??

 

๊ทธ๋ ‡์ง€๋„ ์•Š๋‹ค.

 

JPA ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋„ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด ์•„๋‹Œ ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ–ˆ์„ ๋ฟ์ด๊ณ  ์•„ํ‚คํ…์ฒ˜๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ฐฑ์—”๋“œ๊ฐ€ Select ๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•œ๋‹ค๋ฉด Master-Slave ๊ตฌ์กฐ๋กœ ๊ฐ€๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•˜์ง€ ์•Š์•˜๋‹ค.

 

๊ฒฐ๊ตญ ๊ฐœ๋ฐœ์ž๋Š”, ์•„๋‹ˆ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์‹œ๊ฐ„๊ณผ ๊ธฐ์ˆ  ์‚ฌ์ด์— ์ˆ˜ ์‹ธ์›€์„ ์ž˜ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

์™„๋ฒฝํ•˜์ง€ ์•Š๋”๋ผ๋„ ์–ด๋–ค ๊ธฐํ•œ ๋‚ด์— ๋๋‚ด์•ผ ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์Šค์Šค๋กœ ํƒ€ํ˜‘์„ ๋ณด๋”๋ผ๋„ ์šฐ์„  ๋๋‚ด๋Š”๊ฒŒ ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

๋ฌผ๋ก  ์ด ๊ณผ์ •์—์„œ ๊ฐœ๋ฐœ์ž์˜ ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ•ด์„œ ์ข‹์ง€ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๊ธฐ๋„ ํ•˜์ง€๋งŒ ์ด๋Š” ์˜จ์ „ํžˆ ๊ฐœ๋ฐœ์ž์˜ ๋ชซ์ธ ๊ฒƒ์ด๊ณ , ๋‚˜๋Š” ๋‚ด ๋‚˜๋ฆ„์˜ ์‹ ๋…์— ๋”ฐ๋ผ์„œ ์—ด์‹ฌํžˆ ๊ตฌ์„ฑํ–ˆ๋˜๊ฒƒ ๊ฐ™๋‹ค.

 

์•„์ง์€ ํ•™์ƒ์ด๊ณ  ๋งŽ์ด ๋ถ€์กฑํ•œ ๊ฒƒ์„ ๋‚ด ์Šค์Šค๋กœ๊ฐ€ ์ฝ”๋“œ ํ•œ ์ค„๋งŒ ๋ณด๋”๋ผ๋„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ž˜๋„ ์ง€๋‚œ ์‹œ๊ฐ„๋“ค๊ณผ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค๋ฉด ์ด์ œ ๋ญ๊ฐ€ ๋ถ€์กฑํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ณ ์ณ์•ผํ• ์ง€ ์•Œ๊ฒŒ ๋œ๊ฒƒ ๊ฐ™๋‹คใ…Žใ…Ž

 

์ด์ œ 1์ฐจ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚ฌ๊ณ  ๊ทธ ํ•œ๋‹ฌ ๋™์•ˆ ์ •๋ง ๋งŽ์ด ์„ฑ์žฅํ–ˆ๋Š”๋ฐ, 2์ฐจ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋˜ ์–ผ๋งˆ๋‚˜ ์„ฑ์žฅํ• ์ง€ ๋„ˆ๋ฌด ๊ธฐ๋Œ€๋˜๊ณ  ์ฆ๊ฑฐ์šด ํ•˜๋ฃจํ•˜๋ฃจ๋ฅผ ๋ณด๋‚ธ๋‹ค.

 

๋Œ“๊ธ€