๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ

(53)
LocalDate ํฌ๋งท ์˜ค๋ฅ˜๋กœ ์‹œ์ž‘๋œ OpenFeign ์˜ Auto Configuration ํƒ์ƒ‰ ๊ฐœ์š”OpenFeign์„ ์‚ฌ์šฉํ•ด admin ์„œ๋ฒ„์™€ core ์„œ๋ฒ„ ๊ฐ„์— HTTP ํ†ต์‹ ์„ ํ•˜๋˜ ์ค‘, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.admin ์„œ๋ฒ„์—์„œ LocalDate ํƒ€์ž…์„ yyyy-MM-dd ํฌ๋งท์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ core ์„œ๋ฒ„์—์„œ๋Š” LocalDate ํฌ๋งท์ด yyyy-MM-dd ๋ฅผ ๊ธฐ๋Œ€ํ–ˆ์ง€๋งŒ, yy. M. d. ์œผ๋กœ ์™€์„œ ํฌ๋งท ๋ณ€ํ™˜์— ์‹คํŒจํ•˜๋Š” ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋Š” ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ์—์„œ ์ œ์‹œํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:@Beanpublic FeignFormatterRegistrar localDateFeignFormatterRegister() { return registry -> { DateTimeFormatterRegistrar registrar = new ..
๊ฒ€์ƒ‰ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์œ„ํ•œ Elasticsearch ์ธ๋ฑ์Šค & Query DSL ์„ค๊ณ„๊ธฐ ์‚ฌ๋‚ด ์‹ค์Šต์œผ๋กœ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ˜์˜ํ•ด Elasticsearch์˜ ์ธ๋ฑ์Šค ์„ค์ •๊ณผ ๋งคํ•‘์„ ์ •์˜ํ•˜๊ณ , ๊ฒ€์ƒ‰์„ ์œ„ํ•œ Query DSL(JSON ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ์–ธ์–ด, Not OpenFeign QueryDSL)์„ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ๋“ค์„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ VirtualBox (Rocky Linux)Elasticsearch 7.10.2ํ•˜๋‚˜์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋…ธ๋“œ 3๊ฐœ ๊ตฌ์„ฑ API ์š”์ฒญ/์‘๋‹ต ๋„๊ตฌ Kibana / Postman1. ๋ช…์‚ฌ๊ตฌ๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ๊ฒ€์ƒ‰์ด ๋” ์ž˜๋˜๊ฒŒ ํ•ด์ฃผ์„ธ์š”.์ด๋ฅผ ์œ„ํ•ด mulit_match ์˜ phrase ํƒ€์ž…์„ ํ™œ์šฉํ–ˆ๋‹ค. multi_match๋Š” type์— ๋”ฐ๋ผ ์ฟผ๋ฆฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•์ด ๋‹ฌ๋ผ์ง„๋‹ค. multi_match ์ฟผ๋ฆฌ์˜ type๋ณ„ ๋™์ž‘ - best_fields (๊ธฐ๋ณธ๊ฐ’)์—ฌ๋Ÿฌ ํ•„๋“œ ์ค‘ ํ•˜..
OpenFeign Querydsl์„ ์˜ˆ์‹œ๋กœ ์•Œ์•„๋ณด๋Š” Spring Boot + Maven ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •๋ฒ• ๋ชฉํ‘œ : Spring Boot๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ์ง€ ์•Š๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ, ์›ํ•˜๋Š” ๋ฒ„์ „์„ ์–ด๋–ป๊ฒŒ ์ฐพ์•„๊ฐ€๋Š”์ง€ OpenFeign Querydsl ์„ ์˜ˆ์‹œ๋กœ ์•Œ์•„๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ ํ™˜๊ฒฝ๋นŒ๋“œ ๋„๊ตฌ: Maven (Gradle์€ ๋ณธ๋ฌธ์—์„œ ์ผ๋ถ€๋งŒ ๊ฐ„๋‹จํžˆ ๋‹ค๋ฃน๋‹ˆ๋‹ค)IDE: IntelliJ Ultimateํ”„๋ ˆ์ž„์›Œํฌ: Spring Bootpom.xml ์„ค์ • ์˜ˆ์‹œ๋Š” ๊ธ€ ํ•˜๋‹จ์˜ "๊ฒฐ๋ก "์— ์ œ์‹œ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์„ค์ •์— ์ด๋ฅด๊ธฐ๊นŒ์ง€์˜ ๊ณผ์ •์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. Querydsl vs OpenFeign QuerydslQuerydsl(https://github.com/querydsl/querydsl)5.0.0 ๋ฒ„์ „: 2021๋…„ 7์›” ๋ฆด๋ฆฌ์Šค5.1.0 ๋ฒ„์ „: 2024๋…„ 1์›” 30์ผ ๋ฆด๋ฆฌ์Šค3๋…„ ๊ฐ€๊นŒ์ด ํฐ ์—…๋ฐ์ดํŠธ ์—†์ด ์œ ์ง€๋˜๋‹ค 1๋…„์ „..
Elasticsearch๊ฐ€ Apache Lucene ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ refresh/flush API๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ธฐ ๋ชฉํ‘œ: ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜๊ฐ€ ์•„ํŒŒ์น˜ ๋ฃจ์”ฌ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ Elasticsearch์™€ Apache Lucene์˜ ๊ด€๊ณ„ Apache Lucene์€ ๋ฌธ์„œ๋ฅผ ์ƒ‰์ธํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ๊ฐ•๋ ฅํ•œ ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ์—”์ง„์ž…๋‹ˆ๋‹ค.(https://lucene.apache.org/)๋ฐ˜๋ฉด, Elasticsearch๋Š” Lucene์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ถ„์‚ฐํ˜• ๊ฒ€์ƒ‰ ์—”์ง„์œผ๋กœ, Lucene์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์‚ฌ์šฉ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด JSON ๊ธฐ๋ฐ˜์˜ RESTful HTTP API๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋ฌธ์„œ๋ฅผ ์ƒ‰์ธํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, GET์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ , POST/PUT์œผ๋กœ ๋ฌธ์„œ๋ฅผ ์ƒ‰์ธํ•˜๋ฉฐ, DELETE๋กœ ๋ฌธ์„œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์™ธ์—๋„ Elasticsearch๋Š” ๊ณ ..
Spring Rest Docs ๋„์ž… ์‹œ, Maven๊ณผ Asciidoctor ๋ฌธ๋ฒ•์ด ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ pom.xml ์„ค๋ช… Spring Rest Docs๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ์„ ๋•Œ, Maven์— ๋„์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ pom.xml ์„ค๋ช…์ด ๋ถ€์กฑํ•˜๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Spring Boot์™€ Maven(3.9.9 ๋ฒ„์ „) ํ™˜๊ฒฝ์—์„œ Spring Rest Docs๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ pom.xml ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๊ณ , ๊ทธ ๊ณผ์ •์—์„œ Maven ์˜ ๋ฌธ๋ฒ•๋„ ํ•จ๊ป˜ ํ•™์Šตํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, pom.xml ์„ค์ • ๊ฐ’๋“ค์ด Asciidoctor์™€ Maven ์ค‘ ๋ˆ„๊ตฌ์˜ ์„ค์ • ๊ฐ’์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ด ๊ธ€์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ์ฒ˜๋Ÿผ *.adoc ํŒŒ์ผ์„ HTML๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ .jar ํŒŒ์ผ์— ํฌํ•จ์‹œํ‚ค๊ณ , *.adoc ํŒŒ์ผ์€ ๋„๋ฉ”์ธ๋ณ„๋กœ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹๋„ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.1. Spring Rest Docs 3.0.3 ..
์ˆ˜์Šต๊ณผ์ œ ๊ฒŒ์‹œํŒ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋‚˜๋Š” ๋ฌด์—‡์„ ๋ฐฐ์› ๋‚˜? ์ˆ˜์Šต๊ธฐ๊ฐ„ 4์ฃผ ๋™์•ˆ '๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ' ๊ณผ์ œ๋ฅผ ๋ถ€์—ฌ๋ฐ›์•˜๋‹ค. ์ด ๊ธ€์€ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๋‚˜๋Š” 1๋‹ฌ์ด๋ผ๋Š” ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ๋ฌด์—‡์„ ๋ฐฐ์› ๋Š”์ง€ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ ๊ธฐ์ˆ  ์Šคํƒํ”„๋ก ํŠธ์—”๋“œ: ํผ๋ธ”๋ฆฌ์‹ฑ์— JavaScript๋ฅผ ๋ง๋ถ™์—ฌ Ajax ์š”์ฒญ๋ฐฑ์—”๋“œ: Spring Boot, Spring Security, JDBC Template, ThymeleafDB: MySQL๋นŒ๋“œ: MavenAPI ๋ฌธ์„œ: Rest Docs๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์€ ํฌ๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.์‚ฌ์šฉ์ž, ๊ฒŒ์‹œ๊ธ€, ๋Œ“๊ธ€/๋‹ต๊ธ€, ๊ด€๋ฆฌ์ž CRUD ๊ฒŒ์‹œ๊ธ€ ํŽ˜์ด์ง•, ๊ฒ€์ƒ‰, ์ถœ๋ ฅ ๊ฑด์ˆ˜ ์กฐ๊ฑด๋™์˜์ƒ 1๊ณผ 2๋Š” ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค.๋™์˜์ƒ 1. ๊ฒŒ์‹œํŒ ํ™ˆ ํ™”๋ฉด ๋™์˜์ƒ 2์˜ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋Š” ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ๋Œ“๊ธ€/๋‹ต๊ธ€์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜์ •์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.๋™์˜์ƒ 2. ๊ฒŒ..
์ฝ”๋“œ๋กœ ์•Œ์•„๋ณด๋Š” Spring Data Redis์˜ @Cacheable ๋™์ž‘ ์›๋ฆฌ์™€ ํŠธ๋žœ์žญ์…˜์—์„œ @CachePut/@CacheEvict ์‹คํ–‰ ์‹œ์  ๊ธ€์˜ ๋ชฉํ‘œSpring Data Redis์—์„œ @Cacheable ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์บ์‹œ ๋ฏธ์Šค(Cache miss)๋กœ ์ธํ•ด ๋ฐ˜ํ™˜๊ฐ’์ด ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๊ณผ์ •. ๊ทธ๋ฆฌ๊ณ , @Transactional๊ณผ ํ•จ๊ป˜ @CachePut/@CacheEvict๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ @CachePut/@CacheEvict๊ฐ€ ์–ธ์ œ ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ํ†ตํ•ด ์•„๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ๋ณธ ๊ธ€์€ RedisCache์— ํ•œ์ •๋œ ๋‚ด์šฉ์ž„์„ ๋ฏธ๋ฆฌ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. Spring Cache ์ถ”์ƒํ™” ๊ตฌ์กฐ Spring Cache๋Š” Cache ์ธํ„ฐํŽ˜์ด์Šค์™€ CacheManager ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ถ”์ƒํ™”๋ฉ๋‹ˆ๋‹ค This abstraction is materialized by the org.springframework.cache.Cache and org.springf..
RedisTemplate ๋‚ด๋ถ€ ํƒ๊ตฌ: Spring Data Redis๋Š” Lettuce๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”ํ–ˆ๋Š”๊ฐ€? Lettuce ๊ฐ€ ๋ฌด์—‡์ธ์ง€, Spring Data Redis์˜ RedisTemplate ์€ Lettuce ๋ฅผ ์–ด๋–ป๊ฒŒ ์ถ”์ƒํ™”ํ–ˆ๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, Spring Data Redis ๋Š” Lettuce์™€ Jedis ๋ผ๋Š” 2๊ฐœ์˜ ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ์™€ ํ†ตํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.Spring Data Redis integrates with Lettuce and Jedis, two popular open-source Java libraries for Redis. Lettuce์™€ Jedis๋Š” "Java์—์„œ Redis์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ"์ž…๋‹ˆ๋‹ค.๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ๊ฐ ๋ฌด์—‡์ธ์ง€ Lettuce๋ถ€ํ„ฐ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.Lettuce ๋ž€?Lettuce is a scalable thread-safe Redi..