songining
article thumbnail
๋ถ„์‚ฐํ™˜๊ฒฝ์— RabbitMQ ์ ์šฉํ•˜๊ธฐ
BACKEND 2024. 1. 5. 21:09

RabbitMQ๋ž€ AMQP(MQ ์˜คํ”ˆ์†Œ์Šค ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ)์˜ ๊ตฌํ˜„์ฒด ์ค‘ ํ•˜๋‚˜์ด์ž ๋ฏธ๋“ค์›จ์–ด ๋ธŒ๋กœ์ปค๋‹ค. MSA ๊ตฌ์กฐ์—์„œ ์„œ๋ฒ„์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ํ•„์š”ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ์ง์ ‘ ํ†ต์‹ ์ด ์•„๋‹Œ MQ๋ฅผ ๊ฑฐ์ณ ํ†ต์‹ ํ•จ์œผ๋กœ์จ ์„œ๋น„์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” ํ†ต์‹ ์„ ํ•˜๊ณ ์ž ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. kafka์— ๋น„ํ•ด ๋น„๊ต์  ์ ์šฉ์ด ์‰ฌ์šด ํŽธ์ด๋ฉฐ ํšŒ์‚ฌ์—์„œ๋„ ๋Œ€๊ทœ๋ชจ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ์–ด์„œ rabbitMQ๋ฅผ ์‚ฌ์šฉ์ค‘์ด๋‹ค. AMQP์˜ ๊ตฌ์„ฑ ์š”์†Œ Exchange : Publisher๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ์— ๋ถ„๋ฐฐํ•˜๋Š” ๋ผ์šฐํ„ฐ ์—ญํ•  (์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ๋ฐฐ๋‹ฌ์›) Queue : ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์ปจ์Šˆ๋จธ์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ•  Binding : Exchange์™€ Queue์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜ ๊ตฌํ˜„์ฒด์ธ R..

article thumbnail
Spring WebFlux ๋™์ž‘ ์›๋ฆฌ ์•Œ์•„๋ณด๊ธฐ (DispatcherHandler)
BACKEND/Spring 2023. 10. 1. 16:13

Spring WebFlux๊ฐ€ ํฐ ํ‹€์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค. Spring MVC ์˜ ๊ฒฝ์šฐ์—๋Š” DispatcherServlet ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์„ ๋ฐ›์•„ ๋’ท๋‹จ์˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค. Spring WebFlux์˜ ๊ฒฝ์šฐ์—๋„ DispatcherServlet๊ณผ ๊ฐ™์ด front controller ์˜ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ์นœ๊ตฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ผ๋‹จ ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ๋Œ€์ถฉ ๋ถ„์„ํ•ด๋ณธ ๊ฒƒ๋“ค์„ ์š”์•ฝํ–ˆ์„ ๋•Œ ์•„๋ž˜ ๊ฐ™์€ ๊ทธ๋ฆผ์ด๋‹ค. (๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•ด์„œ ์ƒ๋žต์ด ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค.) DispatcherHandler (WebHandler์˜ ๊ตฌํ˜„์ฒด) DispatcherHandler ๋Š” WebHandler ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋กœ Spring Webflux์—์„œ์˜ front controller ์—ญํ• ์„ ํ•œ๋‹ค. ์•„๋ž˜๋Š” DispatchHandler..

Spring Data ๊ด€๋ จ ํด๋ž˜์Šค ์ •๋ฆฌ
BACKEND/Spring 2023. 9. 18. 01:14

Spring Data ๋ž€? Spring ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜๋กœ ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ์ง€์›ํ•œ๋‹ค. Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ๋งคํ•‘์„ ์ถ”์ƒํ™” ํ˜•ํƒœ๋กœ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ข€ ๋” ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ๋ฐ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Main Module Spring Data Commons : ๋ชจ๋“  Spring Module์„ ๋’ท๋ฐ›์นจํ•˜๋Š” ํ•ต์‹ฌ Spring ๊ฐœ๋… CrudRepository, PagingAndSortingRepository Spring Data JDBC : spring-jdbc์— ๋Œ€ํ•œ Spring Data ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ CrudRepository๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” SimpleJdbcRepository ํด๋ž˜์Šค Spring Data JPA : JPA๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ..

