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

Use gradlew, not gradle !

Gradle Wrapper : gradlew [๊ทธ๋ž˜๋“ค๋ฅ˜] ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ์šด ํ™˜๊ฒฝ์— ์„ค์น˜ํ•  ๋•Œ ๋ณ„๋„ ์„ค์น˜, ์„ค์ • ๊ณผ์ •์—†์ด ๋ฐ”๋กœ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ํ™˜๊ฒฝ์— ์ข…์†๋˜์ง€ ์•Š๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ์Œ gradle ์„ค์น˜ ํ•„์š” ์—†์Œ, gradle, java ๋ฒ„์ „ ์ƒ๊ด€ ์—†์Œ ๊ณต์‹๋ฌธ์„œ์—์„œ ์ ๊ทน ์‚ฌ์šฉ ๊ถŒ์žฅ ๋ฏธ๋ฆฌ ์„ ์–ธ ๋œ ๋ฒ„์ „์˜ Gradle์„ ํ˜ธ์ถœํ•˜์—ฌ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ $ gradle wrapper $ gradle wrapper BUILD SUCCESSFUL in 545ms 1 actionable task: 1 executed $ tree . โ”œโ”€โ”€ gradle โ”‚ โ””โ”€โ”€ wrapper โ”‚ โ”œโ”€โ”€ gradle-wrapper.jar โ”‚ โ””โ”€โ”€ gradle-wrapper.propertie..

BE/Spring 2022.01.20

๋ถ€์ž ์•„๋น  ๊ฐ€๋‚œํ•œ ์•„๋น 

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

Life/๋…์„œ 2022.01.01

[Git] fatal: Authentication failed ํ•ด๊ฒฐ๋ฒ•

๋ฌธ์ œ์ƒํ™ฉ remote: Invalid username or password. fatal: Authentication failed for '~~~~' ์›์ธ ํ•ด๋‹น ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ ‘๊ทผ ์•„์ด๋””์˜ ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•: ๋กœ๊ทธ์ธ ์ •๋ณด ๊ฐฑ์‹  > git config credential.helper store > git fetch Username for '~~~~': your-id Password for '~~~~': your-password

Programming 2021.10.25

java์—์„œ Kotlin ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

package level function org.example.AppKt์ž๋ฐ” ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋‚ด๋ถ€ static method ๋กœ ์ปดํŒŒ์ผ ๋จ. AppKt : ํŒŒ์ผ๋ช… // app.kt package org.example class Util fun getTime() { /*...*/ } // Java new org.example.Util(); org.example.AppKt.getTime(); @file:JvmName("DemoUtils"): ์ƒ์„ฑ๋  Java ํด๋ž˜์Šค ๋ช…์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ @file:JvmName("DemoUtils") package org.example class Util fun getTime() { /*...*/ } // Java new org.example.Util(); org.exa..

Programming 2021.06.17

[DDD Start!] 3. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ์„ ์ดํ•ดํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ๋‹จ์œ„๋กœ ๋งŒ๋“ค๋ ค๋ฉด ์ƒ์œ„ ์ˆ˜์ค€์—์„œ ๋ชจ๋ธ์„ ์กฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•จ ์ผ๊ด€์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ค€์ด ๋จ. ๋ณต์žก๋„๊ฐ€ ๋‚ฎ์•„์ง€๋Š” ๋งŒํผ ๋„๋ฉ”์ธ ๊ธฐ๋Šฅ์„ ํ™•์žฅ/๋ณ€๊ฒฝํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋…ธ๋ ฅ์ด ์ค„์–ด๋“ฌ. ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ๋…๋ฆฝ๋œ ๊ฐ์ฒด ๊ตฐ ํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•œ ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ์— ์†ํ•˜์ง€ ์•Š์Œ. ๊ฐ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ์ž๊ธฐ์ž์‹ ์„ ๊ด€๋ฆฌํ•  ๋ฟ ๋‹ค๋ฅธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š์Œ ๊ฒฝ๊ณ„ ์„ค์ • ์„ค์ • ๊ธฐ์ค€: ๋„๋ฉ”์ธ ๊ทœ์น™ & ์š”๊ตฌ์‚ฌํ•ญ A๊ฐ€ B๋ฅผ ๊ฐ–๋Š”๋‹ค (์ƒํ’ˆ-๋ฆฌ๋ทฐ) ≠> A B ๊ฐ€ ํ•œ ์• ๊ทธ๋ฆฌํ„ฐ๊ทธ์— ์†ํ•œ๋‹ค ํ•จ๊ป˜ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ ๋ณ€๊ฒฝํ•˜๋Š” ์ฃผ์ฒด๋„ ๋‹ค๋ฆ„ B์˜ ๋ณ€๊ฒฝ์ด A์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Œ → ๋‹ค์ˆ˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๊ฐ€ ํ•œ๊ฐœ์˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋งŒ ๊ฐ–๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋‘๊ฐœ ์ด์ƒ์˜ ์—”ํ‹ฐํ‹ฐ๋กœ ๊ตฌ์„ฑ๋˜๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋Š” ๋“œ..

