๋ชฉ๋ก๊ฐ๋ฐ์ผ์ง (22)
DevLog ๐ถ
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ DB ๊ณต๋ถํ๋ค๊ฐ '๋ค์๋๋ฝ'์ ๋ํด์ ์๊ฒ ๋์๋๋ฐ, ๋ค์๋๋ฝ์ ์ฌ์ฉํ๋ฉด ๋ถ์ฐ๋ฝ์ ๊ตฌํํ ์ ์๋ค๋ ๊ธ์ ๋ณด๊ณ ํ ๋ฒ ํ ์คํธํด๋ณด๊ณ ์ถ์ด์ ๊ธ์ ์์ฑํด๋ณด๊ณ ์ ํ๋ค. ์ ์ฒด ์์ค์ฝ๋๋ ์ฌ๊ธฐ์์ ํ์ธ ๊ฐ๋ฅํ๋ค. (๋ญ๊ฐ ํ ์คํธ์ฉ ๋ ํฌ ๋ง๋ค๊ธฐ ์ ๋งคํด์ ๊ทธ๋ฅ ์ ์ฐ๋ ๋ ํฌ์๋ค๊ฐ ํ๋ ค๋ค ๋ณด๋ ์ฝํ๋ฆฐ์ผ๋ก ์์ฑํ๊ฒ ๋์๋ค.) ๐ฑ ๋ถ์ฐ๋ฝ์ด๋? ๋ถ์ฐ๋ฝ์ด๋ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ์์์ ์ ๊ทผํ ๋, ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ ์งํค๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ์ ์ด๋ค. ์ฌ๊ธฐ์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ์ ๊ทผํ๋ฉฐ ๊ฒฝ์ํ๋ ์ํฉ์ 'Race Condition (๊ฒฝ์ ์ํ)'๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ์๋ฐ์์๋ 'synchronized'๋ผ๋ ํค์๋๋ฅผ ํตํด์ ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผํ ์ ์๋๋ก ๋๊ธฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ์ง๋ง, ์คํ๋ง ์น ์ ํ๋ฆฌ์ผ์ด..
๐ฑ ๋ฌธ์ ์ํฉ ๊ฐ๋จํ๊ฒ ํ ์คํธํ๊ณ ์ถ์ ๋ด์ฉ์ด ์๊ฒจ์ DTO์ฉ data class๋ฅผ ์์ฑํ์๋๋ฐ, ์๋์ ๊ฐ์ด Jackson์ ์ญ์ง๋ ฌํ ๊ด๋ จ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค. Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `study.ticketService.domain.application.dto.ConcertTicketCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Cr..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์ด๋ฒ ์ฅ๋ฐ๊ตฌ๋ ๋ฏธ์ ์์๋ ํ๋ก ํธ ํฌ๋ฃจ๋ค๊ณผ ํ์ ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ผ๋ก ์๋ฌ ๋ก๊ทธ๋ฅผ ๋ณผ ์ผ์ด ๋ง์์ง ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค. ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉด์ ์คํ๋ง์ด ๋์์ง ๋์ ๋ก๊ทธ๋ ๋ณผ ์ ์์์ง๋ง, ์๋ฌ์ ๋ํ ๋ก๊ทธ๋ง ๋น ๋ฅด๊ฒ ํ์ธํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ด๋ฒ ๋ฏธ์ ์ ๋๋ฆ์ ์ฝ์ง์ ๊ณ๋ค์ฌ๊ฐ๋ฉฐ ์ ์ฉํด๋ณด์๋ค ๐ ๐ฑ ๋ฌธ์ ์ํฉ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ฉฐ ์๋์ ๋ฌธ์ฅ์ด ๋๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ๋ค. nohup sudo java -jar $JAR_NAME >> $REPOSITORY/deploy.log 2> $REPOSITORY/deploy-err.log & nohup : ํฐ๋ฏธ๋์ ์ข ๋ฃํด๋ ๊ณ์ ์คํํ๊ธฐ. java -jar $JAR_NAME : jar ํ์ผ ์คํํ๊ธฐ. >> : ์ถ๋ ฅ ๋ฆฌ๋ค์ด๋ ์ . jar์ ์คํ ๊ฒฐ๊ณผ๋ฅผ..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์ง๋ ํฌ์คํ ์ ์ ํจ์ค๋ฅผ ์ค์นํ๊ณ ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ ๊ณผ์ ๊น์ง ์งํํ์๋ค. ๐ฑ ๋ ํ์งํ ๋ฆฌ WebHook ๋ฑ๋กํ๊ธฐ ์ฐ๋ฆฌ๋ ๊นํ๋ธ ๋ ํ์งํ ๋ฆฌ์ ํน์ ๋ธ๋์น์ push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ์ผ์ด๋๊ฒ ๋ง๋ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํด๋น push ์ด๋ฒคํธ์ ๋ํด์ ๊ฐ์งํ ์ ์๋๋ก 'webhook'์ด๋ผ๋ ์น๊ตฌ๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค. ๋ฑ๋กํ๊ณ ์ถ์ ๋ ํ์งํ ๋ฆฌ์ Settings > Webhooks > Add webhook์ ํด๋ฆญํ๋ค. ์ด๋ฐ ์์ผ๋ก payload URL๊ณผ content-type์ ์ง์ ํด์ค๋ค. aws ์ธ์คํด์ค๋ก ๋์ ๋ค๋ฉด publicIP:8081๊ณผ ๊ฐ์ ํํ๊ฐ ์ URL์ ๋ค์ด๊ฐ ๊ฒ์ด๋ค. โญ๏ธ ์ฌ๊ธฐ์ ์ ์ผ ์ค์ํ ๊ฑฐ, ๋์ ๊ผญ /github-webhook/ ๋ถ์ฌ์ค์ผ ํ๋ค... ์ด๊ฑฐ ๋๋ฌธ์..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์ด๋ฒ ๋ฏธ์ ์์ ์ ํจ์ค๋ฅผ ํตํด CI / CD๋ฅผ ๊ตฌ์ถํด๋ณด๊ณ ์ถ์ด์ โญ๏ธ๋ฒ ๋ฒ ์ ์๋โญ๏ธ์ ํ์ ๋น๋ ค์ ํ ๋ฒ ์งํํด๋ณด์๋ค. ๋๋ t4g.micro๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ ๋จ์ด 1๊ธฐ๊ฐ๋ฐ์ ์ ๋์ด์ swap์ ํด์ฃผ์์ด์ผ ํ๋๋ฐ, โญ๏ธ ์ค์ํ ๊ฑด swap ์ 1~1.5๊ธฐ๊ฐ ์ ๋๋ง ํด์ผ ํ๋ค๋ ๊ฒ์ด์๋ค. ๋๋ 2๊ธฐ๊ฐ๋ก ํด์ ์ง๊ธ Use๊ฐ 95%๋ก ๊ฐ๋น๊ฐ๋นํ๋ค. ์๋ ์ ๋ผ์ ๋ก์ปฌ๋ก ์คํํ๊ณ ๋๋ฆฌ์น๋ค๊ฐ ๋ค์ ์๋ํ๋๋ฐ ๋๊ธฐ๋ ํ๋ค... 1.5๊ธฐ๊ฐ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์คํํด์ฃผ๋ฉด ๋๋ค. # ๊ธฐ์กด์ ์กด์ฌํ๋ /swapfile์ ๋นํ์ฑํํ๊ธฐ sudo swapoff /swapfile # ํฌ๊ธฐ๊ฐ 1.5๊ธฐ๊ฐ์ธ /swapfile ์์ฑํ๊ธฐ sudo fallocate -l 1.5G /swapfile # /swapfi..
๐ฑ ๋ฌธ์ ์ํฉ ์ฌ์ฉ์์ ์์ฒญ์ผ๋ก๋ถํฐ ๋ฐ์์ฅ๋ฐ๊ตฌ๋ ์์ด๋์ ์ฌ์ฉ์์ ์์ด๋๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์ ๊ฑฐํ๊ธฐ ์ํด ์๋์ ๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค. DELETE FROM cart_item AS c WHERE c.id IN ( SELECT ci.id FROM cart_item AS ci JOIN member AS m ON ci.member_id = m.id AND ci.id IN (6, 8) AND m.id = 1 ); ํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ด target table (cart_item)์ c์ ๋ํด์ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ค๋ ๋ฌธ๊ตฌ๊ฐ ๋์๋ค. ๐ฑ ์์ธ MySQL์์๋ update, delete ์์ ์๊ธฐ ์์ ์ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ ์ค๋ฅ์๋ค. (์ฐธ๊ณ ๋ก H2 ํ๊ฒฝ์์๋ ์ ๋์๊ฐ๋ค. ์๋ ..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ๋ฌด๊ณผ๊ธ์ผ๋ก HTTPS ์ ์ฉ ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด์๋ค. ์ ์๋๋ก๋ผ๋ฉด ๊ฐ๋น์ + Route53 + ACM or ๊ฐ๋น์ + nginx๋ก๋ง ์งํํ๋ฉด ์ข์๊ฒ ์ง๋ง... ์ฌ๋ฌ ์ ์ฝ์ฌํญ์ผ๋ก ์ธํด์ ์๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฉ์ธ ์ฐ๊ฒฐ ๋ฐ HTTPS ์ ์ฉ์ ์งํํด๋ณด์๋ค. ๐ก ์ ์ฝ์ฌํญ - ๋ฌด๋ฃ ๋๋ฉ์ธ ์ฌ์ฉํ๊ธฐ - ์๋ฒ 1๋๋ก ๊ตฌ์ถํ๊ธฐ (๋์์์ด ๊ณ ํต๋ฐ๋ t4g.micro) - http ์ ์ ์ https๋ก ๋ฆฌ๋ค์ด๋ ํธ์ํค๊ธฐ ๋์ค์ Route53 + ACM + ELB๋ฅผ ํตํด ๋์ ํ๋ ๊ฒ๋ ํฌ์คํ ์ผ๋ก ์์ฑํด๋ณด๊ณ ์ ํ๋ค. (์ด๋ฒ ๋ฏธ์ ์์๋ ๋ชป ํ์ง๋ง ใ ) ๐ฑ ๋๋ฉ์ธ ๊ตฌ์ ํ๊ธฐ ์ฌ์ค ๊ฐ๋น์์์ ๊ตฌ๋งคํ๋ ๋๋ฉ์ธ์ด ์๊ธด ํ์ง๋ง, ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๋ณด๋ ๋๋ง์ ๋๋ฉ์ธ์ ์ฌ์ฉํ๊ธฐ๋ ์ข ๊ทธ๋์ ๋ค๋ฅธ ์ฌ์ดํธ๋ฅผ ์ฐพ์๋ณด์๋ค. ๊ทธ๋ฌ๋ค๊ฐ ..
๐ฑ ํฐ๋ฏธ๋์์ ์๋ฐ ๋ฒ์ ๋ฐ๊พธ๊ธฐ ๐ฌ ์ค์น๋์ด ์๋ ๋ชจ๋ ์๋ฐ ๋ฒ์ (์์น) ํ์ธ /usr/libexec/java_home -V ๐ฌ JAVA_HOME ๋ณ๊ฒฝํ๊ธฐ vim ~/.bash_profile ์์์ ํ์ธํ ์๋ฐ ๋ฒ์ ๋ฐ๋ผ์ JAVA_HOME ๋ณ๊ฒฝํด์ฃผ๊ธฐ JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home PATH=$PATH:$JAVA_HOME/bin export JAVA_HOME export PATH ๐ฌ ์ ๋ฐ์ดํธ๋ ์ฌํญ ์ ์ฉ source ~/.bash_profile โญ๏ธ ๋ง์ฝ, zsh ์์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํ๊ฒฝ ์ค์ ์ ๋ณด๊ฐ ๋ง์์์ง๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๊ผญ ๋ณ๊ฒฝํด์ค์ผ ํ๋ค. vi ~/.zshrc # Path to your oh-my-zs..
๐ฑ ๋ฌธ์ ์ํฉ ๋ฏธ์ ์งํํ๋ฉด์ gradle๋ก ๋น๋ํ๋ ค๊ณ ํ๋ ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์งํํ์๋ค. ./gradlew clean build ๊ทผ๋ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค... java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.ClassNameCollector (in unnamed module @0x757e40cf) cannot access class com.sun.tools.javac.code.Symbol$TypeSymbol (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.code to unnamed module @0x757e4..
์ ๋ง ์์ ์ญํ ์ด์ง๋ง ์กฐ๊ธ์ฉ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ณ ์๋๋ฐ, ์ฝํ๋ฆฐ ๋ฌธ๋ฒ์ ๊ณต๋ถํ๋ฉด์ ์๋ก์ด ์ ์ ์๊ฒ ๋์ด ๊ธฐ๋กํ๊ณ ์ ํ๋ค! (์ฝํ๋ฆฐ... ์ต์ํด์ง๋ฉด ์ ๋ง ํธํ ๊ฒ ๊ฐ์ง๋ง ์์ง์ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์ด๋ ต๋ค!) โ๏ธ Amazon S3 with Kotlin ์ฝํ๋ฆฐ๊ณผ s3๋ฅผ ์ฐ๋ํ๊ฒ ๋๋ฉด, ์๊ธฐ์น ๋ชปํ ์๋ฒ ์ค๋ฅ์ ๋๋นํ์ฌ ํ์ผ์ ์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ ๋, ํน์ url ์ ๋ณด๋ฅผ ๋ฐ์์ฌ ๋ ๋ค์๊ณผ ๊ฐ์ด Exception์ด ๋ฐ์ํ ์ ์๊ฒ ๋๋ค. ํ ๊ฐ์ง ๊ถ๊ธํ ์ ์, AmazonServiceException์ ๊ฒฝ์ฐ ๋ถ๋ชจ ํ์ ์ด SdkClientException์ธ๋ฐ ์ ๊ตฌ๋ถํด๋์์๊น... ์๋ฌดํผ, ๊ธฐ์กด์๋ ์๋ฒ ์๋ฌ์ ๋ํด ์ ํ ๊ณ ๋ คํ์ง ์์ ์ํ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์์๋ค. fun deleteFile(file..