๐ซ Language/Java
Intro ๋ถ๋ณ ๊ฐ์ฒด๋ ๊ฐ์ฒด ์์ฑ ์ดํ, ๋ด๋ถ์ ์ํ๊ฐ ๋ณํ์ง ์๋ ๊ฐ์ฒด์ด๋ค. ๋ง์ ์ฑ
์ด๋ ๋ธ๋ก๊ทธ ๊ธ์์ ์ด๋ฌํ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์๋ ํฐ ์ด์ ์ด ์๋ค๊ณ ํ๋ค. ๊ทธ ์ด์ ๋ ๊ต์ฅํ ๋ค์ํ๊ณ ๋ง์ผ๋ฉฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ์ด ์ข๋ค. ๋ค์์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ๋์ดํ ๊ฒ์ด๋ค. Thread Safe ํ์ฌ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ ์ฉํ๊ณ , ๋๊ธฐํ๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค. ์คํจ ์์์ ์ธ(Failure Atomic) ๋ฉ์๋๋ฅผ ๋ง๋ค ์ ์๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฉ์๋ ํธ์ถ ์ด์ ์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ด๋ค. Cache๋ Map, Set๋ฑ์ ์์๋ก ํ์ฉํ๊ธฐ ์ข๋ค. ๋ถ์ ํจ๊ณผ(Side Effect)๋ฅผ ํผํด ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ถ ์ ์๋ค. ์์ ํจ์๋ค๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ, ๊ฐ์ฒด์ ์ํ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฐ..
๐ซ Language/Java
SOLID ์์น์ด๋? ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์์ด ๋ฐ๋์ ์์์ผ ํ๋ SOLID ์์น์ ์๊ธฐ ์์ ํด๋์ค ๋ด๋ถ์ ์์ง๋๋ ๋์ด๊ณ , ํ ํด๋์ค์์ ๊ฒฐํฉ๋๋ ๋ฎ์ถ๋ ๊ฒ์ ์ด์ ์ ๋๋ค. ์ด๋ ํด๋์ค์๊ฒ ๋
๋ฆฝ๋ ์ญํ ์ ๋ถ์ฌํ๊ธฐ ์ํจ์ด๋ฉฐ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๐ฒ SRP(Single Responsibility Principle) : ๋จ์ผ ์ฑ
์ ์์น - ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ ์ด์ ๊ฐ ๋จ ํ ๊ฐ์ง์ฌ์ผ ํ๋ค ๐ฒ OCP(Open Close Principle) : ๊ฐ๋ฐฉ/ํ์ ์์น - ํ์ฅ์๋ ์ด๋ ค์๊ณ , ์์ ์ ๋ํด์๋ ๋ซํ์์ด์ผ ํ๋ค. ๐ฒ LSP(Liskov Substitution Principle) : ๋ฆฌ์ค์ฝํ ์นํ ์์น - ํ์ ํ์
์ ์์ ํ์
์ผ๋ก ๋์ฒดํ ์ ์์ด์ผ ํ๋ค ๐ฒ ISP..
๐ซ Language/Java
์ผ๊ธ ์ปฌ๋ ์
์ด๋(First Class Collection) ๐ฒ ์ผ๊ธ ์ปฌ๋ ์
: Collection์ Wrappingํ๋ฉด์, ๊ทธ ์ธ ๋ค๋ฅธ ๋ฉค๋ฒ ๋ณ์๋ ์๋ ์ํ๋ฅผ ๋งํ๋ค. public class GameRanking { private Map ranks; public GameRanking(Map ranks) { this.ranks = ranks; } } ์ผ๊ธ ์ปฌ๋ ์
์ ์ฅ์ ๐ถ ๋น์ฆ๋์ค์ ์ข
์์ ์ธ ์๋ฃ๊ตฌ์กฐ ์ผ๋ฐ์ ์ผ๋ก MVC ํจํด์์ Model์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํธ์์ฉ์ด๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๊ณ ๋ํ๋จ์ ๋ฐ๋ผ Model์์ Service ๊ณ์ธต์ ์ถ๊ฐํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ์ฝ๋์์ ํน์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ผ ..
๐ซ Language/Java
JUnit์ด๋? ๐ฒ Java ๊ฐ๋ฐ์์ 93%๊ฐ ์ฌ์ฉํ๋ ๋จ์ ํ
์คํธ ํ๋ ์์ํฌ ๐ฒ ์คํ๋ง ๋ถํธ 2.2๋ฒ์ ์ด์๋ถํฐ ๊ธฐ๋ณธ ์ ๊ณตํ๋ค. JUnit5๋? ๐ฒ Platform : ํ
์คํธ๋ฅผ ์คํํ๊ฒ ํด์ฃผ๋ ๋ฐ์ฒ๋ฅผ ์ ๊ณตํ๋ค. TestEngine API๋ฅผ ์ ๊ณต. ๐ฒ Jupiter : JUnit5๋ฅผ ์ง์ํ๋ TestEngine API ๊ตฌํ์ฒด ๐ฒ Vintage : JUnit4์ 3๋ฅผ ์ง์ํ๋ TestEngine ๊ตฌํ์ฒด JUnit5๋ฅผ ์์ํ๋ ๋ฐฉ๋ฒ ๐ฒ ์คํ๋ง๋ถํธ 2.2๋ฒ์ ์ด์๋ถํฐ๋ ๊ธฐ๋ณธ ํ์ฌ๋๋ค. ๐ฒ ๊ทธ ์ธ์๋ maven, ํน์ gradle ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ ์ ์๋ค. gradle test { useJUnitPlatform() } dependencies { testImplementation 'org.junit.jupiter..
๐ซ Language/Java
๊ณต์ ์์๊ณผ ์๊ณ์์ญ ๐ฒ ๊ณต์ ์์ : ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ ์ ์๋ ์์ ๐ฒ ์๊ณ ์์ญ : ๊ณต์ ์์๋ค ์ค ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ ๊ทผํ์ ๋, ๋ฌธ์ ๊ฐ ์๊ธธ๋งํ ๋ถ๋ถ ๐ถ๊ฒฝ์ ์ํ? ๋ ์ด์์ ์ค๋ ๋๊ฐ ๊ณต์ ์์์ ๋ณํ์ ์ผ๋ก ์ฝ๊ฑฐ๋ ์ธ๋, ํ์ด๋ฐ์ด๋ ์ ๊ทผ ์์์ ๋ฐ๋ผ ์คํ ์์๊ฐ ๋ฌ๋ผ์ง๋ ์ํฉ(race ํ์) ๐ถRead - Modify - Write @RestController @RequestMapping("/race-condition") public class RaceConditionCotroller { public static Integer studentCount = 0; @PostMapping("/1/increase") public ResponseEntity increaseCount() { stud..
๐ซ Language/Java
๋๊ธฐ/๋น๋๊ธฐ๋? ๐ถ๋๊ธฐ๋(Synchronize)? ๐ฒ ์์ฒญ ์์
์ ๋ํ ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ ธ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋งํ๋ค. ๐ถ๋น๋๊ธฐ๋(Asynchronize)? ๐ฒ ์์ฒญ ์์
์ ๋ํด ์๋ฃ ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์์, ์์ ์ ์์
์ ๊ทธ๋๋ก ์คํํ๋ค. ๋๊ธฐ์ ๋น๋๊ธฐ์ ํฐ ์ฐจ์ด์ ์ค ํ๋๋ ์์ฒญํ ์์
์ ๋ํด์ ์์
์์๊ฐ ์ง์ผ์ง๋, ์ง์ผ์ง์ง ์๋์ด๋ค. ๋๊ธฐ๋ ์์
์์๊ฐ ์ง์ผ์ง๊ธฐ ๋๋ฌธ์ A, B, C๋ผ๋ Task์ ๋ํด ๊ทธ ์์๋ฅผ ์งํค๋ฉฐ ์คํ๋์ง๋ง, ๋น๋๊ธฐ๋ ๊ทธ๋ ์ง ์๋ค. ๋ฌด์์๋ก ์คํ๋ ์ ์๋ ๊ฒ์ด๋ค. ๋ธ๋ญํน/๋
ผ๋ธ๋ญํน์ด๋? ๐ถ ๋ธ๋ญํน์ด๋? ๐ฒ ๋ค๋ฅธ ์์ฒญ์ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์
์ Block(์ฐจ๋จ)ํ๋ ๊ฒ ๐ถ ๋
ผ๋ธ๋ญํน์ด๋? ๐ฒ ๋ค๋ฅธ ์์ฒญ์ ์์
์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์
์ Block(์ฐจ๋จ)ํ์ง ์๋ ๊ฒ ๐ค..