[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 3. 3-tier ๊ตฌ์„ฑํ•˜๊ธฐ

2024. 2. 27. 22:36ยท๐Ÿ“‚ education & lecture/์ธํ”„๋ผ ๊ณต๋ฐฉ

1. ๊ฐœ๋… ๋ฐ ์šฉ์–ด ์ •๋ฆฌ

[1] DNS

DNS ๋Š” ๋„๋ฉ”์ธ์— ์•Œ๋งž๋Š” IP ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜์„ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„์ด๋‹ค. ์œ ์ €๋Š” IP๋ณด๋‹ค ๋ฌธ์ž๋กœ ํ‘œํ˜„๋œ ๋„๋ฉ”์ธ ์ฃผ์†Œ๋ฅผ ๋”์šฑ ์ž˜ ๊ธฐ์–ตํ•˜๊ณ  ํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋„๋ฉ”์ธ์„ IP ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. /etc/hosts ํŒŒ์ผ์— ์ •์ ์œผ๋กœ ์„ค์ •ํ•œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  2. local DNS Cache ๋ฅผ  ์กฐํšŒํ•œ๋‹ค.
  3. /etc/resolv.conf ํŒŒ์ผ์— ์„ค์ •๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ DNS ์„œ๋ฒ„์— ์งˆ์˜ํ•œ๋‹ค.
  4. DNS server ๋Š” ์ •๋ณด๊ฐ€ ์žˆ์œผ๋ฉด IP ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์—†์œผ๋ฉด ๋ณธ์ธ์˜ ์ƒ์œ„ DNS ์„œ๋ฒ„์—๊ฒŒ ์งˆ์˜ํ•˜์—ฌ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
  5. ๋„๋ฉ”์ธ์— ํ•ด๋‹นํ•˜๋Š” IP ๋ฅผ DNS Cache ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

 

[2] reverse-proxy

Reverse-Proxy ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์›น ์„œ๋ฒ„ ์•ž์— ์œ„์น˜ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋Œ€๋ฆฌ๋กœ ์ „๋‹ฌํ•˜๋Š” ์„œ๋ฒ„์ด๋‹ค. ์ผ๋ฐ˜์ ์ธ Proxy server ๋Š” LAN → WAN ์š”์ฒญ์„ ๋Œ€๋ฆฌ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ˜๋ฉด, Reverse-Proxy ๋Š” WAN → LAN ์˜ ์š”์ฒญ์„ ๋Œ€๋ฆฌํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋Œ€๋ฆฌ๋กœ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์•„๋ž˜์™€ ๊ฐ™์€ ์ด์ ์ด ์กด์žฌํ•œ๋‹ค. 

  • ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ : WAS ์˜ ์„œ๋ฒ„ ์ŠคํŽ™(port, ip, URL)์„ ์„ ์ˆจ๊ธธ ์ˆ˜ ์žˆ์–ด DDoS ์™€ ๊ฐ™์€ ํ‘œ์  ๊ณต๊ฒฉ์„ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ๋ถ€ํ•˜๋ถ„์‚ฐ : ์„œ๋ฒ„์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์ œ๊ณตํ•˜์—ฌ WAS ์˜ scale-out ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์„œ๋น„์Šค์˜ ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์บ์‹ฑ : ์ •์  ์ปจํ…์ธ ๋ฅผ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์ด์ ์ด ์žˆ๋‹ค.

 

[3] NGINX

 reverse-proxy ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ๋ฃจํ”„ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ฆ‰, Queue ์— ์š”์ฒญ์„ ์Œ“์•„๋‘๊ณ  ํ•˜๋‚˜์”ฉ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, async,non-blocking ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ  ๋‹ค์ˆ˜์˜ ์ปค๋„ฅ์…˜์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋น ๋ฅด๋‹ค.

 NGINX ๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜ HDD read/write ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ I/O ๋Š” OS ์™€ H/W ์‚ฌ์ด์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ I/O ์ž‘์—…์ด ํฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ธธ์–ด์ง€๋ฉด Queue ์— ์š”์ฒญ์ด ๋งŽ์ด ์Œ“์—ฌ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ณต์žกํ•œ ์—ฐ์‚ฐ ์ฒ˜๋ฆฌ, ๋™์˜์ƒ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, DB ์ž‘์—…์€ WAS ์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค. (reverse-proxy ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ scale-out ํ™˜๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ WAS ์—๊ฒŒ ์œ„์ž„ํ•˜๋Š” ๊ฒƒ์ด ๋”์šฑ ์ ํ•ฉํ•˜๋‹ค.)

 

[4] TLS (Transport Layer Security)

TLS ๋Š” ๋‘ ๊ฐœ์˜ ํ†ต์‹ ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ์ธ์ฆ, ์•”ํ˜ธํ™” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐ๋„ท ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. TLS ๋Š” SSL ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์ด ์œ ์ง€๋˜๋Š” HTTPS ์—ฐ๊ฒฐ์— ์‚ฌ์šฉ๋œ๋‹ค. SSL ์ธ์ฆ์„œ๋Š” ์ธํ„ฐ๋„ท์„ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ, ์‹ ์šฉ์นด๋“œ ๋ฒˆํ˜ธ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค.

 

 

2. 3-tier ๊ตฌ์„ฑํ•˜๊ธฐ

  1. public EC2 ์ถ”๊ฐ€ ๊ตฌ์„ฑ
    1. swap ์˜์—ญ ์ƒ์„ฑ
    2. gradle ์„ค์น˜
    3. github ssh ์—ฐ๋™
    4. github submodule ์„ค์ •
      1. git submodule ๋“ฑ๋ก ๋ฐฉ๋ฒ•
  2. TLS ์„ค์ •
    1. TLS ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ (by. letsencrypt)
    2. nginx container ์ƒ์„ฑ
      1.  https ์„ค์ • & ํ”„๋ก์‹œ ์„ค์ •
  3. DB ์„œ๋ฒ„ ๊ตฌ์„ฑ
    1. mysql docker container ์ƒ์„ฑ
  4. ์šด์˜ ํ™˜๊ฒฝ ํ”„๋กœํผํ‹ฐ ๋ถ„๋ฆฌ
    1. property ๋ถ„๋ฆฌํ•ด์„œ ๋นŒ๋“œํ•˜๊ธฐ
    2. buld.gradle depdendency ์ถ”๊ฐ€ + resources ํŒŒ์ผ ์„ค์ •
    3. ์„œ๋ฒ„ ์‹คํ–‰
    4. URL ํ™•์ธ
  5. script practice

 

[1] public EC2 ์ถ”๊ฐ€ ๊ตฌ์„ฑ

(1) swap ์˜์—ญ ์ƒ์„ฑ

  • AWS t2.micro ์ œ๊ณต RAM ์ด 1GB ์ด๋ฏ€๋กœ gradle ๋นŒ๋“œ ์‹œ ์„œ๋ฒ„๊ฐ€ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ์–ด swap ์˜์—ญ ์ƒ์„ฑํ•˜์—ฌ ํ™œ์šฉ

 

a. swap ์ƒํƒœ ํ™•์ธ : ๋ฏธ์„ค์ • ์‹œ

$ sudo swapon -s # ์Šค์™‘ ์ƒํƒœ ํ™•์ธ ๋ช…๋ น์–ด
$ free  # ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ํ™•์ธ ๋ช…๋ น์–ด

               total        used        free      shared  buff/cache   available
Mem:          972024      549984      110216         252      311824      263844
Swap:              0           0           0

 

b. swap partition ์ƒ์„ฑ

 

(1) root file system ์— swapfile ์ƒ์„ฑ

  • 128MB ์”ฉ 16๋ฒˆ์„ /dev/zero ๋กœ ๋ถ€ํ„ฐ ์ฝ์–ด /swapfile ์— ์ €์žฅ (128MB  * 16 = 2GB)
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16

 

(2) swapfile ๊ถŒํ•œ ๋ถ€์—ฌ

$ sudo chmod 600 /swapfile

 

(3) swap ์˜์—ญ ์„ค์ •

  • mkswap [file] : swap partition ์ƒ์„ฑ ๋ช…๋ น์–ด
$ sudo mkswap /swapfile

 

(4) swap ๊ณต๊ฐ„์— swapfile ์ถ”๊ฐ€

  • swapon [file] : swapfile ํ™œ์„ฑํ™” ๋ช…๋ น์–ด
$ sudo swapon /swapfile

 

(5) ์Šค์™‘ ๊ณต๊ฐ„ ํ™•์ธ

$ sudo swapon -s

Filename	Type		Size		Used		Priority
/swapfile	file		2097148		329472		-2


$ free

               total        used        free      shared  buff/cache   available
Mem:          972024      551056      106940         252      314028      262784
Swap:        2097148      329472     1767676

 

(6) ๋ถ€ํŒ…์‹œ swapfile ํ™œ์„ฑํ™” ์„ค์ •

  • /etc/fstab : linux ์—์„œ file system ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ์ด๋ฉฐ, ๋ถ€ํŒ…์‹œ ๋งˆ์šดํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ž…๋ ฅ ๋‚ด์šฉ : [ํŒŒ์ผ์‹œ์Šคํ…œ์žฅ์น˜][๋งˆ์šดํŠธํฌ์ธํŠธ][ํŒŒ์ผ์‹œ์Šคํ…œ ์ข…๋ฅ˜][์˜ต์…˜][dump์„ค์ •][ํŒŒ์ผ์ ๊ฒ€์˜ต์…˜]
$ sudo vim /etc/fstab

/swapfile swap swap defaults 0 0

 

c. swap partition ์ œ๊ฑฐ

(1) ํ• ๋‹น๋œ swap ๊ณต๊ฐ„ ์ œ๊ฑฐ

$ sudo swapoff /swapfile

 

(2) swapfile ์ œ๊ฑฐ

sudo rm -rf /swapfile

 

(3) ๋ถ€ํŒ…์‹œ, swapfile ํ™œ์„ฑํ™” ์„ค์ • ์ œ๊ฑฐ

$ sudo vim /etc/fstab

/swapfile swap swap defaults 0 0 # ํ•ด๋‹น ๋‚ด์šฉ ์ œ๊ฑฐ

 

 

(2) install gradle

a. ์„ค์น˜ Gradle version ํ™•์ธ

  • https://docs.gradle.org/current/userguide/compatibility.html

 

b. ์„ค์น˜ ๋ฒ„์ „ Gradle zip file ๋‹ค์šด๋กœ๋“œ

# wget unzip ์—†์„ ๊ฒฝ์šฐ ํ•ด๋‹น package ์„ค์น˜

$ wget https://services.gradle.org/distributions/gradle-7.5.1-bin.zip -P /tmp
$ sudo unzip -d /opt/gradle /tmp/gradle-7.5.1-bin.zip

cunzip ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

c. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (+ ๊ถŒํ•œ ๋ณ€๊ฒฝ)

$ sudo vim /etc/profile.d/gradle.sh

export GRADLE_HOME=/opt/gradle/gradle-7.5.1
export PATH=${GRADLE_HOME}/bin:${PATH}


$ sudo chmod +x /etc/profile.d/gradle.sh
$ source /etc/profile.d/gradle.sh

 

d. Gradle  version ํ™•์ธ

gradle -v

 

 

(3) github ssh ๋“ฑ๋ก

a. ssh ํ‚ค์ƒ์„ฑ

  • ๋น„๋ฐ€ํ‚ค ๊ฒฝ๋กœ : ~/.ssh/id_rsa
  • ๊ณต๊ฐœํ‚ค ๊ฒฝ๋กœ : ~/.ssh/id_rsa.pub
$ ssh-keygen

 

b. Github ๊ณ„์ • SSH ๊ณต๊ฐœํ‚ค ๋“ฑ๋ก

  • Settings > SSH and GPG keys > New SSH Key

 

(4) github submodule ์„ค์ •

application.properties ์˜ ๊ฒฝ์šฐ, secret-key ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์–ด ๋ณด์•ˆ์ƒ์œผ๋กœ private ์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

  • github private repository ์ƒ์„ฑ → application.properties ์„ค์ • ํŒŒ์ผ ์ปค๋ฐ‹
  • github submodule ์„ ํ†ตํ•ด ํŠน์ • ๊ฒฝ๋กœ์— private repository ์ฐธ์กฐํ•˜๋„๋ก ์„ค์ •
    • ์ดํ›„ ์†Œ์Šค์ฝ”๋“œ ๋ฐ›์„ ๋•Œ submodule ๊นŒ์ง€ clone
$ git submodule add [์ž์‹ ์˜ private ์ €์žฅ์†Œ] ./src/main/resources/config
$ git clone --recurse-submodules [์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ ์ €์žฅ์†Œ]

 

  • ์„ค์ • ํŒŒ์ผ ๋‚ด์šฉ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ, submodule ๋งŒ ์ปค๋ฐ‹ํ•˜๋Š” ๋ฐฉ๋ฒ•
$ git submodule foreach git pull origin main
$ git submodule foreach git add .
$ git submodule foreach git commit -m "commit message"
$ git submodule foreach git push origin main

 

[2] TLS ์„ค์ •

(1) TLS ์ธ์ฆ์„œ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ

  • HTTP ๋Š” ํ‰๋ฌธ ํ†ต์‹ ์ด๋ฏ€๋กœ ์Šค๋‹ˆํ•‘(snipping) ํ•˜์—ฌ ํŒจํ‚ท์„ ๊ฐ€๋กœ์ฑ„ ํ™•์ธํ•  ์šฐ๋ ค๊ฐ€ ์žˆ์–ด HTTPS ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • HTTPS ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” TLS ์ธ์ฆ์„œ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ letsencrypt ๋ฌด๋ฃŒ TLS ์ธ์ฆ์„œ ํ™œ์šฉ
$ docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d 'yourdomain.com' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

 

 

 

  • ์ธ์ฆ์„œ ์ƒ์„ฑ ํ›„ ์œ ํšจํ•œ URL ํ™•์ธ์„ ์œ„ํ•ด DNS TXT ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€
  • DNS ์„ค์ • ์‚ฌ์ดํŠธ์—์„œ DNS TXT ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ ํ›„, dig ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด

๋‚ด๋„๋ฉ”์ธ.ํ•œ๊ตญ์—์„œ DNS ์„ค์ •

 

 

  • ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ๋ฅผ ํ™•์šฉํ•ด Reverse Proxy ์— TLS ์„ค์ • ๋ฐ Dockerfile ๊ฐ€ ์œ„์น˜ํ•œ ํ˜„์žฌ ๊ฒฝ๋กœ๋กœ ๋ณต์‚ฌ
$ cp /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/fullchain.pem ./
$ cp /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/privkey.pem ./

 

 

  • Dockerfile ์„ค์ •
FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf 
COPY fullchain.pem /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/fullchain.pem
COPY privkey.pem /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/privkey.pem

 

 

  • nginx.conf
events {}

http {       
  upstream app {
    server 172.17.0.1:8080;
  }
  
  # Redirect all traffic to HTTPS
  server {
    listen 80;
    return 301 https://$host$request_uri;
  }

  server {
    listen 443 ssl;  
    ssl_certificate /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[๋„๋ฉ”์ธ์ฃผ์†Œ]/privkey.pem;

    # Disable SSL
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # ํ†ต์‹ ๊ณผ์ •์—์„œ ์‚ฌ์šฉํ•  ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;

    # Enable HSTS
    # client์˜ browser์—๊ฒŒ http๋กœ ์–ด๋– ํ•œ ๊ฒƒ๋„ load ํ•˜์ง€ ๋ง๋ผ๊ณ  ๊ทœ์ œํ•ฉ๋‹ˆ๋‹ค.
    # ์ด๋ฅผ ํ†ตํ•ด http์—์„œ https๋กœ redirect ๋˜๋Š” request๋ฅผ minimize ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    add_header Strict-Transport-Security "max-age=31536000" always;

    # SSL sessions
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;      

    location / {
      proxy_pass http://app;    
    }
  }
}

 

 

  • nginx docker container ์‹คํ–‰
    • docker build -t cooper/reverse-proxy:0.0.1 . : Dockerfile ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ
    • ๋นŒ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
$ docker stop proxy && docker rm proxy
$ docker build -t brainbackdoor/reverse-proxy:0.0.2 .
$ docker run -d -p 80:80 -p 443:443 --name proxy cooper/reverse-proxy:0.0.2

 

 

[3] DB ์„œ๋ฒ„ ๊ตฌ์„ฑ

(1) ์šด์˜ DB ๊ตฌ์„ฑ (by. mysql container)

  • private EC2 ์— ํ•ด๋‹น ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
# id: root, pw: masterpw
$ docker run -d -p 3306:3306 brainbackdoor/data-subway:0.0.1

 

 

[4] ์šด์˜ ํ™˜๊ฒฝ ํ”„๋กœํผํ‹ฐ ๋ถ„๋ฆฌ

(1) property ์„ค์ •ํ•˜์—ฌ ๋นŒ๋“œํ•˜๊ธฐ

SPRING_PROFILES_ACTIVE=local ./gradlew clean build

 

(2) buld.gradle depdendency ์ถ”๊ฐ€ + resources ํŒŒ์ผ ์„ค์ •

  • ์šด์˜ ํ™˜๊ฒฝ mysql ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์˜์กด์„ฑ ์ถ”๊ฐ€
  • sourceSets ๋ฅผ ํ†ตํ•œ main resources directory ๊ฒฝ๋กœ ์„ค์ •
dependencies {
	runtimeOnly 'mysql:mysql-connector-java'
}

sourceSets {
	main {
		resources {
			srcDir "src/main/resources/config"
		}
	}
}

 

 

(3) ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

  • -Dspring.profiles.active : ํ™œ์„ฑํ•  ํ”„๋กœํผํ‹ฐ ์„ค์ •
  • -Dspring.config.location: ์‚ฌ์šฉํ•  property ํŒŒ์ผ ๊ฒฝ๋กœ

$ nohup java -jar -Dspring.profiles.active=prod [jarํŒŒ์ผ๋ช…] 1> [๋กœ๊ทธํŒŒ์ผ๋ช…] 2>&1  &

 

(4) URL ์ ‘์†

 

 

 

[5] script practice

# ./color.sh

## ๋ณ€์ˆ˜ ์„ค์ •
txtrst='\033[1;37m' # White
txtred='\033[1;31m' # Red
txtylw='\033[1;33m' # Yellow
txtpur='\033[1;35m' # Purple
txtgrn='\033[1;32m' # Green
txtgra='\033[1;30m' # Gray
# ./colorTest.sh
source $(dirname $0)/color.sh

echo -e "$(dirname $0)"
echo -e "${txtylw}=======================================${txtrst}"
echo -e "${txtgrn}  << ์ƒ‰๊น” ๋ณ€์ˆ˜๋“ค ๐Ÿง >>${txtrst}"
echo -e "${txtrst}txtrst='\033[1;37m' # White${txtrst}"
echo -e "${txtred}txtred='\033[1;31m' # Red${txtrst}"
echo -e "${txtylw}txtylw='\033[1;33m' # Yellow${txtrst}"
echo -e "${txtpur}txtpur='\033[1;35m' # Purple${txtrst}"
echo -e "${txtylw}txtgrn='\033[1;32m' # Green${txtrst}"
echo -e "${txtgra}txtgra='\033[1;30m' # Gray${txtrst}"
echo -e "${txtylw}=======================================${txtrst}"

 

# ./parameterTest.sh
source $(dirname $0)/color.sh

# ๋ณ€์ˆ˜ ์„ ์–ธ
EXECUTION_PATH=$(pwd) # ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚จ ๊ฒฝ๋กœ
SHELL_SCRIPT_PATH=$(dirname $0) # ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ ํ˜„์žฌ ๊ฒฝ๋กœ
FIRST=$1 # 1 ๋ฒˆ์งธ ์ž…๋ ฅ ๊ฐ’
SECOND=$2 # 2 ๋ฒˆ์งธ ์ž…๋ ฅ ๊ฐ’

# ๋ณ€์ˆ˜ ์ถœ๋ ฅ
echo -e "${txtylw}============= ๋ณ€์ˆ˜ ์ถœ๋ ฅ ===============${txtrst}"
echo -e "${txtgrn} EXECUTION_PATH: ${EXECUTION_PATH}"
echo -e "${txtgrn} SHELL_SCRIPT_PATH: ${SHELL_SCRIPT_PATH}"
echo -e "${txtgrn} FIRST: ${FIRST}"
echo -e "${txtgrn} SECOND: ${SECOND}"
echo -e "${txtgrn} \$#: $#"  # ์ž…๋ ฅ ์ธ์ž ๊ฐœ์ˆ˜

## ์กฐ๊ฑด ์„ค์ •
if [[ $# -ne 0 ]] # ์ž…๋ ฅ ์ธ์ž ๊ฐœ์ˆ˜($#) ๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ(-ne)
then
    echo -e "${txtylw}=======================================${txtrst}"
    echo -e "${txtgrn}  << ์Šคํฌ๋ฆฝํŠธ ๐Ÿง >>${txtrst}"
    echo -e ""
    echo -e "${txtgrn} $0 ๋ธŒ๋žœ์น˜์ด๋ฆ„ ${txtred}{ prod | dev }"
    echo -e "${txtylw}=======================================${txtrst}"
    exit
fi

 

# ./functionTest.sh
source $(dirname $0)/color.sh

function pull() {

  echo -e ">> Pull Request ๐Ÿƒ"
  git pull origin master
}

pull;

 

Reference

  • ์ฐธ๊ณ  ๊ฐ•์˜
    • https://www.inflearn.com/course/%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B3%B5%EB%B0%A9-%EC%84%9C%EB%B9%84%EC%8A%A4-%EB%A7%8C%EB%93%A4%EA%B8%B0/dashboard
  • ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ
    • https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/
  • TLS
    • https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/
    • https://powerdmarc.com/ko/what-is-tls-encryption/
  • github submodule ๊ตฌ์„ฑ
    • https://devocean.sk.com/blog/techBoardDetail.do?ID=165172&boardType=techBlog
  • github ssh ์„ค์ •
    • https://dolsup.work/tech-blog/different-ways-to-access-github-repository/
  • gradle ์„ค์น˜
    • https://velog.io/@k0000k/%EB%A6%AC%EB%88%85%EC%8A%A4%EC%97%90%EC%84%9C-Gradle-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0
  • swap ์˜์—ญ ์„ค์ •
    • https://willseungh0.tistory.com/13
  • domain ์„ค์ •ํ•˜๊ธฐ
    • ๋ฌด๋ฃŒ ๋„๋ฉ”์ธ ์„ค์ •ํ•˜๊ธฐ
      • https://cl8d.tistory.com/97

'๐Ÿ“‚ education & lecture > ์ธํ”„๋ผ ๊ณต๋ฐฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ปจํผ๋Ÿฐ์Šค ์‹ ์ฒญ - 1. github action ์„ ํ†ตํ•œ ๋นŒ๋“œ ์„ค์ •  (1) 2024.03.05
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 4. ํ™”๋ฉด ์‘๋‹ต ๊ฐœ์„ ํ•˜๊ธฐ  (0) 2024.02.29
[์ธํ”„๋ผ๊ณต๋ฐฉ] HTTP Cache  (0) 2024.02.28
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 2. ์„œ๋ฒ„ ๊ตฌ์„ฑํ•˜๊ธฐ  (1) 2024.02.25
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 1. ๋ง ๊ตฌ์„ฑํ•˜๊ธฐ  (1) 2024.02.23
'๐Ÿ“‚ education & lecture/์ธํ”„๋ผ ๊ณต๋ฐฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 4. ํ™”๋ฉด ์‘๋‹ต ๊ฐœ์„ ํ•˜๊ธฐ
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] HTTP Cache
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 2. ์„œ๋ฒ„ ๊ตฌ์„ฑํ•˜๊ธฐ
  • [์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 1. ๋ง ๊ตฌ์„ฑํ•˜๊ธฐ
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

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

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

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ธํ”„๋ผ๊ณต๋ฐฉ
    spring camp 2025
    ํšŒ๊ณ 
    gof
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    react
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    JPA
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    nGrinder
    UUID
    spring
    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    mysql
    kafka
    AWS
    Redisson
    ๋™์‹œ์„ฑ
    spring-batch
    spring AOP
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
[์ธํ”„๋ผ๊ณต๋ฐฉ] ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ - 3. 3-tier ๊ตฌ์„ฑํ•˜๊ธฐ
์ƒ๋‹จ์œผ๋กœ

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