ํ์ฌ์์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ ์ต์ํด์ง๋ค๋ณด๋ฉด ์ ์ ์ํคํ ์ฒ๋ฅผ ๋ฐ๋ผ๋ณด๋ ๊ด์ ์ด ์จ์ ํ ์ต์ํ ๋ฐฉ์์ ๋ฐ๋ผ ๊ฐ๊ฒ ๋๋ ๊ฒ ๊ฐ์์ ๊ณ์ธตํ ์ํคํ ์ฒ์ ๋ํ ๊ฐ์ธ์ ์ธ ์๊ฐ์ ํ๋ฒ ๋ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค. Fat Service ์ง์ํ๊ธฐ๊ฐ์ฒด์งํฅ์์น์ ๋ฐ๋ฅด๋ฉฐ ๊ณ์ธตํ ์ํคํ ์ฒ๋ก ์์คํ ์ ๊ตฌ์ฑํ ๋, ์๋น์ค๊ฐ ๋ณต์กํด์ง๋ฉด ๋ณต์กํด์ง์๋ก ๊ณ ๋ฏผํด์ผํ ๋ถ๋ถ๋ค์ด ๋ง์์ง๋ค. ๋๋ ๋ณดํต ๊ตฌ์ฑํ ๋ presentation, application, domain, infrastructure๋ก ๋๋๊ณค ํ๋๋ฐ,์ฌ๊ธฐ์ application(service) ๊ณผ domain ์ DDD ๊ด์ ์์ ๋๋ฉ์ธ ๋ ์ด์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.์๋ฅผ ๋ค์ด, MemberService๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ํ์๊ฐ์ , ์ด๋ฉ์ผ ๋ณ๊ฒฝ, ํด๋ฉด ๊ณ์ ์ ํ ๋ฑ member์ ๊ด๋ จ๋ ๋ชจ๋ ์๋น์ค ..

NEXTERS ๋์๋ฆฌ์ ์ฐธ์ฌํ๋ฉฐ NCP๋ฅผ ์ฒ์์ผ๋ก ์ฌ์ฉํด๋ณด๊ฒ ๋์๋ค.https://github.com/Nexters/goalpanzi-backend GitHub - Nexters/goalpanzi-backendContribute to Nexters/goalpanzi-backend development by creating an account on GitHub.github.com ์น๊ตฌ์ ํจ๊ป ๊ฒฝ์ํ๋ ๋ชฉํ ๋ฌ์ฑ ์ฑ [๋ฏธ์ ๋ฉ์ดํธ] ๋ฅผ ์ถ์ํ๋ฉด์ ์ฌ์ฉํ ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.- Object Storage : ์ด๋ฏธ์ง ์ ์ฅ- Server(VPC) : ์๋ฒ- Container Registry : docker image ์ ์ฅ์ (CD ํ์ดํ๋ผ์ธ ์ฐ๋)- Cloud Insight : ๋ชจ๋ํฐ๋ง * ๊ด๋ฆฌํ DB (Clo..

