Skip to content

๐Ÿ“š์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค

Notifications You must be signed in to change notification settings

frtt0608/springboot-webservice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

76 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“š์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค

main

โœ…๊ฐœ๋ฐœ ํ™˜๊ฒฝ

RESTful API ๊ธฐ๋ฐ˜ Web Application

  • IntelliJ
  • Springboot - 2.1.7
  • Gradle - 4.10.2
  • JUnit4
  • Github
  • H2
  • lombok
  • JPA
  • OAuth2.0
  • Mustache
  • Bootstrap
  • AWS EC2 (Amazon Linux AMI 2)
  • AWS RDS (MariaDB 10.2.21)
  • AWS S3
  • Putty
  • HeidiSQL
  • Travis CI
  • Nginx

โœ…ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ ์„ค์ •

  • ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด์„œ Spring boot starter ์‚ฌ์šฉ
  • ์•„์ง ๋งŽ์€ ๊ธฐ์—…์—์„œ JUnit4๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ , ๊ต์žฌ์— ๋”ฐ๋ผ JUnit5๋Œ€์‹  JUnit4 ์‚ฌ์šฉ
  • JUnit์˜ ๋ฒ„์ „์— ๋”ฐ๋ผ ๋นŒ๋“œ ๋„๊ตฌ๋Š” Gradle์˜ 4๋ฒ„์ „
  • ํ…Œ์ŠคํŠธ์šฉ Database๋กœ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”๋˜๋Š” H2 ์‚ฌ์šฉ
  • ์ฟผ๋ฆฌ๋ฌธ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฝ”๋”ฉ์„ ์œ„ํ•ด JPA ์‚ฌ์šฉ
  • ์‹ฌํ”Œํ•˜๊ณ  View์˜ ์—ญํ• ๊ณผ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Mustache ์‚ฌ์šฉ

โœ…๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์ธํ”„๋ผ ๊ตฌ์กฐ

infra structure

โœ… API ์ œ์ž‘ ๊ณผ์ •

MVC ํŒจํ„ด์œผ๋กœ Dto, Service, Controller ํด๋ž˜์Šค์™€ JpaRepository๋ฅผ ์ƒ์†๋ฐ›์€ Repository๋ฅผ ํ™œ์šฉ

  1. Domain ํŒจํ‚ค์ง€
    • Domain ํŒจํ‚ค์ง€๋Š” Database์™€ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ๋œ ํด๋ž˜์Šค๋“ค์„ ๋‹ค๋ฃฌ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Entity์™€ Repository๊ฐ€ ํ•ด๋‹น๋œ๋‹ค.
    • ๊ตณ์ด ํŒจํ‚ค์ง€๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ์ด์œ ๋Š” Web Layer๋ณ„๋กœ ์—ญํ• ์„ ์ฒ ์ €ํžˆ ๋‚˜๋ˆ„๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  2. ์ƒ์„ฑ์ž๋กœ Bean ์ฃผ์ž…
    • ์ƒ์„ฑ์ž๋กœ Bean์„ ์ฃผ์ž…ํ•˜๋ฉด ์ˆœํ™˜ ์ฐธ์กฐ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๋•Œ, ์‚ฌ์ „์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์˜์กด์„ฑ ๊ด€๊ณ„๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ๋‹ค๋ฅธ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ํ•„๋“œ๋ฅผ final๋กœ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์—์„œ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ƒํ™ฉ์„ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, @RequiredArgsConstructor๋กœ ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  3. Dto๋ฅผ ์—ญํ• ์— ๋”ฐ๋ผ ๋ถ„๋ฆฌ
    • Posts Dto๋กœ API๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, request/response์šฉ Dto๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
    • Posts Dto๋Š” Entity ํด๋ž˜์Šค๋กœ Database๋กœ ๋งž๋‹ฟ์•„ ์žˆ๋‹ค. ์ฆ‰, Entity ํด๋ž˜์Šค๋Š” Database์˜ Table๊ณผ ๋งตํ•‘๋˜๋Š” ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, Entity ํด๋ž˜์Šค์˜ ์žฆ์€ ๋ณ€๊ฒฝ์—๋Š” ๊ณ ๋ คํ•ด์•ผํ•  ์ ์ด ๋งŽ๋‹ค.
  4. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
    • ๊ธฐ๋Šฅ์ด ๋งŽ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ์™„๋ฒฝํ•จ์„ ์ž…์ฆํ•œ๋‹ค.
    • ๊ฐ€๋ น, ํŠน์ • ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•œ ํ›„, ๊ธฐ์กด ์ฝ”๋“œ๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ๊ตฌ๋™ํ•ด์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์‹คํ–‰ํ•ด๋ด์•ผ ํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ด๋Ÿฌํ•œ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, CI/CD๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋‹ค๋ฃฌ๋‹ค.