BE/DDD 2021.06.09

[DDD Start!] 2. ์•„ํ‚คํ…์ณ ๊ฐœ์š”

์•„ํ‚คํ…์ณ 1. ํ‘œํ˜„ ( = UI ์˜์—ญ) ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์‘์šฉ ์˜์—ญ์— ์ „๋‹ฌํ•˜๊ณ , ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ•  ex. ์›น ์–ดํ”Œ๋ฆฌ์ผ€์…˜ ์Šคํ”„๋ง MVC ํ”„๋ ˆ์ž„์›Œํฌ ํ‘œํ˜„ ์˜์—ญ์˜ ์‚ฌ์šฉ์ž๋Š” ์›น๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ or REST API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์™ธ๋ถ€ ์‹œ์Šคํ…œ ์ปจํŠธ๋กค๋Ÿฌ ๋ ˆ์ด์–ด 2. ์‘์šฉ ์‹œ์Šคํ…œ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•ด์•ผํ•  ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ - ๋„๋ฉ”์ธ ์˜์—ญ์˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉ ๋กœ์ง์„ ์ง์ ‘ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๋กœ์ง ์ˆ˜ํ–‰์„ ์œ„์ž„ ์„œ๋น„์Šค ๋ ˆ์ด์–ด 3. ๋„๋ฉ”์ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ(์—”ํ‹ฐํ‹ฐ์™€ ๋ฐธ๋ฅ˜)์„ ๊ตฌํ˜„ ๋„๋ฉ”์ธ์˜ ํ•ต์‹ฌ ๋กœ์ง์„ ๋„๋ฉ”์ธ ๋ชจ๋ธ์— ๊ตฌํ˜„ 4. ์ธํ”„๋ผ ์ŠคํŠธ๋Ÿญ์ณ ๊ตฌํ˜„ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๊ฒƒ์„ ๋‹ค๋ฃธ. ex. DB ์—ฐ๋™ ์ฒ˜๋ฆฌ, ๋ฉ”์‹œ์ง• ํ ์ „์†ก/์ˆ˜์‹  ๊ธฐ๋Šฅ, SMTP๋ฅผ ์ด์šฉํ•œ ๋ฉ”์ผ ๋ฐœ์†ก ๊ธฐ๋Šฅ ๋„๋ฉ”์ธ์˜ ๋ณต์žก๋„์— ๋”ฐ๋ผ ์‘์šฉ/๋„๋ฉ”์ธ ..

BE/DDD 2021.06.07

[DDD Start!] 1. ๋„๋ฉ”์ธ ๋ชจ๋ธ ์‹œ์ž‘