์ด์ง์ฒซ ํ์ฌ์์ ์ธํด์ ํฌํจํด ์ฝ 2๋ ๊ฐ์ ๊ทผ๋ฌด๋ฅผ ๋ง์น๊ณ ์๋ก์ด ํ์ฌ๋ก ์ด์ง์ ํ๊ฒ ๋์๋ค. ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ปค๋ฆฌ์ด๋ฅผ ์์ํ๊ฒ ํด์ค ์ฒซ ํ์ฌ์๊ณ ์์ ๋ก์ด ์กฐ์ง ๋ฌธํ์ ์ข์ ํ์๋ค์ด ์์๊ธฐ์ ์ฆ๊ฒ๊ฒ ๋ค๋ ํ์ฌ์๋ค. ์ธํด์ ํ๋ฉฐ ๋ถ์กฑํ ๊ฒ ๋ง์ ์ํ์์ ์์ํ์ง๋ง ์ผ๋จ ์์ํ๊ณ ๋ถ๋ช์น๋ฉฐ ๋ถ์กฑํ ๋ถ๋ถ์ ๋น ๋ฅด๊ฒ ์ฑ์ฐ๊ณ ํ์ ๋์์ด ๋๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ค. ๋ค๋ฅธ ์ฌ๋๋ณด๋ค ์ดํด ์๋๊ฐ ๋น ๋ฅด์ง ์๊ณ ๋ฌด์์ด๋ ๊ฒฝํํด๋ณด๋ฉด์ ์ง์ ๋๋ผ๊ณ ๋ฐฐ์ฐ๋๊ฒ ๋ง์ ํธ์ด๋ผ ํ๋ ํ๋์ ๊ฒฝํ์ด ์ ๋ถ ์์คํ๋ค. ์ง๊ธ ์๊ฐํด๋ณด๋ฉด ๋ถ์กฑํ ๋ถ๋ถ์ด ๋๋ฌ๋์ง ์๋๋ก ๊ฐ์ธ์ ์ผ๋ก ๊พธ์คํ ๊ณต๋ถํ๊ณ ์ ๊ทน์ ์ผ๋ก ์ ๋ฌด์ ์ํ๋๊ฒ ๋ง์ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค. ๊ธธ์ง ์์ ์๊ฐ ํจ๊ปํ์์๋ ๋ถ๊ตฌํ๊ณ ์์ ์ ์ผ์ฒ๋ผ ์ถํํด์ฃผ๊ณ ์๋ก์ด ์ถ๋ฐ์ ์์ํด์ค ํ์๋ค์๊ฒ ..

์น ๋ธ๋ผ์ฐ์ ์์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๋, ์บ์๊ฐ ์์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋๋ผ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์์ผ ํ๋ค. ์บ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ๋คํธ์ํฌ ํต์ ์์ด ์ข ๋ ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ํ ์ ์๋ค. ๋ธ๋ผ์ฐ์ ์บ์๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ 1. cache-control ์ ์ฉ - response header์ ์บ์๊ฐ ์ ํจํ ์๊ฐ(์ด)๋ฅผ ํจ๊ป ๋ฐํํด ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ์๊ฐ๋์ ์บ์๋ก ์๋ต ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋๋ก ํ๋ค. - ์บ์ ์๊ฐ์ด ์ด๊ณผ๋๋ฉด ๋ค์ ๋คํธ์ํฌ๋ก ์์ฒญ์ ๋ณด๋ด ์๋ต์ ๊ฐ์ ธ์ค๊ณ ๋ค์ ์ ํจ์๊ฐ๋์ ์บ์๋ก ์ ์ฅํ๊ฒ ๋๋ค. (๊ฐฑ์ ) - ๋ธ๋ผ์ฐ์ ๋ cache-control ์ ๋ณด๋ฅผ ๋ฐ์ผ๋ฉด ์ค์ ๋ ์๊ฐ๋์ ์๋ก์ด ์์ฒญ์ด ์๋ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ์ง ์๋๋ค. - ํด๋ผ์ด์ธํธ์ ๋ฉ๋ชจ๋ฆฌ ์บ์ -> ๋์คํฌ ์บ์ ์..

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๋ฅผ ์ํ ์คํ๋ง ๋ฐ์ดํฐ..
์ฝํ๋ฆฐ์ ํ๋กํผํฐ ์์ ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ๋กํผํฐ ์์์ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ ํ์๋ฅผ ์ถ์ถํด์ ์ฌ์ฌ์ฉํ ์ ์๋ค. Observable ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์์ ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ callback์ผ๋ก ์ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. Delegates.observable ํจ์๋ฅผ ๋ณด๋ฉด 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ผ๋ฉฐ ์ด๊ธฐ๊ฐ๊ณผ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์ (onChange) ๋ก ์ด์ฐ๋ฌ์ ธ์๋ค. public inline fun observable(initialValue: T, crossinline onChange: (property: KProperty, oldValue: T, newValue: T) -> Unit): ReadWriteProperty = object : ObservableProperty(i..

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 ์ ํต..