๐Ÿ’ซ Backend/Spring

NginX๋ฅผ ์ด์šฉํ•ด HTTPS ์„ค์ •์„ ํ•œ Spring Boot ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ Swagger ์‚ฌ์šฉ์‹œ ์š”์ฒญ์ด ์ œ๋Œ€๋กœ ๊ฐ€์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•จ Security ๊บผ์ ธ ์žˆ์ŒEC2์— ์ปจํ…Œ์ด๋„ˆ๋กœ spring boot๊ฐ€ ๋Œ์•„๊ฐ€๋Š”์ค‘์ž„NginX์—์„œ http, https ๋ชจ๋‘ ์š”์ฒญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์„ค์ •ํ•ด๋‘  Failed to fetch ์šฐ์„  ๋ณ„๋‹ค๋ฅธ ์„ค์ • ์ถ”๊ฐ€ ์—†์ด ๊ธฐ๋ณธ ์„ค์ •์œผ๋กœ Swagger๋ฅผ ์‚ฌ์šฉ์ค‘์ธ๋ฐ Server๋ฅผ ์‚ดํŽด๋ณด๋ฉด http://172.17.0.2:8080 ์œผ๋กœ ๋˜์–ด์žˆ๋Š”๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ ์ด๋Š” Spring boot ์ปจํ…Œ์ด๋„ˆ์˜ Docker ๋‚ด๋ถ€ IP์ธ๋ฐ Spring Boot์—์„œ server.address๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด, Swagger๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Spring Boot ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ”์ธ๋”ฉ๋œ ์ฃผ์†Œ๋ฅผ Server..
1. AWS Lambda ์ƒ์„ฑ   Lambda ์ฝ˜์†”์—์„œ ์ƒˆ ํ•จ์ˆ˜ ์ƒ์„ฑ์„ ํ•ด์ค˜์•ผํ•จ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์™€ ๋™์ผํ•œ Java17 ๋Ÿฐํƒ€์ž„์€ AWS ์ฝ˜์†”์—์„œ ์ง์ ‘ ์ฝ”๋“œ ํŽธ์ง‘์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  JAR ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•ด์•ผํ•จ๋˜ํ•œ, Lambda์—์„œ ์š”์ฒญ์„ ๋ณด๋‚ผ CloudRun ํ™˜๊ฒฝ์ด Python flask server ์ด๋ฏ€๋กœ Python ๋Ÿฐํƒ€์ž„์„ ์„ ํƒํ•ด์คŒ(๋‚˜๋จธ์ง€๋Š” ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœ์ด๊ณ  ํ•„์š”์„ฑ์— ๋งž๊ฒŒ ์•Œ์•„์„œ ์„ ํƒํ•˜๋ฉด๋จ)   ์ƒ์„ฑํ•œ ํ•จ์ˆ˜๋ฅผ ํด๋ฆญํ•˜๊ณ  ์ฝ˜์†”์—์„œ ์ฝ”๋“œ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ด๋ ‡๊ฒŒ lambda_handler ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Œ   ์šฐ์„ ์€ ํ…Œ์ŠคํŠธ์šฉ๋„์ด๊ธฐ์— ๋ณ„๋‹ค๋ฅธ ๋กœ์ง์€ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  statusCode๋ฅผ 202๋กœ ๋ฐ”๊ฟ” ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ธฐ๋กœํ•จ => ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€์œผ๋ฉด ์™ผ์ชฝ์˜ Deploy๋ฅผ ๋ˆŒ๋Ÿฌ์•ผ ๋ฐ˜์˜๋จ!  ๋˜ํ•œ, ํ˜„์žฌ ํ…Œ์ŠคํŠธ์—์„œ๋Š”..
HTTPS๋ฅผ ์„ค์ •ํ•˜๊ฒŒ ๋œ ์ด์œ  ์„ธ์…˜ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ์œ„ํ•ด ์„ธ์…˜ ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SameSite = None๊ณผ Secure = true ์„ค์ •์ด ํ•„์š”ํ•จ ํ•˜์ง€๋งŒ ๊ณ„์† ๋กœ๊ทธ์ธ์ด ์•ˆ๋˜๊ธธ๋ž˜ ํ™•์ธํ•ด๋ณด๋‹ˆ... ์œ„์™€ ๊ฐ™์€ ์„ค์ •์„ ํ•˜๋ ค๋ฉด HTTPS๋ฅผ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ๊ณ  ์ถ”ํ›„ ํ”„๋ก ํŠธ์—์„œ ๋…น์Œํ•œ ์Œ์„ฑ์„ ๋„˜๊ฒจ์ฃผ๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ๋•Œ๋„ HTTPS๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด HTTPS๋ฅผ ์ ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€์Œ ๊ธฐ์™•์ด๋ฉด ๊ณผ๊ธˆ ๋•Œ๋ฌธ์— ๋ฌด๋ฃŒ๋กœ... ์‚ฌ์šฉํ•  ๊ฒƒ๋“ค NginX NginX๋Š” ์˜คํ”ˆ ์†Œ์Šค ์›น ์„œ๋ฒ„ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์ •์  ์ฝ˜ํ…์ธ  ์ œ๊ณต, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, HTTP ์บ์‹œ ์„œ๋ฒ„ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ => ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์†Œํ•œ์˜ ๋ฆฌ์†Œ์Šค๋กœ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋™์‹œ ์—ฐ๊ฒฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ ์—ฌ๊ธฐ์„œ๋Š” H..
Spring Boot์—์„œ Supabase๋ฅผ ์—ฐ๋™ํ•œ ํ›„ ๊ฐ„๋‹จํ•œ ํšŒ์›๊ฐ€์ž… ๋กœ์ง ๊ตฌํ˜„  Supabase๊ฐ€ ๋ญ”์ง€ ๋ชจ๋ฅธ๋‹ค๋ฉด ๋ฐ‘์˜ ๊ธ€์„ ์ฝ์–ด๋ณด๊ณ  ์˜ค์ž https://hanjungyo.tistory.com/124 Supabase๋ž€? (with ์–ด๋–ค DB๋ฅผ ์„ ํƒํ•ด์•ผํ• ๊นŒ?)Supabase ์‚ฌ์šฉ๋ฒ•์„ ๋งํ•˜๊ธฐ์— ์•ž์„œ  ํ˜„์žฌ ๊ฐœ๋ฐœ์ค‘์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์š”์•ฝํ•˜๋ฉด ๋ณด์ด์ŠคํŒฉ์„ ๊ฑฐ๋ž˜ํ•˜๊ณ  ๊ตฌ๋งคํ•œ ๋ณด์ด์ŠคํŒฉ์„ ํ”Œ๋žซํผ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•ด์ฃผ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‹ค. ์–ด๋–ค DB๋ฅผhanjungyo.tistory.com  ์šฐ์„  ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ์ดˆ๊ธฐ์— Supabase ๋ฌด๋ฃŒ ํ”Œ๋žœ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ œ๊ณตํ•ด์ฃผ๋Š” OAuth๋„ ๋‹น์žฅ์€ ํ•„์š”๊ฐ€ ์—†์Œ๋งŒ์•ฝ ์ถ”ํ›„์— ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ DB๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ๊ธฐ์— Supabase ์ข…์†์„ฑ์„ ์ค„์—ฌ์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Œ(์ผ..
ํ˜„์žฌ DB๊ฐ€ ์„ธํŒ…๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ ๊ธ‰ํ•˜๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ์™€์˜ ์—ฐ๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ž„์‹œ ํšŒ์›๊ฐ€์ž… ๋กœ์ง์„ ํ™•์ธํ• ์ผ์ด ์ƒ๊ฒผ๋‹ค์ด๋ฅผ ์œ„ํ•ด ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•  DB๊ฐ€ ์„ธํŒ…๋˜๊ธฐ ์ „๊นŒ์ง„ H2 DB๋ฅผ ์ž„์‹œ๋กœ ์„ ํƒํ•˜์˜€๊ณ , ๊ด€๋ จ ๋‚ด์šฉ ํ•™์Šต ๋ฐ ์‹ค์ œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๊ธฐ๋ก์„ ๋‚จ๊ธฐ๋ ค๊ณ  ํ•œ๋‹ค H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€? H2๋Š” JAVA๋กœ ์ž‘์„ฑ๋œ ์˜คํ”ˆ ์†Œ์Šค RDBMS์ž„  ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฏ€๋กœ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•จ(์ด ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง)ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค : ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•  ์ˆ˜ ๋„ ์žˆ๊ธฐ์— ์˜๊ตฌ์ ์ธ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•จJDBC ์ง€์› : JDBC API๋ฅผ ํ†ตํ•ด ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋  ์ˆ˜ ์žˆ์Œ์›น ์ฝ˜์†” : ์›น ๊ธฐ๋ฐ˜ GUI ์ฝ˜์†” ์ œ๊ณตํ•ด์คŒ(๊ด€๋ฆฌ ์šฉ์ด) ๊ต‰์žฅํžˆ ์ž‘๊ณ  ๊ฐ€๋ณ๊ธฐ..
๋งค์ผ๋ฉ”์ผ ๋ฐฑ์—”๋“œ ์งˆ๋ฌธ์„ ์ฐธ๊ณ ํ•ด ๊ฐœ์ธ์ ์œผ๋กœ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..!   ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ JPA๋ž€? JPA(Java Persistence API)๋Š” ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ ํ‘œ์ค€ API์ž„ => ORM(Object-Relational Mapping) ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•˜๋Š” ์ž๋ฐ”์˜ ๊ณต์‹ ํ‘œ์ค€์ž„ JPA๋Š” ์ž์ฒด์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๊ณ  Hibernate์™€ ๊ฐ™์€ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•จ  EntityManager๋ž€? EntityManager์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์œ„ํ•ด์„  Persistence Context์— ๋Œ€ํ•ด ์•Œ์•„์•ผํ•จ Persistence Context๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ 1์ฐจ ์บ์‹ฑ, ์“ฐ๊ธฐ ์ง€์—ฐ, ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ํ†ตํ•ด ์˜์† ๋กœ์ง์„ ํšจ์œจ์ ..
EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ์ด์ „ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!๋กœ์ปฌ์—์„œ Docker ์„ค์ • Jar ํŒŒ์ผ ๋นŒ๋“œํ•˜๊ธฐ ๋ณดํ†ต ๋นŒ๋“œ๋ฅผ ํ•  ๋•Œ ./graldew clean build ๋ฅผ ๋งŽ์ด ๋ดค์„ํ…๋ฐ  ์ด๋ฒˆ์—๋Š” ./gradlew clean bootJar๋ฅผ ํ†ตํ•ด Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JARํŒŒ์ผ๋งŒ ์ƒ์„ฑํ–ˆ์Œ  ./gradlew build๋Š” bootJar๋ฅผ ํฌํ•จํ•˜์—ฌ ๋‚ด๋ถ€ ๋™์ž‘์ด ๋” ๊ธธ๋‹ค๋ฐ˜๋ฉด, bootJar์˜ ๊ฒฝ์šฐ ๋‹จ์ˆœํžˆ ํ”„๋กœ์ ํŠธ์˜ jarํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๋ชฉ์ ์œผ๋กœ ๋นŒ๋“œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค(clean ์ž‘์—…์€ build/ ์™€ ๊ฐ™์€ ๋นŒ๋“œ ์‚ฐ์ถœ๋ฌผ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ์ด์ „ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•จ) Dockerfile ์ƒ์„ฑํ•˜๊ธฐ# Dockerfile# jdk17 Image StartFROM openjdk:17# jar..
์•Œ์•„๋ณด๊ธฐ ์ข‹์€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Spring Boot์—์„œ Custom Exception์„ ์„ค์ •ํ•ด๋ณด์ž!! ErrorCode enum ์ƒ์„ฑ ๋ฐ ์„ค์ • springboot ์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผฐ์„ ๋•Œ, ์ „๋‹ฌํ•  ์—๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” enum์„ ์ƒ์„ฑํ•ด์ค€๋‹ค! enum(์—ด๊ฑฐํ˜•)์€ ์„œ๋กœ ์—ฐ๊ด€๋œ ์ƒ์ˆ˜๋“ค์˜ ์ง‘ํ•ฉ์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ž๋ฃŒํ˜•์ž„!=> ์ฃผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋จ(๊ณ„์ ˆ, ์š”์ผ, ์ƒํƒœ ๋“ฑ)  package berich.backend.exception;import lombok.RequiredArgsConstructor;import org.springframework.http.HttpStatus;@Getter@RequiredArgsConstructorpublic enum ErrorCo..
spring boot๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐMySQL์„ ์ฒ˜์Œ ์—ฐ๋™ํ•ด๋ณด๋ฉด์„œ ๊ธฐ๋ก์„ ๋‚จ๊ฒจ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค...   implementation 'org.springframework.boot:spring-boot-starter-data-jpa'runtimeOnly 'com.mysql:mysql-connector-j' ์šฐ์„  build.gradle์— ์œ„ 2๊ฐœ์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค ๐Ÿ“Œimplementation ๊ณผ runtimeOnly ์˜ ์ฐจ์ด๋Š” ๋ญ˜๊นŒ ๊ถ๊ธˆ์ฆ์ด ๋“ค์—ˆ๋‹ค!=> runtimeOnly๋Š” ์ปดํŒŒ์ผ ์‹œ์ ์—๋Š” ํ•„์š”์—†์ง€๋งŒ ์‹คํ–‰ ์‹œ์ ์—๋Š” ๊ผญ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค   DB ์—ฐ๋™์„ ์œ„ํ•ด์„œ๋Š” resources ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ์žˆ๋Š” application.properties๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•˜..
JJunGyo
'๐Ÿ’ซ Backend/Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก