Singleton
Last updated
Last updated
์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋ ๋ ์ด๋ค ํด๋์ค๊ฐ ์ต์ด ํ๋ฒ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ (static) ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๋์์ธ ํจํด์ด๋ค. ์์ฑ์๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋๋ผ๋ ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ํ๋์ด๋ฉฐ, ์ต์ด ์์ฑ ์ดํ ํธ์ถ๋ ์์ฑ์๋ ์ต์ด์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
์ฆ, ์ธ์คํด์ค๋ฅผ ํ๋๋ง ๋ง๋ค์ด ์ฌ์ฉํ๊ธฐ์ํ ํจํด์ด๋ค.
ํ๋์ ์ธ์คํด์ค๋ง์ ์์ฑํ๋ ์ฑ ์์ด ์์ผ๋ฉฐ,
getInstance()
๋ฉ์๋๋ฅผ ํตํด ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋์ผํ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ์์ ์ ์ํํ๋ค.
ํ๋์ ์ธ์คํด์ค๋ง์ ์ ์งํ๊ธฐ ์ํด ์ธ์คํด์ค ์์ฑ์ ํน๋ณํ ์ ์ฝ์ ๊ฑธ์ด๋ฌ์ผ ํ๋ค. new ๋ฅผ ์คํํ ์ ์๋๋ก ์์ฑ์์ private ์ ๊ทผ ์ ์ด์๋ฅผ ์ง์ ํ๊ณ , ์ ์ผํ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์๋๋ก ์ ์ ๋ฉ์๋๋ฅผ ์ง์ํด์ผ ํ๋ค. ๋ํ ์ ์ผํ ๋จ์ผ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ ์ ์ ์ฐธ์กฐ๋ณ์๊ฐ ํ์ํ๋ค.
๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ์ฑ๊ธํด ํจํด์ ์ ์ฉํ๋ค๋ณด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋์์ ์ ๊ทผํ๋ค๊ฐ ํ๋๋ง ์์ฑ๋์ด์ผ ํ๋ ์ธ์คํด์ค๊ฐ ๋ ๊ฐ ์์ฑ๋ ์ ์๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ 1. ์ธ์คํด์ค๋ฅผ ๋ง๋๋ ๋ฉ์๋์ ๋๊ธฐํํ๋ ๋ฐฉ๋ฒ (Thread-Safe Initialization) 2. ์ ์ ๋ณ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐ๋ก ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ (Eager Initialization)์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
๋จ์ํ synchronized ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ์ด์๊ฐ ์์ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด DCL(Double Checking Locking)
์ ์จ์ getInstance()
์์ ๋๊ธฐํ ๋๋ ์์ญ์ ์ค์ผ ์ ์๋ค. ์ด๊ธฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด์๋ ๋๊ธฐํํ๋ ๋ถ๋ถ์ ์๊ฒ ๋ง๋ค์๋ค. ๊ทธ๋ฌ๋ ์ด ์ฝ๋๋ ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์ ๋์ํ ๋, ํ๋์ CPU ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ค๋ฅธ CPU ๊ฐ lock ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์ ์ ๋ณ์์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋ฐ๋ก ์ด๊ธฐํ ํ๋ ๋ฐฉ๋ฒ(Eager initialization)์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
๊ณ ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฌ์ฉํ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
์ ์ญ ์ธ์คํด์ค์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํด๋์ค์ ์ธ์คํด์ค๋ค์ด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ ์ฝ๋ค. (Connection Pool, ์ค๋ ๋ ํ, ๋๋ฐ์ด์ค ์ค์ ๊ฐ์ฒด์ฒ๋ผ ๊ณตํตํธ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํด ์ฌ์ฉํด์ผํ๋ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ)
๋ ๋ฒ์งธ ์ด์ฉ์๋ถํฐ๋ ๊ฐ์ฒด ๋ก๋ฉ ์๊ฐ์ด ์ค์ด ์ฑ๋ฅ์ด ์ข์์ง๋ค.