ํ์ฌ์์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ์ต์ํด์ง๋ค๋ณด๋ฉด ์ ์ ์ํคํ ์ฒ๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ด ์จ์ ํ ์ต์ํ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ๊ฒ ๋๋ ๊ฒ ๊ฐ์์ ๊ณ์ธตํ ์ํคํ ์ฒ์ ๋ํ ๊ฐ์ธ์ ์ธ ์๊ฐ์ ํ๋ฒ ๋ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค. Fat Service ์ง์ํ๊ธฐ๊ฐ์ฒด์งํฅ์์น์ ๋ฐ๋ฅด๋ฉฐ ๊ณ์ธตํ ์ํคํ ์ฒ๋ก ์์คํ ์ ๊ตฌ์ฑํ ๋, ์๋น์ค๊ฐ ๋ณต์กํด์ง๋ฉด ๋ณต์กํด์ง์๋ก ๊ณ ๋ฏผํด์ผํ ๋ถ๋ถ๋ค์ด ๋ง์์ง๋ค. ๋๋ ๋ณดํต ๊ตฌ์ฑํ ๋ presentation, application, domain, infrastructure๋ก ๋๋๊ณค ํ๋๋ฐ,์ฌ๊ธฐ์ application(service) ๊ณผ domain ์ DDD ๊ด์ ์์ ๋๋ฉ์ธ ๋ ์ด์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.์๋ฅผ ๋ค์ด, MemberService๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ํ์๊ฐ์ , ์ด๋ฉ์ผ ๋ณ๊ฒฝ, ํด๋ฉด ๊ณ์ ์ ํ ๋ฑ member์ ๊ด๋ จ๋ ๋ชจ๋ ์๋น์ค ..
RabbitMQ๋ AMQP(MQ ์คํ์์ค ํ์ค ํ๋กํ ์ฝ)์ ๊ตฌํ์ฒด ์ค ํ๋์ด์ ๋ฏธ๋ค์จ์ด ๋ธ๋ก์ปค๋ค. MSA ๊ตฌ์กฐ์์ ์๋ฒ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ด ํ์ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ฉฐ ์ง์ ํต์ ์ด ์๋ MQ๋ฅผ ๊ฑฐ์ณ ํต์ ํจ์ผ๋ก์จ ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ๋ขฐ์ฑ ์๋ ํต์ ์ ํ๊ณ ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค. kafka์ ๋นํด ๋น๊ต์ ์ ์ฉ์ด ์ฌ์ด ํธ์ด๋ฉฐ ํ์ฌ์์๋ ๋๊ท๋ชจ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ ๊ตฌ์กฐ๊ฐ ์๋์ด์ rabbitMQ๋ฅผ ์ฌ์ฉ์ค์ด๋ค. AMQP์ ๊ตฌ์ฑ ์์ Exchange : Publisher๋ก๋ถํฐ ์์ ํ ๋ฉ์์ง๋ฅผ ํ์ ๋ถ๋ฐฐํ๋ ๋ผ์ฐํฐ ์ญํ (์ฝ๊ฒ ๋งํ๋ฉด ๋ฐฐ๋ฌ์) Queue : ๋ฉ์์ง๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ ๋์คํฌ์ ์ ์ฅํ๋ค๊ฐ ์ปจ์๋จธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ์ญํ Binding : Exchange์ Queue์ ๊ด๊ณ๋ฅผ ์ ์ ๊ตฌํ์ฒด์ธ R..
Spring WebFlux๊ฐ ํฐ ํ์์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ์์๋ณด๊ณ ์ ํ๋ค. Spring MVC ์ ๊ฒฝ์ฐ์๋ DispatcherServlet ๊ธฐ๋ฐ์ผ๋ก ์์ฒญ์ ๋ฐ์ ๋ท๋จ์ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค. Spring WebFlux์ ๊ฒฝ์ฐ์๋ DispatcherServlet๊ณผ ๊ฐ์ด front controller ์ ์ญํ ์ ํด์ฃผ๋ ์น๊ตฌ๊ฐ ์กด์ฌํ๋ค. ์ผ๋จ ๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด ๋์ถฉ ๋ถ์ํด๋ณธ ๊ฒ๋ค์ ์์ฝํ์ ๋ ์๋ ๊ฐ์ ๊ทธ๋ฆผ์ด๋ค. (๊ฐ๋จํ๊ฒ ํํํด์ ์๋ต์ด ๋ง์ ์ ์๋ค.) DispatcherHandler (WebHandler์ ๊ตฌํ์ฒด) DispatcherHandler ๋ WebHandler ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ก Spring Webflux์์์ front controller ์ญํ ์ ํ๋ค. ์๋๋ DispatchHandler..
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๋ฅผ ์ํ ์คํ๋ง ๋ฐ์ดํฐ..
MDC ๋? MDC ๋ Mapped Diagnostic Context ์ ์ฝ์๋ก key์ value๋ฅผ ์ ์ฅํ๋ Map ํ์์ผ๋ก slf4j, logback, log4j ๋ฑ ๋ก๊น ํ๋ ์์ํฌ์์ ํ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค. ThreadLocal ์ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์คํธ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. (๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ๋ก๊ทธ ๋ฉ์์ง์ ๊ฐ ์ฐ๋ ๋์ ๋ํ ๋ก๊ทธ๊ฐ ์์ด๊ธฐ ๋๋ฌธ) ์์ฒญ์ด ์ด๋ค ์ฌ์ฉ์๋ก๋ถํฐ ๋ค์ด์จ ๊ฒ์ธ์ง ์ ์ฅํ๊ฑฐ๋ ์์ฒญ๋ณ๋ก ์๋ณ์๋ฅผ ๋ง๋ค์ด ํน์ ์์ฒญ์ ๋ํ ๋ก๊ทธ๋ง ์ถ์ ํ ์ ์๋ค. ์ฐธ๊ณ : ๋ก๊ทธ์์คํ #4-MDC๋ฅผ ์ด์ฉํ์ฌ ์ฐ๋ ๋๋ณ๋ก ๋ก๊ทธ ๋ถ๋ฅํ๊ธฐ MDC ์ ์ฉํ๊ธฐ Spring Framework๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด AOP๋ฅผ ์ด์ฉํด ์ฝ๊ฒ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค...
Step2 https://github.com/next-step/kotlin-blackjack/pull/528 Test Double ๋จ์ ํ ์คํธ๋ฅผ ์ํด ์์กด์ฑ ์ฃผ์ ๋ถ๋ถ์ ํ ์คํธ ๋๋ธ์ ์ฌ์ฉํด ํ ์คํธ๋ฅผ ์ข ๋ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋๋ก ๊ตฌํํ์๋ค. ๋ค๋ง, ํผ๋๋ฐฑ์ ๋ฐ์ผ๋ฉฐ Stub, Mock, Fake ๋ฑ ํ ์คํธ ๋๋ธ์ ์ข ๋ฅ์ ๋ํด ๋ช ํํ ์๊ณ ์ฌ์ฉํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค. Dummy ๋์ํ์ง ์์๋ ํ ์คํธ์๋ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฐ์ฒด๋ฅผ Dummy ๊ฐ์ฒด๋ผ๊ณ ํ๋ค. ๋จ์ ์ธ์คํด์คํํ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. Stub ํ ์คํธ์์ ํธ์ถ๋ ์์ฒญ์ ๋ํด ๋ฏธ๋ฆฌ ์ค๋นํด๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ๋ค. ์ฆ, ํ ์คํธ๋ฅผ ์ํด ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ ๊ฐ์ฒด๋ง์ ๋ฐํํ๋ค. (๊ฐ์ฒด์ ์ํ๋ฅผ ๊ฒ์ฆํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.) Mock ํธ์ถ์ ๋ํ ๊ธฐ๋๋ฅผ ๋ช ..
๋ฏธ์ ์ ์งํํ๋ฉฐ ๋ฐ์๋ ํผ๋๋ฐฑ์ ํ ๋๋ก ๋ฐฐ์ด ์ ๋ค์ ์ ์ด๋ณด๋ ค ํ๋ค. ํด๋ฆฐ์ฝ๋ ๋ฟ๋ง ์๋๋ผ ์ฝํ๋ฆฐ์ ์ข ๋ ์ฝํ๋ฆฐ์ค๋ฝ๊ฒ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ๋ง์ด ์์๊ฐ ์ ์์ด ๋งค์ฐ ์ข์ ๊ฒฝํ์ด์๋ค! Step2 https://github.com/next-step/kotlin-lotto/pull/759 ๊ฒ์ฆ๋ถ๋ ํ๋ ์ฝ๋ฉ์ ์ฌ์ฉํ์ ํ ์คํธ์ฝ๋์์ ๊ฒ์ฆ์ ์ํด ๋๋ฉ์ธ์ ์์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํด ๊ฒ์ฆ ๋ก์ง์ ์งฐ๋๋ฐ ํ ์คํธ์์๋ ์์๋ฅผ ์ง์ ํ์ฉํ๊ธฐ ๋ณด๋ค๋ ํ๋ ์ฝ๋ฉ์ ํด๋ณด๋๊ฑด ์ด๋ป๊ฒ ๋๋ ํผ๋๋ฐฑ์ ๋ฐ์๋ค. ๊ฒ์ฆ๋ถ์ ๋๋ฉ์ธ ๋ก์ง์ ์ถ๊ฐํ์ ๋์ ๋ฌธ์ ์ ์ ๋ค์๊ณผ ๊ฐ๋ค. ๋ฌด์๋ฏธํ ๊ฒ์ฆ ์ฌ์ค์ ํ๋ก๋์ ์ฝ๋๋ฅผ ๋ณต์ฌ & ๋ถ์ฌ๋ฃ๊ธฐ ํ ๊ฒ๊ณผ ๊ฐ๋ค. ๊ตฌํ ์ฝ๋์์ ๊ฐ๊ฒฐํฉ ํ๋ก๋์ ์ฝ๋์ ๊ฐ๊ฒฐํฉํ๊ฒ ๋๋ฉด ๊ฒฐ๊ณผ๋ ๋์ผํ์ง๋ง ๋ก์ง์ด ๋ณ๊ฒฝ๋๋ ๋ฆฌํฉ..
๋๋ฉ์ธ ํ๋กํผํฐ ์ ๊ทผ ์ ์ด์ 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 ์ ํต..
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ด ๋ง์ ๊ฒฝ์ฐ - ๊ธฐ์กด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๊ผญ dump ๋ ๋๊ธฐ (ํ ์ด๋ธ์ ๊ฑด๋ค๊ฒ ๋๋ค๋ฉด ๋ฌด์์ ํ๋ ๊ผญ ์ฒซ๋ฒ์งธ๋ก ํ์) - ๊ธฐ์กด ์ปฌ๋ผ(old column)์ ์ ์งํ๊ณ ์๋ก์ด ์ปฌ๋ผ(new column)์ ํจ๊ป ๋ง๋ค๊ธฐ, ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ๋ฉด ์กฐ๊ธ์ฉ ์ด์ ์ปฌ๋ผ ์ง์๋๊ฐ๊ธฐ - ์ปฌ๋ผ ๋ช๊ฐ์ ๋์ฒด๋ณด๋ค ๋ ํฐ ๊ตฌ์กฐ์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ํ์ํ๋ค๋ฉด ํ ์ด๋ธ ๋ณต์ ๋ฅผ ํตํด ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋ค๊ณ ์์ ํ ํ ์ด๋ธ์ ๊ต์ฒดํ๊ธฐ (๊ธฐ์กด ํ ์ด๋ธ์์ ์์ ํ๋ค๋ณด๋ฉด ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ ค๋ฒ๋ฆด ์ ์๋ ์ํ ์ํฉ์ ๋์ผ ์ ์๋ค..ใ ) API ์ ๋ฒ์ ๊ต์ฒด๊ฐ ํ์ํ ๊ฒฝ์ฐ - API ๊ธฐ์กด ๋ฒ์ ๋ ์ฌ์ ํ ๋์ ๊ฐ๋ฅํด์ผ ํ๋ค. ํด๋น API๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์ ์ ๋ถ ์ถ์ ํ๊ณ ๋ฐ๊พธ๋๋ก ์์ฒญํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด API๋ ๋์ ๊ฐ๋ฅ..
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๋? ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋ง, 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..
๊ธฐ์กด์ ํ๋ ๊ฒ ์ฒ๋ผ 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/..