Spring
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ค๊ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ๋ค! ํด๋น ์์ธ์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ๋ ๋ฐํํ์ด์ผ ํด์ try-catch๋ฅผ ์ฌ์ฉํ ๊น ํ์ง๋ง ๋ฐํํ ์์ด ๋ฌ๋ผ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ ๊น ๊ณ ๋ฏผ์ ํ๋ ์ค์ @ExceptionHandler๋ฅผ ํตํด์ ์ฒ๋ฆฌํด ์ฃผ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค! ๊ทผ๋ฐ @ExceptionHandler๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ปจํธ๋กค๋ฌ์ ๋งค๋ฒ ์ง์ ์ ํด์ฃผ๊ฒ ๋๋ฉด ์ฝ๋ ์ค๋ณต์ด ๋๋ฌด ๋ง์ด ๋ฐ์ํ๊ฒ ๋ผ์ @ControllerAdvice๋ฅผ ํตํด ์ ์ญ์ ์ผ๋ก ์์ธ๋ฅผ ํธ๋ค๋ง ํ ์ ์๊ฒ ์ฒ๋ฆฌํ๋ค. ๐ ์ฌ์ฉํ ์ฝ๋ @RestControllerAdvice public class ExceptionAdviceController { private final ResponseService responseService; public Exce..
Spring
ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ๋ ๊ตญ์ ํ ์ ์ฉ์ ํด๋ณด์๋ค. ๐ฑ i18n ๊ฐ๋
i18n์ด๋ internationalization(i์ n์ฌ์ด 18๊ธ์)์ ์ค์ธ ๊ฒ์ผ๋ก ํ๊ตญ์ด๋ก ๋ฒ์ญํ๋ฉด '๊ตญ์ ํ'๋ผ๋ ๋ป์ด๋ค. ๊ตญ์ ํ๋ ๋ฌธํ, ์ง์ญ, ์ธ์ด๊ฐ ๋ค์ํ ๋์ ๊ณ ๊ฐ์ ์ํด ์ฝ๊ฒ ํ์งํ๋ ์ ์๋ ์ ํ, ์ ํ๋ฆฌ์ผ์ด์
๋๋ ๋ฌธ์ ์ฝํ
์ธ ๋ฅผ ์ค๊ณํ๊ณ ๊ฐ๋ฐํ๋ ๊ฒ์ด๋ค! โ๏ธ build.gradle ์ ์์กด์ฑ ์ถ๊ฐ ๋๋ ymlํ์ผ์ ํตํด ๋ฉ์์ง๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ถ๊ฐํด์คฌ๋ค! properties๋ก ํ ๊ฑฐ๋ฉด ์ถ๊ฐ ์ ํด๋ ๋ ๊ฒ ๊ฐ๋ค! implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1' โ๏ธ application.yml์ ๋ฉ์์ง ๊ฒฝ๋ก ์ค์ ๋ฐ ์ค์ ํ์ผ ..
๊ฒฝํ
๋ฐ๋ณด์
์์ ์งํํ ์ฟ ๋ฒ๋คํฐ์ค ์ธ๋ฏธ๋์ ์ฐธ์ฌํ๋ค! ์ฌ์ค ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ ๋๋ก ์จ๋ณธ ์ ์ ์์ง๋ง ์ด๋ฐ ๊ฐ๋ฐ ์ปจํผ๋ฐ์ค๊ฐ์ ๊ณณ ์์ฃผ ๋ค๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํด์ ์ ์ฒญํ๊ณ ํ๊ต๋ก ๋ค์ผ๋ฌ ๊ฐ๋ค ใ
ใ
์ธ๋ฏธ๋ ๋ค์ด๊ฐ๋๋ฐ ์ ๋ง ๋ง์ ํ์ง์ ๋ถ๋ค์ด ๊ณ์
์ ๋๋๋ค ๐ฎ ๋ค๋ค ๋ฐฐ์์ ๋ํ ์ด์ ์ด ๋๋จํ์๋ค๊ณ ์๊ฐํ๊ณ ๋๋ ๋์์์ด ์ฑ์ฅํ๊ณ ๋ฐฐ์ฐ๋ ๊ฐ๋ฐ์๊ฐ ๋์ด์ผ๊ฒ ๋ค๊ณ ๋๋ ํ๋ฃจ์๋ค.. ์ฟ ๋ฒ๋คํฐ์ค ๋ด์ฉ์ ๋ค ์์๋ฃ์ง ๋ชปํ์ง๋ง ๋์ค์ ๊ฐ์์์ ๋ค์ ๋ฐฉ๋ฒ๋ค์ ๊ผญ ํ๋ก์ ํธ์ ์ ์ฉํด๋ด์ผ๊ฒ ๋ค !!
DB
๐ซง DB ์ธ๋ฑ์ค๋? ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒ์ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. → ์ฑ
์์ ๋ชฉ์ฐจ๋ฅผ ๋ณด๋ฉด ํ์ด์ง ๋ฒํธ๋ง์ผ๋ก ์ํ๋ ๋ด์ฉ์ ๋ถ๋ถ์ ํ ๋ฒ์ ์ฐพ์ ์ ์๋ ๊ฒ์ฒ๋ผ ๊ฒ์์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์๋ฏธ์ด๋ค ๐ Full Table Scan full table scan์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ ๋ where๋ฌธ์ ์ด์ฉํด์ ํ
์ด๋ธ์ ์ ์ฒด๋ฅผ ์กฐ๊ฑด๊ณผ ๋น๊ตํด์ผ๋๋ ์์
์ด๋ค. ๊ทธ๋์ ๊ต์ฅํ ๋ฒ๊ฑฐ๋กญ๊ณ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆผ! โ๏ธ B-Tree B-Tree๋ Balanced Tree์ ์ค์๋ง์ด๋ค. MySQL์ DB ์์ง์ธ InnoDB๋ B+Tree๋ก ์ด๋ฃจ์ด์ ธ์์ผ๋ฉฐ ์ด๊ฒ์ B-Tree์ ํ์ฅ๋ ๊ฐ๋
์ด๋ค. B-Tree B-Tree๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋ ์ํ๋ก ์ ์ง๋์ด ์๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์ฐจ๋ก๋๋ก ๋ฃจํธ๋
ธ๋, ๋ธ๋์น ๋
ธ๋, ๋ฆฌ..
Spring
๐ Spring Cache๋? ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ ์์ฒญํ ๋๋ง๋ค ์์ฑํ์ฌ ์๋ตํ๋ ๊ฒ๋ณด๋ค๋ ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด ๋๊ณ ๋๊ฐ์ ์์ฒญ์ด ์์ ๋ ๋ก์ง์ ๊ฑฐ์น์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํด ์ฃผ์ด ๋น ๋ฅธ ๊ฒ์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ๋ก์ปฌ ์บ์์ด๊ธฐ ๋๋ฌธ์ application๊ฐ ๊ณต์ ๊ฐ ๋์ง ์๊ณ ์๋ฒ๋ฅผ ๋ ๋ ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ๋ฏ๋ก ๊ณ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด redis ๊ฐ์ ์ธ๋ถ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์ฌ์ฉํด์ผ ํ๋ ๊ณณ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ๋๋ ๊ฐ์ด ๋์ผํ ๋ ๋น๋ฒํ๊ฒ ํธ์ถ๋ ๋ ํ ๋ฒ ์ฒ๋ฆฌํ ๋ ๋ง์ ์๋ฒ ๋ฆฌ์์ค๋ฅผ ์๊ตฌํ ๋ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๊ณณ ์ค์๊ฐ์ผ๋ก ์ ํ์ฑ์ ์๊ตฌํ๋ ๊ฒฝ์ฐ ๋น๋ฒํ๊ฒ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ์คํ๋ง ์ค์ implementation 'org.springframework.boot..
์นดํ
๊ณ ๋ฆฌ ์์
๋น๋ํจํด ๋น๋ํจํด์ ๋ณต์กํ ๊ฐ์ฒด ์์ฑ ๊ณผ์ ๊ณผ ํํ ๋ฐฉ๋ฒ์ ๋ถ๋ฆฌํด์ ๋ค์ํ ๊ตฌ์ฑ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ์์ฑ ํจํด์ด๋ค. ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์๋๋ฐ 1. ์์ฑ์ ์์ฑ 2. setter ์ฃผ์
3. ๋น๋ ํจํด์ด๋ค. ์ ์ธต์ ์์ฑ์ ํจํด ๋งค๊ฐ๋ณ์๋ฅผ ํตํด์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ถ์ ๋ ์์ฑ์๋ฅผ ์ค๋ฒ๋ก๋ฉ ํ๋ ๋ฐฉ๋ฒ class Member { private String name; private int age; public Member(String name, int age){ this.name = name; this.age = age; } public Member(String name){ this.name = name; } } ์ด๋ฐ ํจํด์ ํด๋์ค ์ธ์คํด์ค ํ๋๊ฐ ๋ง์ ์๋ก ์์ฑ์์ ๋ค์ด๊ฐ ์ธ์์ ์๊ฐ ๋์ด๋ ๋ช ๋ฒ..
ํ์ฌ
๋๋ตํ ์ ์๋ค๋ ๊ฒ์ ์ฑ
์์ง ์ ์๋ค๋ ๊ฒ์ด๊ณ ๋๋ตํ ์ ์๋ค๋ ๊ฒ์ ์ฑ
์์ง ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋๋ตํ ์ ์์ ๋ ๋๋ ์ฐ์ง ์๋๋ค. ์ฑ
์์ง ์ ์๋ ์ผ์ ์์์ ํ์ง ์๋ ๊ฒ์ ๋๋ ์์ฌ์ด๋ผ ๋ถ๋ฅธ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฅ ๋ฎ์ ๊ณณ์์ ๋๋ฅผ ๋๋ ๊ฒ์ ์ฑ
์๊ณผ ์์ฌ์ด๋ค. ์ฑ
์๊ณผ ์์ฌ์ ์ง๋ฌธ์ผ๋ก๋ถํฐ ์๊ฒจ๋๋ค. - ์ฐ์ฑ
๊ณผ ์ฐ์ (์ ์ง๋ชฉ) - ์๋ฆ๋ค์ด ๊ฒ์์ ์ถํ ์๋ฏธ๋ฅผ ์ฐพ์๋ด๋ ์ฌ๋์ ์ฆ๊ฑฐ์์ ์ฃผ์ง ๋ชปํ๋ ํ๋ฝํ ์ฌ๋์ด๋ค. ์ด๊ฑด ์๋ชป์ด๋ค. ์๋ฆ๋ค์ด ๊ฒ์์ ์๋ฆ๋ค์ด ์๋ฏธ๋ฅผ ์ฐพ์๋ด๋ ์ฌ๋์ ๊ต์ ์๋ ์ฌ๋์ด๋ค. ์ด๋ฐ ์ฌ๋๋ค์๊ฒ๋ ํฌ๋ง์ด ์๋ค. ๊ทธ๋ค์ ์ ํ๋ฐ์ ์ฌ๋๋ค๋ก, ๊ทธ๋ค์๊ฒ ์๋ฆ๋ค์ด ๊ฒ์ ์ค๋กฏ์ด ์๋ฆ๋ค์ด๋ง์ ์๋ฏธํ๋ค. ๋๋์ ์ธ ์ฑ
์ด๋ ๋ถ๋๋ํ ์ฑ
์ ์๋ค. ์ ์ด ์ฑ
, ํน์ ์ ์ฐ์ง ๋ชปํ ์ฑ
, ์ด ๋ ์ค ํ๋๋ค ๊ทธ..
ํ์ฌ
์์ฆ ์ง์ ํ์ผ๋ก ๊ธ์ ์ฐ๋ ์ผ๋ ์ ์ด์ง๊ณ , ๋ฌธํด๋ ฅ์ด๋ ์ง์ค๋ ฅ๋ ๊ธฐ๋ฅผ ๊ฒธ ํ์ฌ๋ฅผ ์์ํ๋ค! ์ค๋์ด 3์ผ์ฐจ์ธ๋ฐ ๋ด๊ฐ ํ์ฌํ ๊ฒ๋ค์ ๋ธ๋ก๊ทธ์ ๊ธฐ๋กํด๋ณด๋ ค๊ณ ํ๋ค (• ห ห ห •)โ ๊ทธ ์ด๋ ์์์ ๋๋ ์๋๊ณ , ๋ฐ๋ก ๊ทธ ์ด๋ ์ผ๋ก ์ธํ์ฌ ๋๋ ์กฐ๊ธ์ฉ ๊ฐํด์ก๋ค. ๊ทธ ์ ๋ นํ ํธ๋ฅธ๋น์ ์ต์ํด์ง๋ฉด์ ์ด๋ฆฐ ๋๋ ํฌ์ ํ๊ฑฐ๋ ์ฌ์ฌํจ์ ํธ์ํ๋ ๋์ ์นจ๋ฌตํ๋ ๋ฒ์ ๋ฐฐ์ ๋ค. ๋ฌด์์ธ๊ฐ๋ฅผ ๊ฐ๋งํ๋ ๊ฒ์ ๋ฉ์ถ ๋ ๋น๋ก์ ํํ๋ฅผ ์ป๊ฒ ๋๋ค๋ ๊ฒ์ ๋๋ ์ด๋ ดํ์ด ๊นจ๋ซ๊ณ ์์๋ค. - ๊ฒ์ ์ฌ์ด (ํ๊ฐ) - ๋์๋ ๊ธฐ์ต ์์ ์๋ฆฌ์ ํฅ์ ์ ํ๋ฉฐ ๊ณผ๊ฑฐ์ ์ด๋ค ์๊ฐ์ ๋ ์ค๋ฅด๊ฒ ํ๋ ํน์ฑ์ ์ง๋
๋ค. ํฐํ๋ ๋์๋ฅผ ํ ๋ป ๋ค์ด๋ง์๋ฉฐ ๊ทธ ๊ฐ๋ณํ ๋์๋ ํฅ๊ณผ ํจ๊ป ์์ ์ ์ถ์ต ์์ผ๋ก ์ฌํํ๋ ๊ฒ์ ์ข์ํ๋ค. - ๋ฌ์ฝค ์์ธ๋ฆํ ์ด์ฝ๋ฆฟ (๋ผ์ฐ๋ผ ์์คํค..
Algorithm
ํต์ ๋ ฌ์ด๋? ํต์ ๋ ฌ(Quick-Sort)์ ํ๊ท ์๋ (NlogN)์ ์๋ํ๋ ๋งค์ฐ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ถํ ์ ๋ณต(Divide & Conquer) ์๊ณ ๋ฆฌ์ฆ์ ํ๋๋ก ๋ค๋ฅธ ์์์ ๋น๊ต๋ง์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋น๊ต ์ ๋ ฌ์ ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ ๋ ฌ๊ณผ์ ํต์ ๋ ฌ์ ์์ด์ ํผ๋ด(pivot)์ ๊ธฐ์ค์ผ๋ก ์ข์ธก์๋ ํผ๋ด๋ณด๋ค ์์ ๊ฐ์ ๋๊ณ ์ฐ์ธก์๋ ํผ๋ด๋ณด๋ค ํฐ ๊ฐ์ ๋๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌํ๋ค. ํผ๋ด์ ์ ํํ๋ค. left๋ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ด๋ณด๋ค ๋ ํฐ ์๋ฅผ ์ฐพ๋๋ค. right๋ ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ๋ฉด์ ํผ๋ด๋ณด๋ค ๋ ์์ ์๋ฅผ ์ฐพ๋๋ค. ์ฐพ์ ์ง์ ์์ left์ right๋ฅผ ๊ตํํ๋ค. ์ ๊ณผ์ ์ left๋ right๊ฐ ๋ฐ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค. left๋ right๊ฐ ๋ฐ๋๋ฉด ํผ๋ด๊ณผ right๋ฅผ ๊ตํํ๋ค. ์ ๊ณผ์ ์ ๊ฑฐ..
ํธ๋ฌ๋ธ ์ํ
nginx๋ฅผ ๋ค์ ์์ํ๋ ค๊ณ ํ๋๋ฐ ์๊พธ cert.pem์ ๊ถํ์ด ์๋ค๋ ์ค๋ฅ๊ฐ ๋ด๋ค.. โ๏ธ ํด๊ฒฐ๋ฐฉ๋ฒ certbot certonly --manual -d ${domain} cd /var/log/ sudo chmod -R 775 letsencrypt/ sudo chgrp -R ec2-user letsencrypt/ cd /var/lib sudo chmod -R 775 letsencrypt/ sudo chgrp -R ec2-user letsencrypt/ cd /etc sudo chmod -R 775 letsencrypt/ sudo chgrp -R ec2-user letsencrypt/ ์ด๋ ๊ฒ letsencrypt์ ec2-user ๊ถํ์ ์คฌ๋๋ ์ค๋ฅ๊ฐ ํด๊ฒฐ๋์๋ค!