๐ฑ ๋ฐฑ์๋ : Backend
[Redis] M1 MacOS์์ Docker Redis Cluster ์ค์ ํ๊ธฐ + SpringBoot ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฌ์คํฐ ์ฐ๊ฒฐํ๊ธฐ
๐ค ๊ฐ์ [Redis] Redis์ ๋ฐฑ์ ๊ณผ HA๋ฅผ ์ํ ์ ๋ต (RDB, AOF, Replication, Sentinel, Sharding, Cluster)๐0. ์๋ก ํ ํ๋ก์ ํธ์์ Redis๋ฅผ ์ฌ์ฉํ๋ค๊ฐ, ์ ๊ธฐํ ํ์์ ๋ฐ๊ฒฌํ๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ๋์ปค๋ฅผ ํตํด ๋ ๋์ค ์๋ฒ๋ฅผ ๋๋ฆฌ๊ณ ์์๊ณ , JWT Refresh Token์ ๋ ๋์ค ์๋ฒ์ ์ ์ฅํ๊ณ ์์๋๋ฐ ๋hoons-dev.tistory.com ์ด์ ๊ธ์ ๋ณด๋ฉด, ๋ ๋์ค์ ๋ฐฑ์ ๊ณผ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ํ ์์ธํ ์ด์ผ๊ธฐ๊ฐ ๋ด๊ฒจ์์ต๋๋ค.Redis์ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด์ Cluster๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๊ทธ ์ค์์๋ Docker Desktop for Mac์ ์ฌ์ฉํ๋ฉด์ Redis-Cluster๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก Docker-Compose ํ์ผ ๊ตฌ์ฑ๊ณผ Sprin..
[QueryDSL] QueryDSL-JPA : DTO Projection๊ณผ Transform
QueryDSL์ ์ฌ์ฉํ๋ฉด์ ์กฐํ Query ์ฑ๋ฅ์ ๋์ด๋ ๋ฐฉ๋ฒ ์ค์ ํ๋๋, ์ํฐํฐ๊ฐ ์๋ DTO๋ก ๊ฐ์ ๋ฐ์ผ๋ฉด ์๋ ํฅ์์ ์ป์ ์ ์์ต๋๋ค.๊ทธ ์ด์ ๋ ์๋์ ๊ฐ์๋ฐ์. 1. ํ์ํ ํ๋๋ง ์กฐํํ๋ฏ๋ก ๋น์ฐํ๊ฒ๋ ์กฐํ ์๋๊ฐ ์ฆ๊ฐํ๋ค.SQL์ SELECT๋ฌธ์ ๋ณด๋ฉด, ํ์ํ ์ปฌ๋ผ๋ง ์ป์ด์ค๋ ๊ฒ์ด ํ ์ด๋ธ ์ ์ฒด๋ฅผ ์ป์ด์ค๋ ๊ฒ๋ณด๋ค ๋น์ฐํ๊ฒ๋ ๋น ๋ฆ ๋๋ค. DTO๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ํ ๋ฐ์ดํฐ๋ง ์กฐํํ๋ ค๋ ์๋๊ฐ ๋ดํฌ๋์ด ์์ต๋๋ค. ๋ถํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์์์ผ๋ก์จ ์ฟผ๋ฆฌ ์ฑ๋ฅ์ ์ต์ ํ ํ ์ ์์ต๋๋ค. 2. JPA์ ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋์์ด ์๋๋ค.์ํฐํฐ๋ JPA์ ๊ด๋ฆฌ ๋์์ด๋ฏ๋ก ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ํฐํฐ๋ฅผ ์กฐํํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์๋์ ์ผ๋ก ๋ ๋ง์ ์ ์์ต๋๋ค.๋ฐ๋ฉด DTO๋ ์์ํ..
[QueryDSL] QueryDSL-JPA : JOIN ํ๊ธฐ
๐ ํ๊ฒฝ- QueryDSL 5.0.0- Spring Data JPA 3.1.2 ๐ JOIN ์ข ๋ฅ1. INNER JOINJOIN ๋นํ๋ ํ ์ด๋ธ์ A, JOIN์ ๊ฑฐ๋ ํ ์ด๋ธ์ B๋ผ๊ณ ํ ๋, A์ B ํ ์ด๋ธ ๋ชจ๋ JOIN์ ํ๋ ค๋ ๋์ Key ์ปฌ๋ผ์ ๋ํด ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ง JOIN์ ํ๋ ๊ฒ์ INNER JOIN์ด๋ผ๊ณ ํฉ๋๋ค. queryDSL์์ Inner join์ ์ฐ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.queryFactory์์ select์ from์ ์ดํ์ join ๋ฉ์๋๋ฅผ ํฌํจํ๋ฉด ๋ฉ๋๋ค. ์๋๋ ์ฝ๋ ์์์ ๋๋ค. @Entity@Getter@Table(name = "neo_starpage")public class StarPage { @EmbeddedId @AttributeOverride(na..
[QueryDSL] QueryDSL-JPA : @ElementCollection VO์ ๋ํ JOIN
๐ ํ๊ฒฝ - QueryDSL 5.0.0 - Spring Data JPA 3.1.2 ๐ค ์ฌ์ฉ๋ ๋๋ฉ์ธ ์ฝ๋ ๐ StarPage Aggregate Root @Entity @Getter @Table(name = "neo_starpage") public class StarPage { @EmbeddedId @AttributeOverride(name = "value", column = @Column(name = "star_page_id")) private StarPageId starPageId; @Embedded private StarPageInfo information; @ElementCollection @CollectionTable(name = "neo_starpage_admin", joinColumns = @..
[Spring] Spring Security + OAuth2.0 + JWT Token์ ํ์ฉํ ์์ ๋ก๊ทธ์ธ ์ด์ ๋ฆฌ - (1) ๋ฐฐ๊ฒฝ ์ง์ ์ดํดํ๊ธฐ, ์ ์ฒด ๊ทธ๋ฆผ ์ดํด๋ณด๊ธฐ
๐๐ป ์๋ก NEO ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์์ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฒ ๋์์ต๋๋ค. ์ธํฐ๋ท ์์ ๋ง์ ๊ธ์ ์ฝ๊ณ , ๋์์ ๋ง์ด ๋ฐ์์ผ๋ ์ ๋ณด๊ฐ ํ๋ฐ ๋ชจ์ฌ์์ง ์๊ณ ๋ณธ์ธ์ด ๊ฐ์ธ์ ์ผ๋ก ์ดํด๊ฐ ๋์ง ์๋ ๋ถ๋ถ์ด ๋ง์ ๋์ค์ ๋ค์ ๊ตฌํํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๊ธ๋ก ์์ฑํ๊ธฐ๋ก ๋ง์์ ๋จน์์ต๋๋ค. ๋ถ์กฑํ ๋ด์ฉ์ด ์์ ์ ์์ง๋ง ๋ ์ข์ ๋ด์ฉ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋ฌ์์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ์ข์ ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ด๋ฉฐ, ์ ๊ธ์ด ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ ค๋ ๋๊ตฐ๊ฐ์๊ฒ ์ข์ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค. ๊ธ์ ์งํ์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด์ด์ง ์์ ์ ๋๋ค. 1. ๋ฐฐ๊ฒฝ์ง์ ์ดํดํ๊ธฐ, ์ ์ฒด ๊ทธ๋ฆผ ์ดํด๋ณด๊ธฐ (OAuth2, JWT Token, ํ๋ก์ ํธ ์ ์ฒด ๋์ํ) 2. Naver, Kakao, Google์ ํ๋ก์ ํธ๋ฅผ OAuth2 Client๋ก..
[Spring] API ๊ด๋ฆฌ๋ฅผ ์ํ Swagger ๋์ ํ๊ธฐ (gradle ๊ธฐ์ค)
๋ณธ ๊ธ์, ํ์๊ฐ Swagger๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ณ์๋์ด ์ฌ์ฉ๋ฒ์ด ์ ๋ฐ์ดํธ ๋ ์์ ์ ๋๋ค. - 2023.03.24 : Tag / Operation / ApiResponses / ApiResponse / Parameter - 2023.03.25 : @ControllerAdvice์์์ ์ฌ์ฉ, @Schema, @Schema์ hidden ์ต์ ๊ณผ ๋ฌธ์ ํด๊ฒฐ ๐ 0. ์๋ก ๋ฐฑ์๋ ๊ฐ๋ฐ์๊ฐ REST API๋ฅผ ์ ๊ฐ๋ฐํ๋ ๊ฒ์ ํ์์ ์์์ ๋๋ค. ์ด๋ ๊ฒ ์ ๋ง๋ API์ ๋ํด ์ ์ ๋ฆฌํ ๋ฌธ์๊ฐ ์๋ค๋ฉด, ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์์, ์ธ์์ธ๊ณ๋ฅผ ๋ฐ๊ฑฐ๋, ์ฌ๋ด API๋ฅผ ํธ์ถํ EndPoint์ ๋ํด ๊ถ๊ธํดํ๋ ๋ค๋ฅธ ๋ฐฑ์๋ ๊ฐ๋ฐ์์๊ฒ ๊ต์ฅํ ์ ํจํ ์์์ผ๋ก ๋จ๊ธธ ์ ์์ต๋๋ค! ํ์ ๋๋, API ๋ฌธ์๋ฅผ ๋ฐ๋ก ์ธ๋ถ ๋ฌธ์๋ก ์..
[Spring] @Transactional๊ณผ DB Lock์ DeepDive - (1) DB ํธ๋์ญ์ , ์ฌ์ฉ๋ฐฉ๋ฒ, ๊ฒฉ๋ฆฌ์์ค, ์ ํ ๋จ๊ณ ํ์ด๋ณด๊ธฐ
๐ค 0. DB ํธ๋์ญ์ ๋ ์ด์ ์ชผ๊ฐค ์ ์๋ ์ต์ ๋จ์์ ์์ ์ด๋ผ๋ ๊ฐ๋ ์ผ๋ก, commit()์ ํตํด ๋ชจ๋ ์ฑ๊ณตํ๋ ์ง ์๋๋ฉด rollback()์ ํตํด ๋ชจ๋ ์ทจ์๋์ด์ผ ํ๋ ์์ ๋จ์. ํธ๋์ญ์ ์ DB์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํ๋์ ์์ ๋จ์์ ์ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ INSERT, UPDATE, DELETE ๋ฑ์ SQL๋ฌธ์ ์คํํ๋ฉด, ์๋์ผ๋ก ํ ๋ผ์ธ๋ง๋ค ํธ๋์ญ์ ์ด ์ ์ฉ๋์ด Commit์ ์คํํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ํธ๋์ญ์ ์ ์์ญ์ ์๋์ผ๋ก ์ค์ ํด, ํ ํธ๋์ญ์ ์์ ์ฌ๋ฌ๊ฐ์ ๋ช ๋ น๋ฌธ์ ๋ฃ๋๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. START TRANSACTION; .... COMMIT; ํธ๋์ญ์ ์ ์ฐ๋ฆฌ๋ง๋ก '๊ฑฐ๋'๋ผ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, A์ B๊ฐ ๊ฑฐ๋๋ฅผ ํ๋ ๊ฒฝ์ฐ A๊ฐ B์๊ฒ ๋์ ์ ๊ธ ํ์ผ๋, B์๊ฒ ์ฌ์ ์ด ์๊ฒจ ๋ฌผ๊ฑด์ ๋ณด๋ด์ง..
[Spring] @ControllerAdvice์ @ExceptionHandler
๐ค 0. ๊ธฐ์กด์ Exception์ ํธ๋ค๋ง ํ๋ ๋ฐฉ๋ฒ Java Application์ ๊ฐ๋ฐํ๋ฉด์, ๋ง์ Exception์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ Exception์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋๋ถ๋ถ ์์๋ค์ํผ try-catch ๋ฌธ์ด ์์ต๋๋ค. try ๊ตฌ๋ฌธ ๋ด๋ถ์์ Exception์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฌธ์ฅ์ ์คํํ๊ณ , ํด๋น try๋ฌธ์์ ๋ฐ์ํ ์ ์๋ ์ฌ๋ฌ Exception์ ๋ํด ์ฌ๋ฌ๊ฐ์ catch ๋ฌธ์ ๋ถ์ฌ ํธ๋ค๋ง ํ ์ ์์์ต๋๋ค. ๋ฌผ๋ก , Exception์ ํธ๋ค๋งํ๊ธฐ ์ข์ ๋ฐฉ๋ฒ์ด์ง๋ง, SpringBoot์์ ๊ฐ๋ฐํ๋ฉด์ ๋ช ๊ฐ์ง ๋ถํธํ ์ ์ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค. ์์ธ ์ฒ๋ฆฌ ๋ก์ง์ ๋ฐ๋ก ๋ถ๋ฆฌํ ์ ์๊ณ , ํญ์ try-catch ๋ธ๋ก์ผ๋ก ๋ฌถ์ด์ ๊ฐ๋ฐํด์ผ ํฉ๋๋ค. ์ ํํ ๋น์ฆ๋์ค ๋ก์ง์ ํ์ ํ๋ ค๋ฉด, ์ด๋ฌ..