Environment Abstraction
Spring์ Environment ์ธํฐํ์ด์ค๋ ๋ ๊ฐ์ง ์ฃผ์ ์ธก๋ฉด์ ์ถ์ํํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๊ด๋ฆฌํฉ๋๋ค: ํ๋กํ์ผ(profiles)๊ณผ ํ๋กํผํฐ(properties์ ๋๋ค.
ํ๋กํ์ผ์ ํน์ ์กฐ๊ฑด์์๋ง ํ์ฑํ๋๋ Bean ์ ์์ ๋ ผ๋ฆฌ์ ๊ทธ๋ฃน์ ์๋ฏธํ๋ฉฐ, ํ๋กํผํฐ๋ ์ฌ๋ฌ ์ถ์ฒ์์ ๊ฐ์ ธ์ฌ ์ ์๋ ์ค์ ๊ฐ๋ค์ ๋งํฉ๋๋ค. ์ด ๋ ๊ฐ์ง๋ฅผ ํ์ฉํ์ฌ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋์ ์ผ๋ก Bean์ ์ ์ํ๊ฑฐ๋ ํ๋กํผํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Bean Definition Profiles
ํ๋กํ์ผ์ ์ฌ์ฉํ๋ฉด ํน์ ํ๊ฒฝ์ ๋ง๊ฒ Bean์ ๋ค๋ฅด๊ฒ ์ ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ฐ ํ๊ฒฝ์์๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์ด์ ํ๊ฒฝ์์๋ JNDI๋ฅผ ํตํด ๋ฐ์ดํฐ ์์ค๋ฅผ ์ค์ ํ๋ ์์ผ๋ก ํ๊ฒฝ์ ๋ฐ๋ผ Bean์ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
ํ๋กํ์ผ์ ์ฌ์ฉํ๋ ์ด์
๊ฐ๋ฐ ํ๊ฒฝ์์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ณ , ์ด์ ํ๊ฒฝ์์ JNDI๋ฅผ ํตํด ๋ฐ์ดํฐ ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ ๋.
์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ํ ์คํธ ๋๋ ์ด์ ํ๊ฒฝ์์๋ง ํ์ฑํํ ๋.
ํน์ ๊ณ ๊ฐ์๊ฒ ๋ง์ถ Bean์ ๋ฑ๋กํด์ผ ํ ๋.
ํ๋กํ์ผ์ ์ด์ฉํ Bean ์ ์
๋ค์์ ๊ฐ ํ๊ฒฝ์์ ์ฌ์ฉํ DataSource๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌ์ฑํ๋ ์์ ๋๋ค:
๊ฐ๋ฐ ํ๊ฒฝ:
์ด์ ํ๊ฒฝ:
@Profile ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ํด๋น ํ๋กํ์ผ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น Bean์ด ๋ฑ๋ก๋ฉ๋๋ค. "production" ํ๋กํ์ผ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ JndiDataConfig
ํด๋์ค๊ฐ ๋ฑ๋ก๋๊ณ , "development" ํ๋กํ์ผ์ด ํ์ฑํ๋ ๊ฒฝ์ฐ StandaloneDataConfig
ํด๋์ค๊ฐ ๋ฑ๋ก๋ฉ๋๋ค.
ํ๋กํ์ผ ํํ์
@Profile ์ ๋ ธํ ์ด์ ์ ๊ฐ๋จํ ํ๋กํ์ผ ์ด๋ฆ๋ฟ๋ง ์๋๋ผ ๋ณต์กํ ๋ ผ๋ฆฌ์์ ์ง์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, "production & us-east"์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ ผ๋ฆฌ AND๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ ผ๋ฆฌ OR์ "production | us-east"๋ก ํํํ ์ ์์ต๋๋ค. ๋ํ, ! ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ๋กํ์ผ์ด ํ์ฑํ๋์ง ์์์ ๋๋ง Bean์ ๋ฑ๋กํ๋ ์กฐ๊ฑด์ ๋ง๋ค ์ ์์ต๋๋ค.
@Profile์ ์ด์ฉํ ๋ฉํ ์ ๋
ธํ
์ด์
@Profile ์ ๋ ธํ ์ด์ ์ ๋ฉํ ์ ๋ ธํ ์ด์ ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, @Profile("production")์ ๋์ ํ์ฌ @Production์ด๋ผ๋ ์ปค์คํ ์ ๋ ธํ ์ด์ ์ ์ ์ํ ์ ์์ต๋๋ค:
์ด์ @Profile("production") ๋์ @Production์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
XML์์์ ํ๋กํ์ผ ์ ์
XML์์๋ ์์์ profile ์์ฑ์ ์ฌ์ฉํ์ฌ ํ๋กํ์ผ์ ์ ์ํ ์ ์์ต๋๋ค. ์๋๋ XML์์ ๊ฐ ํ๋กํ์ผ์ ๋ฐ๋ผ ๋ฐ์ดํฐ ์์ค๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ๋ ์์์ ๋๋ค:
๊ฐ๋ฐ ํ๊ฒฝ:
์ด์ ํ๊ฒฝ:
์ด๋ ๊ฒ XML์์๋ profile ์์ฑ์ ์ฌ์ฉํ์ฌ ํ๊ฒฝ์ ๋ง๋ Bean์ ์ ์ํ ์ ์์ต๋๋ค.
ํ๋กํ์ผ ํ์ฑํ
ํ๋กํ์ผ์ ํ์ฑํํ๋ ค๋ฉด ํ๋ก๊ทธ๋จ ์ฝ๋์์ Environment API๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์์คํ ์์ฑ์ ํตํด ์ง์ ํ ์ ์์ต๋๋ค. ๋ค์์ ํ๋ก๊ทธ๋จ ์ฝ๋์์ ํ๋กํ์ผ์ ํ์ฑํํ๋ ์์์ ๋๋ค:
๋๋ ์์คํ ์์ฑ์ ํตํด ํ๋กํ์ผ์ ํ์ฑํํ ์ ์์ต๋๋ค:
๋ํดํธ ํ๋กํ์ผ
ํน์ ํ๋กํ์ผ์ด ํ์ฑํ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ ๊ธฐ๋ณธ ํ๋กํ์ผ์ ์ค์ ํ ์ ์์ต๋๋ค. "default"๋ผ๋ ์ด๋ฆ์ ๊ธฐ๋ณธ ํ๋กํ์ผ์ด ์์ผ๋ฉฐ, ์ด ํ๋กํ์ผ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ Bean ๊ตฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ํ๋กํ์ผ์ ํ์ฑํ๋ ๋ค๋ฅธ ํ๋กํ์ผ์ด ์์ ๋๋ง ์ ์ฉ๋ฉ๋๋ค.
PropertySource ์ถ์ํ
Spring์ Environment๋ ๋ค์ํ PropertySource ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฌ๋ฌ ์ถ์ฒ์์ ์ค์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Spring์ StandardEnvironment๋ JVM ์์คํ ์์ฑ๊ณผ ์์คํ ํ๊ฒฝ ๋ณ์๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
@PropertySource ์ฌ์ฉ
@PropertySource ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ํ๋กํผํฐ ํ์ผ์ ๊ฐํธํ๊ฒ ๋ก๋ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, app.properties ํ์ผ์์ testbean.name=myTestBean์ด๋ผ๋ ํค-๊ฐ ์์ ์ ์ํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:
PropertySource์ ์์์ ์ฐ์ ์์
Spring์ ๋ค์ํ PropertySource๋ฅผ ๊ณ์ธต์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์์คํ ์์ฑ์ด ํ๊ฒฝ ๋ณ์๋ณด๋ค ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค. ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ง์ PropertySource๋ฅผ ์ ์ํ์ฌ ์ถ๊ฐํ ์ ์์ต๋๋ค:
ํ๋ ์ด์คํ๋ ํด์
ํ๋ ์ด์คํ๋๋ ${property} ํ์์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ JVM ์์คํ ์์ฑ์ด๋ ํ๊ฒฝ ๋ณ์๋ฟ๋ง ์๋๋ผ Spring์ Environment๋ฅผ ํตํด ์ ์๋ ๋ชจ๋ PropertySource์์ ํด์๋ฉ๋๋ค.
์ ์์์์๋ customer ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ผ๋ก ๋์ฒด๋๋ฉฐ, ์กด์ฌํ์ง ์์ผ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
Last updated
Was this helpful?