article thumbnail
Spring WebFlux ๊ธฐ๋ฐ˜ MDC ์ ์šฉํ•˜๊ธฐ (+์ฝ”๋ฃจํ‹ด)
BACKEND/Spring 2023. 8. 12. 22:20

MDC ๋ž€? MDC ๋Š” Mapped Diagnostic Context ์˜ ์•ฝ์ž๋กœ key์™€ value๋ฅผ ์ €์žฅํ•˜๋Š” Map ํ˜•์‹์œผ๋กœ slf4j, logback, log4j ๋“ฑ ๋กœ๊น… ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ThreadLocal ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…์ŠคํŠธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. (๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ๋กœ๊ทธ ๋ฉ”์‹œ์ง€์— ๊ฐ ์“ฐ๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋กœ๊ทธ๊ฐ€ ์„ž์ด๊ธฐ ๋•Œ๋ฌธ) ์š”์ฒญ์ด ์–ด๋–ค ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ๊ฒƒ์ธ์ง€ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ๋ณ„๋กœ ์‹๋ณ„์ž๋ฅผ ๋งŒ๋“ค์–ด ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊ทธ๋งŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ : ๋กœ๊ทธ์‹œ์Šคํ…œ #4-MDC๋ฅผ ์ด์šฉํ•˜์—ฌ ์“ฐ๋ ˆ๋“œ๋ณ„๋กœ ๋กœ๊ทธ ๋ถ„๋ฅ˜ํ•˜๊ธฐ MDC ์ ์šฉํ•˜๊ธฐ Spring Framework๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด AOP๋ฅผ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค...

article thumbnail
TDD, ํด๋ฆฐ ์ฝ”๋“œ with Kotlin 6๊ธฐ ๋ธ”๋ž™์žญ ํ”ผ๋“œ๋ฐฑ
BACKEND 2023. 7. 24. 00:45

Step2 https://github.com/next-step/kotlin-blackjack/pull/528 Test Double ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์˜์กด์„ฑ ์ฃผ์ž… ๋ถ€๋ถ„์— ํ…Œ์ŠคํŠธ ๋”๋ธ”์„ ์‚ฌ์šฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋‹ค๋งŒ, ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ Stub, Mock, Fake ๋“ฑ ํ…Œ์ŠคํŠธ ๋”๋ธ”์˜ ์ข…๋ฅ˜์— ๋Œ€ํ•ด ๋ช…ํ™•ํžˆ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค. Dummy ๋™์ž‘ํ•˜์ง€ ์•Š์•„๋„ ํ…Œ์ŠคํŠธ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ Dummy ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค. ๋‹จ์ˆœ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Stub ํ…Œ์ŠคํŠธ์—์„œ ํ˜ธ์ถœ๋œ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฏธ๋ฆฌ ์ค€๋น„ํ•ด๋‘” ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ฆ‰, ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“์€ ๊ฐ์ฒด๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.) Mock ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๋ฅผ ๋ช…..

TDD, ํด๋ฆฐ ์ฝ”๋“œ with Kotlin 6๊ธฐ ๋กœ๋˜ ํ”ผ๋“œ๋ฐฑ
BACKEND 2023. 7. 24. 00:45

๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ฐ›์•˜๋˜ ํ”ผ๋“œ๋ฐฑ์„ ํ† ๋Œ€๋กœ ๋ฐฐ์šด ์ ๋“ค์„ ์ ์–ด๋ณด๋ ค ํ•œ๋‹ค. ํด๋ฆฐ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”ํ‹€๋ฆฐ์„ ์ข€ ๋” ์ฝ”ํ‹€๋ฆฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ๋งŽ์ด ์•Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์–ด ๋งค์šฐ ์ข‹์€ ๊ฒฝํ—˜์ด์—ˆ๋‹ค! Step2 https://github.com/next-step/kotlin-lotto/pull/759 ๊ฒ€์ฆ๋ถ€๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์ž ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๋„๋ฉ”์ธ์˜ ์ƒ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ด ๊ฒ€์ฆ ๋กœ์ง์„ ์งฐ๋Š”๋ฐ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ํ™œ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•˜๋“œ ์ฝ”๋”ฉ์„ ํ•ด๋ณด๋Š”๊ฑด ์–ด๋–ป๊ฒ ๋ƒ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค. ๊ฒ€์ฆ๋ถ€์— ๋„๋ฉ”์ธ ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ์˜ ๋ฌธ์ œ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ๋ฌด์˜๋ฏธํ•œ ๊ฒ€์ฆ ์‚ฌ์‹ค์ƒ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌ & ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ตฌํ˜„ ์ฝ”๋“œ์™€์˜ ๊ฐ•๊ฒฐํ•ฉ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์™€ ๊ฐ•๊ฒฐํ•ฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜์ง€๋งŒ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ฆฌํŒฉ..

TDD, ํด๋ฆฐ ์ฝ”๋“œ with Kotlin 6๊ธฐ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ํ”ผ๋“œ๋ฐฑ
BACKEND 2023. 7. 24. 00:44

