2021-03-22(Mon)

ν•­λͺ©

λ‚΄μš©

ν•™μŠ΅ λ‚ μ§œ

2021-03-22(μ›”)

ν•™μŠ΅ μ‹œκ°„

11:00~23:00

ν•™μŠ΅ λ²”μœ„ 및 주제

λ””μžμΈνŒ¨ν„΄

ν•™μŠ΅ λͺ©ν‘œ

λ””μžμΈνŒ¨ν„΄ 쀑 싱글톀 νŒ¨ν„΄μ— λŒ€ν•΄ ν•™μŠ΅ν•œλ‹€.

λ™λ£Œ ν•™μŠ΅ 방법

-

상세 ν•™μŠ΅ λ‚΄μš©

νŠΉμ • 객체λ₯Ό μ‚¬μš©ν•œλ‹€λŠ” 것은 νŠΉμ • 객체의 κΈ°λŠ₯에 μ˜μ‘΄ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

이 νŠΉμ • 객체λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 따라 κ°•ν•œ κ²°ν•©κ³Ό μ•½ν•œ 결합이 μžˆλ‹€. 결합이 μ•½ν•  수둝 λ‹€λ₯Έ 객체의 변화에 영ν–₯을 덜 λ°›λŠ”λ‹€.

  • κ°•ν•œ κ²°ν•©: λ©”μ„œλ“œ λ‚΄μ—μ„œ μ˜μ‘΄ν•˜λŠ” 객체λ₯Ό 직접 μƒμ„±ν•œλ‹€.

  • μ•½ν•œ κ²°ν•©: μ˜μ‘΄ν•˜λŠ” 객체가 μƒμ„±λœ 것을 λ©”μ„œλ“œ 인자둜 μ „λ‹¬λ°›λŠ”λ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄(Singleton pattern)

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ μ–΄λ–€ ν΄λž˜μŠ€κ°€ 졜초 ν•œλ²ˆλ§Œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³ , κ·Έ λ©”λͺ¨λ¦¬μ— μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€μ–΄ μ‚¬μš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄.

객체가 λ„ˆλ¬΄ λ§Žμ•„μ§€λ©΄ 컴퓨터 μžμ›μ„ κ³Όλ„ν•˜κ²Œ μ‚¬μš©ν•˜κ²Œ 되고, μ΄λŠ” ν”„λ‘œκ·Έλž¨ μ „μ²΄μ˜ 속도λ₯Ό 느리게 ν•  수 μžˆλ‹€.

-> κ°œλ°œμžλŠ” 객체의 μ΅œλŒ€ 개수λ₯Ό μ œν•œν•  ν•„μš”κ°€ 생긴닀.

μ‹±κΈ€ν„΄ νŒ¨ν„΄μ€ μ΅œλŒ€ N개둜 객체 생성을 μ œν•œν•˜λŠ” νŒ¨ν„΄μ΄λ‹€. 이 λ•Œ μ€‘μš”ν•œ 것은 μƒμ„±λ˜λŠ” 객체의 μ΅œλŒ€ 개수λ₯Ό μ œν•œν•˜λŠ” 데 μžˆμ–΄μ„œ 객체의 생성을 μš”μ²­ν•˜λŠ” μͺ½μ—μ„œλŠ” 일일이 μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λ˜λ„λ‘ λ§Œλ“€μ–΄μ£ΌλŠ” 것이닀.

μ‹±κΈ€ν„΄ μž₯점

  1. λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό λ°©μ§€ν•œλ‹€. κ³ μ •λœ λ©”λͺ¨λ¦¬ μ˜μ—­μ„ μ–»μœΌλ©΄μ„œ ν•œλ²ˆμ˜ new둜 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έ.

  2. λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€μ΄ 데이터λ₯Ό κ³΅μœ ν•˜κΈ° 쉽닀.

    μ‹±κΈ€ν„΄μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 클래슀의 μΈμŠ€ν„΄μŠ€λŠ” μ „μ—­ μΈμŠ€ν„΄μŠ€μ΄κΈ° λ•Œλ¬Έ.

  3. 두 번째 ν˜ΈμΆœλΆ€ν„°λŠ” 객체 λ‘œλ”©μ‹œκ°„μ΄ ν˜„μ €ν•˜κ²Œ 쀄어 μ„±λŠ₯이 μ’‹μ•„μ§„λ‹€.

μ‹±κΈ€ν„΄ 단점

  • 객체 μ§€ν–₯ 섀계 원칙에 μ–΄κΈ‹λ‚˜λ©° μˆ˜μ •κ³Ό ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μ›Œμ§„λ‹€.

    μ‹±κΈ€ν„΄ μΈμŠ€ν„΄μŠ€κ°€ λ„ˆλ¬΄ λ§Žμ€ 일을 ν•˜κ±°λ‚˜ λ§Žμ€ 데이터λ₯Ό κ³΅μœ μ‹œν‚¬ 경우 λ‹€λ₯Έ 클래슀의 μΈμŠ€ν„΄μŠ€λ“€ 간에 결합도가 λ†’μ•„μ Έ '개방-폐쇄 원칙'을 μœ„λ°°ν•˜κ²Œ λœλ‹€.

  • λ©€ν‹°μ“°λ ˆλ“œ ν™˜κ²½μ—μ„œ λ™κΈ°ν™”μ²˜λ¦¬λ₯Ό μ μ ˆν•˜κ²Œ ν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ μΈμŠ€ν„΄μŠ€κ°€ 두 개 이상 생성될 수 μžˆλ‹€.

μ‹±κΈ€ν„΄ νŒ¨ν„΄ ν™œμš©λ  상황 및 μ˜ˆμ‹œ

μžλ°” ν”„λ‘œκ·Έλž˜λ°

  • λ°μ΄ν„°λ² μ΄μŠ€ 컀λ„₯μ…˜ ν’€

  • 둜그 라이터

κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°

  • μ‚¬μš΄λ“œ λ§€λ‹ˆμ €

  • μŠ€μ½”μ–΄ λ§€λ‹ˆμ €

μ‹±κΈ€ν„΄ κ΅¬ν˜„

μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλ‘œ 싱글턴을 κ΅¬ν˜„ν•˜μž. 이 λ•Œ μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œ 외에 μƒμ„±μžλ₯Ό 직접 ν˜ΈμΆœν•΄μ„œ 객체λ₯Ό μƒμ„±ν•˜λŠ” 것을 막기 μœ„ν•΄μ„œλŠ” μƒμ„±μžλ₯Ό private둜 μ„€μ •ν•˜λ©΄ λœλ‹€.

λ¬Έμ œλŠ” μœ„μ²˜λŸΌ κ΅¬ν˜„ν•  경우, λ©€ν‹°μ“°λ ˆλ“œ ν™˜κ²½μ—μ„œλŠ” 객체λ₯Ό ν•˜λ‚˜λ§Œ μƒμ„±ν•œλ‹€λŠ” 것을 보μž₯ν•  수 μ—†λ‹€. μ“°λ ˆλ“œκ°€ singleton 객체가 null인지 ν™•μΈν•˜λŠ” 과정이 거의 λ™μ‹œμ— μ΄λ€„μ§ˆ 수 있기 λ•Œλ¬Έμ΄λ‹€. 이 취약점은 μ–΄λ–»κ²Œ ν•΄κ²°ν• κΉŒ?

μœ„μ²˜λŸΌ synchronizedλ₯Ό μ˜ˆμ•½μ–΄λ‘œ λ„£μ–΄μ£Όλ©΄ ν•΄κ²°λœλ‹€.

ν•˜μ§€λ§Œ 이건 쑰금만 생각해보면 λΉ„μš©μ΄ λ„ˆλ¬΄ λΉ„νš¨μœ¨μ μΈ 점을 μ•Œ 수 μžˆλ‹€.

  • μ΅œμ΄ˆμ— singleton이 null인 κ²½μš°μ—λ§Œ λ‹€λ₯Έ μ“°λ ˆλ“œμ™€μ˜ 경합을 λ§‰μœΌλ©΄ μΆ©λΆ„ν•œλ°, synchronizedλ₯Ό μ˜ˆμ•½μ–΄λ₯Ό λ„£μœΌλ©΄ λͺ¨λ“  μ“°λ ˆλ“œλ₯Ό κΈ°λ‹€λ¦¬κ²Œν•˜μ—¬ 병λͺ©ν˜„상이 μΌμ–΄λ‚œλ‹€.

λ”°λΌμ„œ μ•„λž˜μ²˜λŸΌ 클래슀 λ‚΄λΆ€μ—μ„œ μ΅œμ΄ˆμ— 객체 μΈμŠ€ν„΄μŠ€λ₯Ό λ§Œλ“€λ„λ‘ ν•΄μ„œ κ°œμ„ ν•  수 μžˆλ‹€.

μ•„λž˜μ²˜λŸΌ lazy holder에 μ˜ν•΄ μ΄ˆκΈ°ν™”λ₯Ό μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

이 방법은 JVM의 클래슀 μ΄ˆκΈ°ν™” κ³Όμ •μ—μ„œ 보μž₯λ˜λŠ” μ›μžμ  νŠΉμ„±μ„ μ΄μš©ν•˜μ—¬ μ‹±κΈ€ν„΄μ˜ μ΄ˆκΈ°ν™” λ¬Έμ œμ— λŒ€ν•œ μ±…μž„μ„ JVM에 λ– λ„˜κΈ΄λ‹€.

holder μ•ˆμ— μ„ μ–Έλœ instanceκ°€ static이기 λ•Œλ¬Έμ— 클래슀 λ‘œλ”©μ‹œμ μ— ν•œλ²ˆλ§Œ 호좜될 것이며, final을 μ‚¬μš©ν•΄ λ‹€μ‹œ 값이 ν• λ‹Ήλ˜μ§€ μ•Šλ„λ‘ λ§Œλ“  방법이닀.

ν•™μŠ΅ λ‚΄μš©μ— λŒ€ν•œ 개인적인 총평

일전에 κ΅¬λ§€ν•΄λ’€λ˜ λ””μžμΈνŒ¨ν„΄ κ°•μ˜λ₯Ό μˆ˜κ°•ν•˜μ˜€λ‹€. ν”„λ‘œμ νŠΈλ₯Ό 진행해보면 λ‚΄κ°€ μ“°κ³  μžˆλŠ” 것이 μ§€κΈˆ μƒν™©μ—μ„œ 베슀트 ν”Œλž™ν‹°μŠ€μΈμ§€μ— λŒ€ν•΄ λŠμž„μ—†μ΄ κ³ λ―Όν•˜κ²Œ λœλ‹€. μ§€κΈˆμ˜ 잘λͺ»λœ νŒλ‹¨μ΄ 이후에 κΈ°μˆ λΆ€μ±„λ‘œ μž‘μš©ν•  수 있기 λ•Œλ¬Έμ—! λ””μžμΈ νŒ¨ν„΄μ„ 잘 μˆ™μ§€ν•΄μ„œ μ‹€μ œ ν”„λ‘œμ νŠΈμ— μ§„ν–‰ν•˜λ©΄ 생산성도 올라갈거라 κΈ°λŒ€ν•΄λ³Έλ‹€.

λ‹€μŒ ν•™μŠ΅ κ³„νš

  • TDD ν•™μŠ΅

Last updated

Was this helpful?