songining
article thumbnail
[NEXTERS] NCP(Naver Cloud Platform) ์‚ฌ์šฉ ํ›„๊ธฐ
CLOUD 2024. 8. 27. 23:22

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..

article thumbnail
์ด์ง๊ณผ ์ฒซ ์ถœ๊ทผ์„ ์ค€๋น„ํ•˜๋ฉฐ
์ผ๊ธฐ ๐Ÿ‘€ 2024. 5. 30. 15:41

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

article thumbnail
๋ธŒ๋ผ์šฐ์ € ์บ์‹ฑ ์ „๋žต
WEB 2024. 1. 21. 21:29

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ, ์บ์‹œ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํ†ต์‹  ์—†์ด ์ข€ ๋” ๋น ๋ฅธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 1. cache-control ์ ์šฉ - response header์— ์บ์‹œ๊ฐ€ ์œ ํšจํ•œ ์‹œ๊ฐ„(์ดˆ)๋ฅผ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ•ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๋‹น ์‹œ๊ฐ„๋™์•ˆ ์บ์‹œ๋กœ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋„๋ก ํ•œ๋‹ค. - ์บ์‹œ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๋ฉด ๋‹ค์‹œ ๋„คํŠธ์›Œํฌ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ์‘๋‹ต์„ ๊ฐ€์ ธ์˜ค๊ณ  ๋‹ค์‹œ ์œ ํšจ์‹œ๊ฐ„๋™์•ˆ ์บ์‹œ๋กœ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค. (๊ฐฑ์‹ ) - ๋ธŒ๋ผ์šฐ์ €๋Š” cache-control ์ •๋ณด๋ฅผ ๋ฐ›์œผ๋ฉด ์„ค์ •๋œ ์‹œ๊ฐ„๋™์•ˆ ์ƒˆ๋กœ์šด ์š”์ฒญ์ด ์™€๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๋Š”๋‹ค. - ํด๋ผ์ด์–ธํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ -> ๋””์Šคํฌ ์บ์‹œ ์ˆœ..

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๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ..

Kotlin ์œ„์ž„ ํ”„๋กœํผํ‹ฐ Observable
Language/Kotlin 2023. 9. 5. 21:20

์ฝ”ํ‹€๋ฆฐ์€ ํ”„๋กœํผํ‹ฐ ์œ„์ž„ ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ํ”„๋กœํผํ‹ฐ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ฐ˜์ ์ธ ํ”„๋กœํผํ‹ฐ์˜ ํ–‰์œ„๋ฅผ ์ถ”์ถœํ•ด์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 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..

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๋„ ๋™์ž‘ ๊ฐ€๋Šฅ..