โœ…๋ฐœ์ƒํ–ˆ๋˜ ์ด์Šˆ ์‚ฌํ•ญ

  1. OAuth2.0์„ ๊ตฌํ˜„ํ•˜๊ณ , ์žฌ๋ฐฐํฌ์‹œ ๋กœ๊ทธ์ธ ์ƒํƒœ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Session์— ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ์ €์žฅ. ๊ทธ๋Ÿฌ๋‚˜ HttpSession์˜ getAttribute("user")ํ•˜๋Š” ๊ณผ์ •์—์„œ NullPointerException๋ฐœ์ƒ

    • ์›์ธ: HttpSession์ด null๊ฐ’์œผ๋กœ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์€ ๊ฒƒ.
    • HttpSession์„ final ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•˜์—ฌ ํ•ด๊ฒฐ, ํ•ด๋‹น Class์—๋Š” @RequiredArgsConstructor๋ฅผ ์ ์šฉํ–ˆ๋‹ค. ํ•ด๋‹น Annotation์€ final๋กœ ์„ ์–ธ๋œ ํ•„๋“œ๋“ค์„ ์ƒ์„ฑ์ž๋„ ์ž๋™ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— final ํ‚ค์›Œ๋“œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋กœ๊ทธ์ธํ•œ ์œ ์ €์˜ ์ด๋ฆ„์ด ํ™”๋ฉด์— ๋‚˜์˜ค์ง€ ์•Š๊ณ , ๋กœ์ปฌ ์ปดํ“จํ„ฐ์˜ ์ด๋ฆ„์ด ๋‚˜์˜ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

    • ์›์ธ: index.js์—์„œ {{userName}}์œผ๋กœ ํ‘œ์‹œํ–ˆ๋Š”๋ฐ, Window OS์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜์ธ %USERNAME%์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ๋ฌธ์ œ
    • userName ๋Œ€์‹  loginUser๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•ด๊ฒฐ
  3. IntelliJ์—์„œ DB Brower๋ฅผ ์ด์šฉํ•˜์—ฌ AWS RDS ์—ฐ๋™ ๊ณผ์ •์—์„œ Connection์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

    • IntelliJ ๋Œ€์‹  HeidiSQL ํˆด๊ณผ AWS RDS๋ฅผ ์—ฐ๋™
    • IntelliJ์˜ ์„ค์ • ๋ฌธ์ œ๊ฐ™์€๋ฐ, ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•จ
    • ๋Œ€์ฒด์žฌ๋กœ MariaDB์— ํ˜ธํ™˜๋˜๋Š” HeidiSQL์„ ํ™œ์šฉ, ์ •์ƒ์ ์œผ๋กœ ์ง„ํ–‰ ๊ฐ€๋Šฅ
  4. Putty์—์„œ EC2์„œ๋ฒ„์˜ hostname์„ ๋ณ€๊ฒฝํ–ˆ์ง€๋งŒ, ์ ์šฉ ์•ˆ๋Œ

    • ํ”„๋กœ์ ํŠธ๋ช…๊ณผ hostname์„ ๋˜‘๊ฐ™์ด ํ•ด๋ดค์ง€๋งŒ ์‹คํŒจ

    • ์„ค์ • ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋˜ ์ค‘, ๋ฒ„์ „์„ ๊ณ ๋ คํ•จ

    • ์ง€๊ธˆ๊นŒ์ง€ ์„œ๋น„์Šค๊ฐ€ ์ข…๋ฃŒ๋œ Amazon Linux AMI์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” Amazon Linux AMI 2 ๋ฒ„์ „์ด๋ฏ€๋กœ AWS์˜ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉฐ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ

      sudo hostnamectl set-hostname webserver.mydomain.com(hostname)
  5. Puttyํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ์™€ EC2 ์„œ๋ฒ„ ์—ฐ๋™๊นŒ์ง€ ์™„๋ฃŒ, RDS๊นŒ์ง€ ์—ฐ๋™ํ•˜๋Š” ๊ณผ์ •์—์„œ ์‹คํŒจ

    • ์™ธ๋ถ€ Security ์—ฐ๋™๊ณผ RDS๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๊ณผ์ •์—์„œ AWS์˜ database๋ฅผ ์ธ์‹ํ•˜์ง€ ๋ชปํ•จ
    • EC2 ์„œ๋ฒ„์— application-real-db.properties ์˜คํƒ€ ๋ฐœ๊ฒฌ
    • [database๋ช…]๊ณผ [DB ์ธ์Šคํ„ด์Šค ๋ช…] ๊ตฌ๋ถ„ํ•˜๊ธฐ
  6. ํ”„๋กœ์ ํŠธ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ปค๋ฐ‹/ํ‘ธ์‰ฌํ–ˆ์„ ๋•Œ, EC2 ์„œ๋ฒ„์— ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ(๋ฐฐํฌ ์ž๋™ํ™”x)

    • deployment-logs : ๊ธฐ์กด์— ์—ด๋ ค์žˆ๋Š” PID๋ฅผ ์ฃฝ์ด์ง€ ๋ชปํ•˜๊ณ , ์ƒˆ๋กœ ๋ฐฐํฌ๊ฐ€ ์•ˆ๋˜๋Š” ๋ฌธ์ œ
    • nohup.out : the port may already be in use or the connector may be misconfigured.
    • ์„ค์ •๋œ 8080 port๊ฐ€ ์ฃฝ์ง€์•Š๋Š” ์ƒํ™ฉ์ž„์„ ์ธ์ง€ํ•˜์˜€๊ณ , ์ด๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์Œ
    • ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ์ฐฝ์—์„œ netstat -ano ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ pid๋ฅผ ํ™•์ธ, ํ•ด๋‹น pid๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒ์‹œํ‚ด

About

๐Ÿ“š์Šคํ”„๋ง ๋ถ€ํŠธ์™€ AWS๋กœ ํ˜ผ์ž ๊ตฌํ˜„ํ•˜๋Š” ์›น ์„œ๋น„์Šค

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published