๐Ÿ’ซ Language/Java

๐Ÿ’ซ Language/Java

[Java] ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๋ถˆ๋ณ€ ๊ฐ์ฒด์—ฌ์•ผ ํ• ๊นŒ?

Intro ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ž€ ๊ฐ์ฒด ์ƒ์„ฑ ์ดํ›„, ๋‚ด๋ถ€์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์ด๋‹ค. ๋งŽ์€ ์ฑ…์ด๋‚˜ ๋ธ”๋กœ๊ทธ ๊ธ€์—์„œ ์ด๋Ÿฌํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋Š” ํฐ ์ด์ ์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•˜๊ณ  ๋งŽ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹ค์Œ์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ๋‚˜์—ดํ•œ ๊ฒƒ์ด๋‹ค. Thread Safe ํ•˜์—ฌ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์œ ์šฉํ•˜๊ณ , ๋™๊ธฐํ™”๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์‹คํŒจ ์›์ž์ ์ธ(Failure Atomic) ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์ด์ „์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Cache๋‚˜ Map, Set๋“ฑ์˜ ์š”์†Œ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์ข‹๋‹ค. ๋ถ€์ˆ˜ ํšจ๊ณผ(Side Effect)๋ฅผ ํ”ผํ•ด ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ์„ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋“ค๋กœ ๊ตฌ์„ฑ๋˜์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด์˜ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ€..

๐Ÿ’ซ Language/Java

[Java] ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„ 5์›์น™(SOLID)์ด๋ž€?

SOLID ์›์น™์ด๋ž€? ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์žˆ์–ด ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•˜๋Š” SOLID ์›์น™์€ ์ž๊ธฐ ์ž์‹  ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ ์‘์ง‘๋„๋Š” ๋†’์ด๊ณ , ํƒ€ ํด๋ž˜์Šค์™€์˜ ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์ถ”๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋‘”๋‹ค. ์ด๋Š” ํด๋ž˜์Šค์—๊ฒŒ ๋…๋ฆฝ๋œ ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฉฐ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๐Ÿ”ฒ SRP(Single Responsibility Principle) : ๋‹จ์ผ ์ฑ…์ž„ ์›์น™ - ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ด์œ ๊ฐ€ ๋‹จ ํ•œ ๊ฐ€์ง€์—ฌ์•ผ ํ•œ๋‹ค ๐Ÿ”ฒ OCP(Open Close Principle) : ๊ฐœ๋ฐฉ/ํ์‡„ ์›์น™ - ํ™•์žฅ์—๋Š” ์—ด๋ ค์žˆ๊ณ , ์ˆ˜์ •์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ซํ˜€์žˆ์–ด์•ผ ํ•œ๋‹ค. ๐Ÿ”ฒ LSP(Liskov Substitution Principle) : ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™ - ํ•˜์œ„ ํƒ€์ž…์„ ์ƒ์œ„ ํƒ€์ž…์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค ๐Ÿ”ฒ ISP..

๐Ÿ’ซ Language/Java

[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

[Java] JUnit5 ์‚ฌ์šฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

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

[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

[Java] ๋™๊ธฐ/๋น„๋™๊ธฐ & ๋ธ”๋Ÿญํ‚น/๋…ผ๋ธ”๋Ÿญํ‚น์ด๋ž€?

๋™๊ธฐ/๋น„๋™๊ธฐ๋ž€? ๐Ÿ”ถ๋™๊ธฐ๋ž€(Synchronize)? ๐Ÿ”ฒ ์š”์ฒญ ์ž‘์—…์— ๋Œ€ํ•œ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ ธ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ๐Ÿ”ถ๋น„๋™๊ธฐ๋ž€(Asynchronize)? ๐Ÿ”ฒ ์š”์ฒญ ์ž‘์—…์— ๋Œ€ํ•ด ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ๋”ฐ์ง€์ง€ ์•Š์•„, ์ž์‹ ์˜ ์ž‘์—…์„ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค. ๋™๊ธฐ์™€ ๋น„๋™๊ธฐ์˜ ํฐ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•ด์„œ ์ž‘์—… ์ˆœ์„œ๊ฐ€ ์ง€์ผœ์ง€๋ƒ, ์ง€์ผœ์ง€์ง€ ์•Š๋ƒ์ด๋‹ค. ๋™๊ธฐ๋Š” ์ž‘์—… ์ˆœ์„œ๊ฐ€ ์ง€์ผœ์ง€๊ธฐ ๋•Œ๋ฌธ์— A, B, C๋ผ๋Š” Task์— ๋Œ€ํ•ด ๊ทธ ์ˆœ์„œ๋ฅผ ์ง€ํ‚ค๋ฉฐ ์‹คํ–‰๋˜์ง€๋งŒ, ๋น„๋™๊ธฐ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๋ฌด์ž‘์œ„๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋ธ”๋Ÿญํ‚น/๋…ผ๋ธ”๋Ÿญํ‚น์ด๋ž€? ๐Ÿ”ถ ๋ธ”๋Ÿญํ‚น์ด๋ž€? ๐Ÿ”ฒ ๋‹ค๋ฅธ ์š”์ฒญ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ž‘์—…์„ Block(์ฐจ๋‹จ)ํ•˜๋Š” ๊ฒƒ ๐Ÿ”ถ ๋…ผ๋ธ”๋Ÿญํ‚น์ด๋ž€? ๐Ÿ”ฒ ๋‹ค๋ฅธ ์š”์ฒญ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ž‘์—…์„ Block(์ฐจ๋‹จ)ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๐Ÿค”..

TIlearn
'๐Ÿ’ซ Language/Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก