πŸ“œ CleanCode 24

[CleanCode]μ‹œμŠ€ν…œ 2

ν™•μž₯: 관심사λ₯Ό 적절히 뢄리해 관리 ν•œλ‹€λ©΄μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜λŠ” μ μ§„μ μœΌλ‘œ λ°œμ „ν•  수 μžˆλ‹€.μ²˜μŒλΆ€ν„° μ‹œμŠ€ν…œμ— λ§žλŠ” 규λͺ¨μ˜ μ„€κ³„λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.였늘 주어진 μ‚¬μš©μžμ˜ μš”κ΅¬μ‚¬ν•­μ— 맞좰 μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.→ 이것이 반볡/점진적인 μ• μžμΌ λ°©μ‹μ˜ 핡심이닀.ν…ŒμŠ€νŠΈ 주도 개발 TDD, λ¦¬νŒ©ν„°λ§μœΌλ‘œ λ§Œλ“€μ–΄μ§„ κΉ¨λ—ν•œ μ½”λ“œμ—μ„  μ‹œμŠ€ν…œμ„ ν™•μž₯ν•˜κΈ° 쉽닀.μ±…μ—μ„œλŠ” 관심사λ₯Ό 잘 λΆ„λ¦¬ν•˜μ§€ λͺ»ν•œ μ‚¬λ‘€λ‘œEJB 1, 2 ν”„λ ˆμž„μ›Œν¬λ₯Ό μ˜ˆμ‹œλ₯Ό λ“€κ³ μžˆλ‹€. νš‘단cross-cutting 관심사: 핡심 κΈ°λŠ₯을 κ°€λ‘œμ§€λ₯΄λŠ” κΈ°λŠ₯.관점 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(AOP, Aspect-Oriented Programing)λŠ” νš‘λ‹¨ 관심사에 λŒ€μ²˜ν•΄ λͺ¨λ“ˆμ„±μ„ ν™•λ³΄ν•˜λŠ” 일반적인 방법둠이닀.AOPμ—₯μ„œ 관점aspectμ—μ„œ λͺ¨λ“ˆ ꡬ성 κ°œλ…→ "νŠΉμ • 관심사λ₯Ό μ§€μ›ν•˜λ €λ©΄ μ‹œμŠ€ν…œμ—..

πŸ“œ CleanCode 2024.10.10

[CleanCode]μ‹œμŠ€ν…œ 1

κ²Œμ‹œκΈ€μ— λ“€μ–΄κ°€κΈ° μ „ 미리 λ§ν•˜μžλ©΄ μ‹œμŠ€ν…œ 파트의 결둠은 도ꡬλ₯Ό μ‚¬μš©ν•˜μžλ‘œ 끝이 λ‚©λ‹ˆλ‹€.spring framework와 DSLλ₯Ό μ‚¬μš©μ„ ꢌμž₯ν•˜λŠ” κ±Έλ‘œμš”.κ·ΈλŸΌμ—λ„ μ™œ 거의 λͺ¨λ‘κ°€ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜λŠ” 지에 λŒ€ν•΄, λ°œμ „ 과정을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.μ†Œν”„νŠΈμ›¨μ–΄ μ œμž‘μ€ λ„μ‹œκ±΄μ„€κ³Ό κ°™λ‹€μ œμž‘construction은 μ‚¬μš©useκ³Ό μ•„μ£Ό λ‹€λ₯΄λ‹€.μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œμ€ (μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 객체λ₯Ό μ œμž‘ν•˜κ³  μ˜μ‘΄μ„±μ„ μ„œλ‘œ 'μ—°κ²°'ν•˜λŠ”) μ€€λΉ„κ³Όμ •κ³Ό(μ€€λΉ„ κ³Όμ • 이후에 μ΄μ–΄μ§€λŠ”) λŸ°νƒ€μž„ λ‘œμ§μ„ 뢄리해야 ν•œλ‹€.관심사 λΆ„λ¦¬λŠ” 우리 λΆ„μ•Όμ—μ„œ κ°€μž₯ 였래되고 κ°€μž₯ μ€‘μš”ν•œ 섀계 기법 쀑 ν•˜λ‚˜λ‹€.관심사 Concern μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ ν•΄κ²°ν•΄μ•Ό ν•  νŠΉμ •ν•œ λ¬Έμ œλ‚˜ μ±…μž„μ„ μ˜λ―Έν•©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 각 뢀뢄이 λ‹΄λ‹Ήν•˜λŠ” μ—­ν•  λ˜λŠ” κΈ°λŠ₯을 κ°€λ¦¬ν‚€λŠ” κ°œλ…μœΌλ‘œ, μ›ΉνŽ˜μ΄μ§€λ₯Ό..

πŸ“œ CleanCode 2024.10.10

[CleanCode]클래슀 2

응집도Cohesion: 클래슀 λ§€μ„œλ“œλŠ” 클래슀 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό ν•˜λ‚˜ 이상 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 일반적으둜 λ©”μ„œλ“œκ°€ μ „μ—­λ³€μˆ˜λ₯Ό 많이 μ‚¬μš©ν• μˆ˜λ‘ 클래슀의 응집도가 λ†’λ‹€.λͺ¨λ“  μ „μ—­ivλ₯Ό λ©”μ„œλ“œλ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” ν΄λž˜μŠ€λŠ” 응집도가 κ°€μž₯ λ†’λ‹€.→ ν•˜μ§€λ§Œ μ΄λŠ” κ°€λŠ₯ν•˜μ§€λ„ λ°”λžŒμ§ ν•˜μ§€λ„ μ•Šλ‹€. κ·Έλ ‡μ§€λ§Œ μš°λ¦¬λŠ” 이λ₯Ό 지ν–₯ν•œλ‹€.λ³€μˆ˜ μ°Έμ‘° μ„€λͺ…κΈ€2023.01.08 - [β˜• μžλ°” JAVA/β˜• λ³€μˆ˜μ™€ μžλ£Œν˜• Variables & Data Type] - [JAVA]μ„ μ–Έμœ„μΉ˜μ™€ static유무둜 κ΅¬λΆ„ν•œ λ³€μˆ˜μ’…λ₯˜μ±…μ—μ„œ λ§ν•˜λŠ” λ©”μ„œλ“œλ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ”non-static이자 global variable(μ „μ—­ λ³€μˆ˜)λ₯Ό λ§ν•œλ‹€.'ν•¨μˆ˜λ₯Ό μž‘κ²Œ, λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ„ 짧게'λΌλŠ” μ „λž΅μ„ λ”°λ₯΄λ‹€ 보면λͺ‡λͺ‡ λ©”μ„œλ“œλ§Œ μ‚¬μš©ν•˜λŠ” μ „μ—­ivκ°€ λ§Žμ•„μ§„λ‹€.→ μ΄λŠ” ..

πŸ“œ CleanCode 2024.10.08

[CleanCode]클래슀 1

클래슀 μ„ μ–Έ μˆœμ„œλ³€μˆ˜ λͺ©λ‘μ •μ  곡개 μƒμˆ˜μ •μ  λΉ„κ³΅κ°œ λ³€μˆ˜λΉ„κ³΅κ°œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜κ·Έ μ™Έ λ³€μˆ˜ λͺ©λ‘ν•¨μˆ˜κ³΅κ°œ ν•¨μˆ˜λΉ„κ³΅κ°œ ν•¨μˆ˜λŠ” μžμ‹ μ„ ν˜ΈμΆœν•˜λŠ” κ³  ν•¨μˆ˜ 직후에 λ„£λŠ”λ‹€κ³΅κ°œ λ³€μˆ˜κ°€ ν•„μš”ν•œ κ²½μš°λŠ” 거의 μ—†λ‹€.즉, 좔상화 단계가 순차적으둜 λ‚΄λ €κ°„λ‹€.μΊ‘μŠν™”: λ³€μˆ˜μ™€ μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λŠ” κ³΅κ°œν•˜μ§€ μ•ŠλŠ” 편이 λ‚«λ‹€2024.04.02 - [β˜• μžλ°” JAVA/β˜• ν΄λž˜μŠ€μ™€ ν•¨μˆ˜ Class & Method] - [JAVA]μ ‘κ·Ό μ œμ–΄μž/μ œν•œμž access modifierprivate을 μ“°λŠ” 게 이상적이닀.ν•˜μ§€λ§Œ 같은 νŒ¨ν‚€μ§€ μ•ˆμ—μ„œ μ“°μ΄λŠ” κ²½μš°μ—λŠ” protectedλ‚˜ defaultλ₯Ό μ‚¬μš©ν•œλ‹€.ν•˜μ§€λ§Œ κ·Έ 전에 λΉ„κ³΅κ°œ μƒνƒœλ₯Ό μœ μ§€ν•  방법을 κ°•κ΅¬ν•œλ‹€.μΊ‘μŠν™”λ₯Ό ν’€μ–΄μ£ΌλŠ” 결정은 μ–Έμ œλ‚˜ μ΅œν›„μ˜ 방법이닀.ν΄λž˜μŠ€λŠ” μž‘μ•„μ•Ό ν•œλ‹€→ μ±…μž„μ΄ 적어야 ν•œλ‹€λ§Œμ•½ κ°„..

πŸ“œ CleanCode 2024.10.08

[CleanCode]λ‹¨μœ„ ν…ŒμŠ€νŠΈ

λ“€μ–΄κ°€κΈ° 전에 ν΄λ¦°μ½”λ“œ μ €μžμ˜ 말에 λ”°λ₯΄λ©΄ 1997λ…„λ§Œ 해도 TDDTest Driven Development κ°œλ…μ„ 아무도 λͺ°λžλ‹€κ³  ν•œλ‹€.λ‹Ήμ‹œλ§Œ 해도 λ‹¨μœ„ ν…ŒμŠ€νŠΈλž€ ν”„λ‘œκ·Έλž¨μ΄ 'λŒμ•„κ°„λ‹€'λŠ” 사싀을 증λͺ…ν•˜λŠ” μΌνšŒμ„± μ½”λ“œμ— λΆˆκ³Όν–ˆλ‹€. λ˜ν•œ 아직도 ν΄λ¦°μ½”λ“œ λΌλŠ” κ°œλ…μ€ ν˜„μž¬ λ– μ˜€λ₯΄λŠ” κ°œλ…μ΄λ©°, μ‹€μ œ μ—…λ¬΄μ—μ„œλŠ” μƒμ‚¬μ˜ μ§€μ‹œλŒ€λ‘œ κ°œλ°œμ„ μ§„ν–‰ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.κΉ¨λ—ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ μ‹€μ œ μ½”λ“œκ°€ λ³€ν•˜λ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ„ λ³€ν•΄μ•Ό ν•œλ‹€.→ ν…ŒμŠ€νŠΈ μ½”λ“œκ°€ μ§€μ €λΆ„ν• μˆ˜λ‘ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μˆ˜μ •ν•˜λŠ”λ° 더 λ§Žμ€ μ‹œκ°„μ΄ 걸리고 μ‹€νŒ¨λ‘œ 뜰 ν™•λ₯ μ΄ 높아진닀. ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ‹€μ œ μ½”λ“œ λͺ»μ§€ μ•Šκ²Œ μ€‘μš”ν•˜λ‹€.ν…ŒμŠ€νŠΈλŠ” μœ μ—°μ„±, μœ μ§€λ³΄μˆ˜μ„±, μž¬μ‚¬μš©μ„±μ„ μ œκ³΅ν•œλ‹€. μ½”λ“œκ°€ λ³€κ²½λœ μƒν™©μ—μ„œ μš°λ¦¬λŠ” 클릭 ν•œλ²ˆμœΌλ‘œ λ³€κ²½λœ μ½”λ“œκ°€ μ„±κ³΅μ΄λΌλŠ” 것을 μ•Œμ•„μ•Ό ν•œλ‹€.이..

πŸ“œ CleanCode 2024.10.03

[CleanCode]경계 1

μ™ΈλΆ€ μ½”λ“œ μ‚¬μš©ν•˜κΈ° 2024.09.29 - [β˜• μžλ°” JAVA/β˜• λ³€μˆ˜μ™€ μžλ£Œν˜• Variables & Data Type] - [JAVA]Mapκ°€μž₯ 많이 μ“°μ΄λŠ” Map을 톡해 μ•Œμ•„λ³Έλ‹€.Map의 κΈ°λŠ₯μ„±κ³Ό μœ μ—°μ„±μ΄ μœ μš©ν•œλ§ŒνΌ μœ„ν—˜λ„ 크닀.μ‚¬μš©μžλŠ” Map λ‚΄μš©μ„ μ§€μš°κ±°λ‚˜ μΆ”κ°€ν•  수 μžˆλ‹€. 2024.09.30 - [β˜• μžλ°” JAVA/β˜• λ³€μˆ˜μ™€ μžλ£Œν˜• Variables & Data Type] - [JAVA]μ œλ„€λ¦­ Genericν•˜μ§€λ§Œ 이 방법도 μ‚¬μš©μžμ—κ²Œ ν•„μš”ν•˜μ§€ μ•Šμ€ κΈ°λŠ₯κΉŒμ§€ μ œκ³΅ν•œλ‹€.Mapλ₯Ό μ‚¬μš©ν•˜λŠ” ν•˜μœ„ ν΄λž˜μŠ€κ°€ λ§Žμ„ 수둝Mapκ°€ 변경될 μ‹œ μˆ˜μ •ν•  μ½”λ“œκ°€ λ§Žμ•„μ§„λ‹€.Map을 클래슀 μ•ˆμœΌλ‘œMap sensors = new HashMap()λ₯Ό Class μ•ˆμœΌλ‘œ 넣은 κ²ƒμž…λ‹ˆλ‹€.λ”°λΌμ„œ Map μΈν„°νŽ˜μ΄μŠ€κ°€ λ³€ν•˜λ”λΌλ„ λ‚˜λ¨Έμ§€..

πŸ“œ CleanCode 2024.10.01

[CleanCode]였λ₯˜μ²˜λ¦¬-정상 흐름을 μ •μ˜ν•˜λΌ

특수 사둀 νŒ¨ν„΄Special Case Pattern특수 사둀 νŒ¨ν„΄μ΄λž€?ν΄λž˜μŠ€λ‚˜ 객체둜 μ‘°μž‘ν•΄ 특수 사둀λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식이닀.ν•œλ§ˆλ””λ‘œ μ˜ˆμ™Έκ°€ μ•„λ‹ˆλΌ μ½”λ“œλ‘œ ν•΄κ²°ν•  수 μžˆλ‹€λ©΄, μ˜ˆμ™Έμ μΈ 상황을 μΊ‘μŠν™”ν•΄μ„œ μ²˜λ¦¬ν•˜κΈΈ ꢌμž₯ν•œλ‹€.null을 λ°˜ν™˜ν•˜μ§€ λ§ˆλΌλŒ€μ‹  Colloections.emptyList()λ₯Ό λ°˜ν™˜ν•˜λΌnull을 λ°˜ν™˜ν•˜λŠ” μ½”λ“œλŠ” 일거리λ₯Ό 늘리고 ν˜ΈμΆœμžμ—κ²Œ 문제λ₯Ό λ„˜κ²¨λ²„λ¦°λ‹€.λˆ„κ΅¬ ν•œλͺ…이라도 null확인을 λΉΌλ¨ΉλŠ”λ‹€λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ ν†΅μ œ 뢈λŠ₯ μ—λŸ¬κ°€ 될 수 μžˆλ‹€.Collections.emptyList()λ°˜ν™˜νƒ€μž…μ΄ ListλΌμ„œ 쿼리둜 λ­”κ°€λ₯Ό μ‘°νšŒν•΄μ„œ μ‚¬μš©ν•  λ•Œ 정말 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.μ •ν™•νžˆλŠ” Daoμ—μ„œ 쑰회된 자료λ₯Ό μ²˜λ¦¬ν•˜λ©΄μ„œ 적기 적합할 것 κ°™κ΅¬μš”.* ν•˜μ§€λ§Œ μš°μ„  쿼리가 μ •μƒμž‘λ™ν•˜λŠ” 지 확인을 λ‹€ ν•˜κ³ λ‚˜μ„œ μΆ”κ°€ν•˜..

πŸ“œ CleanCode 2024.09.28

[CleanCode]였λ₯˜μ²˜λ¦¬-μ˜ˆμ™Έμ‚¬μš©λ²•

미확인uncheckedμ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λΌ Python, C#, C++ λͺ¨λ‘ μ˜ˆμ™Έλ₯Ό μ§€μ›ν•˜μ§€ μ•Šμ§€λ§Œ μ•ˆμ •μ μΈ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€.λ˜ν•œ ν™•μΈλœ μ˜ˆμ™Έλ₯Ό μ΅œν•˜μœ„ ν•¨μˆ˜λΌλ©° μƒμœ„ ν•¨μˆ˜ λͺ¨λ‘λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•˜λŠ” μ—°μ‡„μž‘μš©μ΄ μΌμ–΄λ‚˜OCP(μ†Œν”„νŠΈμ›¨μ–΄ κ°œμ²΄λŠ” ν™•μž₯에 λŒ€ν•΄ μ—΄λ € μžˆμ–΄μ•Ό ν•˜κ³ , μˆ˜μ •μ— λŒ€ν•΄μ„œλŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€)λ₯Ό μœ„λ°˜ν•œλ‹€.λ”°λΌμ„œ ν™•μ΄λœ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•  κ²½μš°μ—λŠ” 그만큼 μ—°κ΄€ν•¨μˆ˜λ“€λ„ μˆ˜μ •ν•΄μ•Όν•˜λŠ” λΉ„μš©μ΄ λ°œμƒν•œλ‹€.ν•˜μ§€λ§Œ μ€‘μš”ν•œ 라이브러리λ₯Ό μž‘μ„±ν•˜λ‹€λ©΄ ν™•μΈλœ μ˜ˆμ™Έλ„ μœ μš©ν•˜λ‹€.μ˜ˆμ™Έμ— 의미λ₯Ό μ œκ³΅ν•˜λΌμ˜ˆμ™Έλ₯Ό 던질 λ•Œ μ „ν›„ 상황을 μΆ©λΆ„νžˆ 덧뢙인닀.JavaλŠ” λͺ¨λ“  μ˜ˆμ™Έμ— 호좜 μŠ€νƒμ„ μ œκ³΅ν•˜μ§€λ§Œκ·Έ 외에도 였λ₯˜ λ©”μ‹œμ§€μ— 정보λ₯Ό λ‹΄μ•„ ν•¨κ»˜ λ˜μ§„λ‹€.ex)"ν”„λ‘œμ„ΈμŠ€ 쀑 였λ₯˜ λ°œμƒ: 0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€."Exception의 prin..

πŸ“œ CleanCode 2024.09.27

[CleanCode]였λ₯˜μ²˜λ¦¬-였λ₯˜μ½”λ“œλ³΄λ‹€ μ˜ˆμ™Έ(try/catch&throws)λ₯Ό μ΄μš©ν•˜λΌ

μ‹œμž‘ν•˜κΈ°μ— μ•žμ„œ 이 글을 κ°„λ‹¨νžˆ λ³΄μ‹œλ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.2024.09.25 - [β˜• μžλ°” JAVA/β˜• ν΄λž˜μŠ€μ™€ ν•¨μˆ˜ Class & Method] - [JAVA]μ˜ˆμ™Έ & μ—λŸ¬, throw & throws였λ₯˜ μ½”λ“œλ³΄λ‹€μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜λΌμ˜€λ₯˜ ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•˜κ±°λ‚˜INVALIDDEVICE_SUSPENDEDν˜ΈμΆœμžμ—κ²Œ 였λ₯˜ μ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λŠ” 방법이 μ „λΆ€μ˜€λ‹€.logger.log(Level.WARNING, "Device suspended. Unable to shut down");ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ μ¦‰μ‹œ 였λ₯˜λ₯Ό 확인해야 ν•˜κΈ° λ•Œλ¬Έμ—ν•œ λ§ˆλ””λ‘œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ μ‚¬μš©ν•˜κΈ° κΉŒλ‹€λ‘œμ›Œ 진닀.λ”°λΌμ„œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 편이 λ‚«λ‹€.μœ„μ˜ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•΄λ³΄λ©΄μ„œ..throwsλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ main()μ—μ„œλ„ μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€κ³  μ»΄νŒŒμΌμ—λŸ¬κ°€ 뜨..

πŸ“œ CleanCode 2024.09.25