๋„๋ฉ”์ธ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ์ œ์–ด์ž custom setter์™€ getter์˜ ์‚ฌ์šฉ ์ฝ”ํ‹€๋ฆฐ์—์„œ๋Š” ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ getter์™€ setter๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ getter๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ์ฝ”ํ‹€๋ฆฐ์„ ์ข€ ๋” ์ฝ”ํ‹€๋ฆฐ์Šค๋Ÿฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. var stringRepresentation: String get() = this.toString() set(value) { setDataFromString(value) // parses the string and assigns values to other properties } ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์•„๊ฐ€, ๋„๋ฉ”์ธ์— var ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์™ธ๋ถ€์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์ง€์ ์ด ๋…ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์ง€์ ์„ ๋…ธ์ถœํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด private set ์„ ํ†ต..

๋” ์ด์ƒ ์‹ค์ˆ˜ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์ ์–ด๋ณด๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•
BACKEND 2023. 7. 9. 15:51

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ๋งŽ์€ ๊ฒฝ์šฐ - ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ผญ dump ๋– ๋†“๊ธฐ (ํ…Œ์ด๋ธ”์„ ๊ฑด๋“ค๊ฒŒ ๋œ๋‹ค๋ฉด ๋ฌด์—‡์„ ํ•˜๋“  ๊ผญ ์ฒซ๋ฒˆ์งธ๋กœ ํ•˜์ž) - ๊ธฐ์กด ์ปฌ๋Ÿผ(old column)์€ ์œ ์ง€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ(new column)์„ ํ•จ๊ป˜ ๋งŒ๋“ค๊ธฐ, ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ํ™•์ธํ•˜๋ฉด ์กฐ๊ธˆ์”ฉ ์ด์ „ ์ปฌ๋Ÿผ ์ง€์›Œ๋‚˜๊ฐ€๊ธฐ - ์ปฌ๋Ÿผ ๋ช‡๊ฐœ์˜ ๋Œ€์ฒด๋ณด๋‹ค ๋” ํฐ ๊ตฌ์กฐ์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ…Œ์ด๋ธ” ๋ณต์ œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์ž‘์—… ํ›„ ํ…Œ์ด๋ธ”์„ ๊ต์ฒดํ•˜๊ธฐ (๊ธฐ์กด ํ…Œ์ด๋ธ”์—์„œ ์ž‘์—…ํ•˜๋‹ค๋ณด๋ฉด ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜ ์ƒํ™ฉ์— ๋†“์ผ ์ˆ˜ ์žˆ๋‹ค..ใ…Ž) API ์˜ ๋ฒ„์ „ ๊ต์ฒด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ - API ๊ธฐ์กด ๋ฒ„์ „๋„ ์—ฌ์ „ํžˆ ๋™์ž‘ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ํ•ด๋‹น API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์„ ์ „๋ถ€ ์ถ”์ ํ•˜๊ณ  ๋ฐ”๊พธ๋„๋ก ์š”์ฒญํ•  ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด API๋„ ๋™์ž‘ ๊ฐ€๋Šฅ..

article thumbnail
Spring WebFlux์˜ Programming Models
BACKEND/Spring 2023. 2. 20. 14:22

Programming Models 1. Annotated Controller Spring MVC์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ์‹์„ WebFlux ์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. @RequestMapping, @PathVariable, @RestController, @GetMapping ๋“ฑ 2. Functional Endpoints Java8์˜ lambda style routing๊ณผ handling ๋ฐฉ์‹ (ํ•จ์ˆ˜ํ˜• ๋ชจ๋ธ) RouterFunction: ์–ด๋–ค ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ง€ ๊ฒฐ์ • HandlerFunction: ๋ฐ”์ธ๋”ฉ ๋ถ€ํ„ฐ HTTP ์š”์ฒญ ์‘๋‹ต์ฒ˜๋ฆฌ ServerRequest์™€ ServerResponse๋กœ ์‘๋‹ต์„ ํ•˜๋ฉฐ ์„œ๋ธ”๋ฆฟ ์ œ์•ฝ์ด ์—†๊ณ  ๋ฆฌ์•กํ‹ฐ๋ธŒ ํƒ€์ž…์„ ์ง€์›ํ•œ๋‹ค. Spring WebFlux์˜ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ 2๊ฐœ์˜ ๊ฐœ๋ฐœ ..

Spring Actuator ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
BACKEND/Spring 2023. 1. 31. 22:45

Spring Actuator๋ž€? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง, Metric ์ˆ˜์ง‘์„ ์œ„ํ•œ Http Endpoint๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ์ด๋‹ค. (์š”์•ฝํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ๋Šฅ!) // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator implementation 'org.springframework.boot:spring-boot-starter-actuator:3.0.1' ๋‹ค์Œ๊ณผ ๊ฐ™์ด dependency๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. Ex) spring ์„ค์ • yaml ํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์–ด๋–ค endpoint๋“ค์„ ํฌํ•จํ• ์ง€ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค. management: endp..

Spring Securirty 6 ์ด์ƒ ๋ฒ„์ „์—์„œ h2-console 403 ์—๋Ÿฌ ๋‚˜๋Š” ๋ฌธ์ œ
BACKEND/Spring 2023. 1. 23. 17:41

๊ธฐ์กด์— ํ•˜๋˜ ๊ฒƒ ์ฒ˜๋Ÿผ http.requestMatchers("/h2-console/**").permitAll() ๋กœ h2-console์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ด์ฃผ๋ ค๊ณ  ํ–ˆ์ง€๋งŒ ๊ณ„์†ํ•ด์„œ 403(forbidden) ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค. ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests() .requestMatchers("/users/**").permitAll() .and() .authorizeHttpRequests(auth -> auth .requestMatchers(AntPathRequestMatcher.antMatcher("/h2-console/..

Kotlin Kotest @beforeSpec @beforeContainer @beforeTest @beforeEach ์ฐจ์ด
BACKEND/Spring 2022. 9. 19. 16:58

Kotest์—๋Š” ์ „ํ›„์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ๋Œ€ํ‘œ์ ์œผ๋กœ @beforeSpec @beforeContainer @beforeTest @beforeEach .. ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ƒ๋ช…์ฃผ๊ธฐ์— ์–ด๋– ํ•œ ์ „ํ›„ ์„ธํŒ…์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํ…Œ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰, ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋“ฑ๋“ฑ! ์–ด๋–ค function์„ ์‚ฌ์šฉํ•˜๋ƒ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ๊ณผ์ •๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์— ๋งž๊ฒŒ ๊ณจ๋ผ ์‚ฌ์šฉํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. Function Description @beforeEach ๊ฐ testcase ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. @beforeTest ๊ฐ testcase ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. @beforeContainer ๊ฑฑ context๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค. @beforeSpec ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ spec (FunS..