๋„๋ฉ”์ธ ๋„๋ฉ”์ธ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ œ ์˜์—ญ ๋„๋ฉ”์ธ์€ ์—ฌ๋Ÿฌ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ๊ตฌ์„ฑ ํ•œ ํ•˜์œ„ ๋„๋ฉ”์ธ์€ ๋‹ค๋ฅธ ํ•˜์œ„ ๋„๋ฉ”์ธ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์™„์ „ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณต ๋„๋ฉ”์ธ์˜ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์ž์ฒด์‹œ์Šคํ…œ์œผ๋กœ ๊ตฌํ˜„, ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์™ธ๋ถ€ ์—…์ฒด์˜ ์‹œ์Šคํ…œ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Œ ๋„๋ฉ”์ธ ๊ตฌ์„ฑ์€ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง ๋„๋ฉ”์ธ ๋ชจ๋ธ(๊ฐœ๋… ๋ชจ๋ธ) ์ •์˜ ํŠน์ • ๋„๋ฉ”์ธ์„ ๊ฐœ๋…์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ ๋„๋ฉ”์ธ ์ž์ฒด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋… ๋ชจ๋ธ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ด€๊ณ„์ž๋“ค์ด ๋™์ผํ•œ ๋ชจ์Šต์œผ๋กœ ๋„๋ฉ”์ธ์„ ์ดํ•ดํ•˜๊ณ , ๋„๋ฉ”์ธ ์ง€์‹์„ ๊ณต์œ ํ•˜๋Š”๋ฐ ๋„์›€์ด ๋จ ์ข…๋ฅ˜ ⇒ ํ‘œํ˜„๋ฐฉ์‹์€ ๋„๋ฉ”์ธ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋„์›€์ด ๋œ๋‹ค๋ฉด ๋ฌด์—‡์ด๋“  ์‚ฌ์šฉ ๊ฐ€๋Šฅ UML ํ‘œ๊ธฐ๋ฒ• ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ๋„๋ฉ”์ธ ๋ชจ๋ธ (ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ) ๋„๋ฉ”์ธ์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ + ๋„๋ฉ”์ธ์˜ ์ฃผ์š” ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ ๊ธฐ๋ฐ˜ ๋„๋ฉ”์ธ..

BE/DDD 2021.06.07

๊ฐ์ฒด์ง€ํ–ฅ 5๋Œ€์›์น™ SOLID

๊ฐ์ฒด์ง€ํ–ฅ 5๋Œ€์›์น™ SOLID Single Responsibility Principle Open CLosed Principle Liskov Substitution Principle Interface Segregation Principle Dependency Inversion Principle SRP Single Responsibility Principle ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๋ถ€ํ’ˆ(ํด๋ž˜์Šค,ํ•จ์ˆ˜ ๋“ฑ)์€ ๋‹จ ํ•˜๋‚˜์˜ ์ฑ…์ž„(๊ธฐ๋Šฅ)๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค → ์‘์ง‘๋„๋Š” ๋†’๊ณ , ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ๊ฒŒ OCP Open CLosed Principle ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€/์ˆ˜์ • ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค. ex. ์ธํ„ฐํŽ˜์ด์Šค LSP Liskov Substitution Principle ๋ฆฌ์Šค์ฝ”ํ”„ ..

BE/Spring 2021.05.20

[Cluster Architecture] Kubernetes Architecture

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‹ค์ด์–ด๊ทธ๋žจ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ตฌ์„ฑ ๋‹จ์œ„ ๐Ÿ’ก (Cluster: Namespace set) > Node > Pod > Conainer Cluster ํด๋Ÿฌ์Šคํ„ฐ Node์˜ ์ง‘ํ•ฉ Namespace ๋„ค์ž„์ŠคํŽ˜์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์˜ ๊ฐ€์ƒ ํด๋Ÿฌ์Šคํ„ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค์˜ ๊ตฌ๋ถ„ ์šฉ๋„๋กœ ์‚ฌ์šฉ Node ๋…ธ๋“œ ์ปจํ…Œ์ด๋„ˆํ™”๋œ Application์„ ์‹คํ–‰ํ•˜๋Š” ์›Œ์ปค ๋จธ์‹  ์›Œ์ปค ๋…ธ๋“œ๋Š” Application์˜ ๊ตฌ์„ฑ์š”์†Œ์ธ Pod์„ ํ˜ธ์ŠคํŠธํ•จ ์›Œ์ปค๋…ธ๋“œ์™€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด Pod์„ ๊ด€๋ฆฌ Pod ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ ์ง‘ํ•ฉ ๊ฒฐํ•ฉ์ด ๊ฐ•ํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ Pod๋กœ ๋ฌถ์–ด ์ผ๊ด„ ๋ฐฐํฌ (ex. spring webapp + nginx) Container ์ปจํ…Œ์ด๋„ˆ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜ ๐Ÿ•น Control Plane Component (Master Node) M..

BE/Kubernetes 2021.03.20