1์ฅ ์คํ๋ง ์์ผ๋ก
- ์คํ๋ง ์ปจํ
์ด๋ : ๊ฐ์ฒด๊ฐ ํ์ด๋๊ณ , ์๋ผ๊ณ , ์๋ฉธํ๋ค.
- ๋นํฉํ ๋ฆฌ(org.springframework.beans.factory.BeanFactory ์ธํฐํ์ด์ค์ ์ ์๋จ)
- DI์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ง์
- ์ ํ๋ฆฌ์ผ์ด์
์ปจํ
์คํธ(org.springframework.context.ApplicationContext ์ธํฐํ์ด์ค์ ์ ์๋จ)
- ๋นํฉํ ๋ฆฌ๋ฅผ ํ์ฅํด ํ๋กํผํฐ ํ์ผ์ ํ ์คํธ ๋ฉ์์ง๋ฅผ ์ฝ๊ณ ํด๋น ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฒคํธ ๋ฐํ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ ์๋น์ค ์ ๊ณต
- ๋นํฉํ ๋ฆฌ(org.springframework.beans.factory.BeanFactory ์ธํฐํ์ด์ค์ ์ ์๋จ)
- ์คํ๋ง ํ๋ ์์ํฌ
- ์ฝ์ด ์คํ๋ง ์ปจํ
์ด๋
- ๋น์ ์์ฑ, ์ค์ , ๊ทธ๋ฆฌ๊ณ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋.
- ๋น ํฉํ ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๊ฐ ์ฌ๊ธฐ์ ํฌํจ๋๋ค.
- ๋ชจ๋ ์คํ๋ง์ ๋ชจ๋์ ์ฝ์ด ์ปจํ ์ด๋ ์์ ๊ตฌ์ถ๋๋ค.
- AOP ๋ชจ๋(aspect-oriented programming)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์ ๊ฑธ์น ๊ด์ฌ์ฌ(ํธ๋์ ์ ์ด๋ ๋ณด์ ๋ฑ)์ ๊ฐ์ฒด ๊ฐ์ ๊ฒฐํฉ๋ค์ ๋ฎ์ถ๋๋ฐ ์ด์ฉ๋๋ค.
- ๋ฐ์ดํฐ ์ก์ธ์ค์ ํตํฉ
- ์คํ๋ง์ JDBC์ DAO(Data Access Objects) ๋ชจ๋์ ๋ฐ๋ณต๋๋ ์ฝ๋(์ปจ๋ฅ์ ์ ์ป์ด์ค๊ณ , ์ง์๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ฒฐ๊ณผ ์งํฉ์ ์ฒ๋ฆฌํ๊ณ , ์ปจ๋ฅ์ ์ ๋ซ๋ ์ฝ๋)๋ฅผ ์ถ์ํํ๋ค.
- ์น๊ณผ ๋ฆฌ๋ชจํ
- ํ ์คํ
- ์ฝ์ด ์คํ๋ง ์ปจํ
์ด๋
- Bean์ ์ปจํ
์ด๋๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๋ค
- ๊ฐ์ฒด์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ปจํ ์ด๋๊ฐ ๊ด๋ฆฌํ๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฑ๊ธํด์ผ๋ก ๋ง๋ค ๊ฒ์ธ์ง, ํ๋กํ ํ์ ์ผ๋ก ๋ง๋ค ๊ฒ์ธ์ง
2์ฅ ๋น ์์ด์ด๋ง
- DI
- ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
4์ฅ ์ ์คํํธ์งํฅ ์คํ๋ง
- ํก๋จ๊ด์ฌ์ฌ(cross-cutting concerns)
- ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ ๊ฑธ์ณ ์๋ ๊ธฐ๋ฅ
- ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ๋ ๊ฐ๋ ์ ์ผ๋ก ๋ถ๋ฆฌ๋๋ค.
- ํก๋จ๊ด์ฌ์ฌ์ ์ด์ ์ํฅ์ ๋ฐ๋ ๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
- AOP๋?
- ํก๋จ๊ด์ฌ์ฌ๋ฅผ ์ ์คํฉํธ(aspect)๋ผ๋ ํน๋ณํ ํด๋์ค๋ก ๋ชจ๋ํํ๋ค.
- ์ ์ฒด ์ฝ๋ ๊ธฐ๋ฐ์ ํฉ์ด์ ธ ์๋ ๊ด์ฌ์ฌํญ์ด ํ๋์ ์ฅ์๋ก ์์ง๋๊ณ ,
- ์๋น์ค ๋ชจ๋์ด ์์ ์ ์ฃผ์๊ด์ฌ์ฌํญ(ํต์ฌ ๊ธฐ๋ฅ)์ ๋ํ ์ฝ๋๋ง ํฌํจํ๊ณ ๊ทธ ์ธ์ ๊ด์ฌ์ฌํญ์ ๋ชจ๋ ์ ์คํํธ๋ก ์ฎ๊ฒจ์ ธ์ ์ฝ๋๊ฐ ๊น๋ํด ์ง๋ค.
- ํก๋จ๊ด์ฌ์ฌ๋ฅผ ์ ์คํฉํธ(aspect)๋ผ๋ ํน๋ณํ ํด๋์ค๋ก ๋ชจ๋ํํ๋ค.
- AOP ์ฉ์ด ์ ๋ฆฌ
- ์ด๋๋ฐ์ด์ค(advice)
- ์ ์คํํธ๊ฐ ํด์ผ ํ ์์
- ‘๋ฌด์’์ ‘์ธ์ ’ ํ ์ง๋ฅผ ์ ์ํ๋ค.
- ์ฆ, ์ ์คํํธ๊ฐ ํด์ผ ํ๋ ์์ ๊ณผ ์ธ์ ๊ทธ ์์ ์ ์ํํด์ผ ํ๋์ง๋ฅผ ์ ์ํ ๊ฒ์ด ์ด๋๋ฐ์ด์ค๋ค.
- ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ํ๋ ‘์ธ์ ’๋ ์์
์ด ๋ฉ์๋ ํธ์ถ ์ด์ ์ธ์ง ์ดํ์ธ์ง, ์ด์ /์ดํ ๋ชจ๋์ธ์ง, ์๋๋ฉด ์์ธ๋ฅผ ๋์ก์ ๋๋ง ์ ์ฉ๋๋์ง๋ฅผ ์๋ฏธํ๋ค.
- ์ด์ (before) : ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์ดํ(after) : ๊ฒฐ๊ณผ์ ์๊ด์์ด ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋๊ฐ ์๋ฃ๋ ํ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ๋ฐํ ์ดํ(after-returning) : ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์์ธ๋ฐ์ ์ดํ(after-throwing) : ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋๊ฐ ์์ธ๋ฅผ ๋์ง ํ์ ์ด๋๋ฐ์ด์ค ๊ธฐ๋ฅ์ ์ํํ๋ค.
- ์ฃผ์(around) : ์ด๋๋ฐ์ด์ค๊ฐ ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋๋ฅผ ๊ฐ์ธ์ ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋ ํธ์ถ ์ ๊ณผ ํ์ ๋ช๊ฐ์ง ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ์กฐ์ธํฌ์ธํธ(join point)
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋๋ฐ์ด์ค๋ฅผ ์ ์ฉํ ์ ์๋ ๊ณณ. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ ์คํํธ๋ฅผ ๋ผ์ ๋ฃ์ ์ ์๋ ์ง์ (point)๋ฅผ ๋งํ๋ค.
- ์ง์ ์ ๋ฉ์๋ ํธ์ถ ์ง์ ์ด๋ ์์ธ๋ฐ์, ํ๋ ๊ฐ ์์ ๋ฑ์ด ์๋ค.
- ํฌ์ธํธ์ปท(pointcut)
- ์ ์คํํธ๊ฐ ์ด๋๋ฐ์ด์คํ ์กฐ์ธํฌ์ธํธ์ ์์ญ์ ์ขํ๋ ์ผ์ ํ๋ค.
- ์ ์คํํธ๊ฐ ‘์ด๋์’ ํ ์ง๋ฅผ ์ ์ํ๋ค.
- ์ด๋๋ฐ์ด์ค๊ฐ ์๋น(weaving)๋ผ์ผ ํ๋ ํ๋ ์ด์์ ์กฐ์ธํฌ์ธํธ๋ฅผ ์ ์ํ๋ค.
- ์ ์คํํธ(aspect)
- ์ด๋๋ฐ์ด์ค + ํฌ์ธํธ์ปท
- ์ธํธ๋ก๋์
(introduction)
- ๊ธฐ์กด ํด๋์ค์ ์ฝ๋ ๋ณ๊ฒฝ ์์ด๋ ์ ๋ฉ์๋๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ธฐ๋ฅ
- ์) ์ด๋ค ๊ฐ์ฒด์ ์ํ๊ฐ ์ธ์ ๋ง์ง๋ง์ผ๋ก ๋ณ๊ฒฝ๋๋ค๋ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
- ๊ฐ ํด๋์ค๋ง๋ค ํด๋น ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋์ , Auditable ์ด๋๋ฐ์ด์ค ํด๋์ค๋ฅผ ์์ฑํ์ฌ setLastModified(Date) ๋ฉ์๋์ ์ด ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ์ํ๋ค. ๊ทธ ๋ค์ ์ธํธ๋ก๋์ ์ ์ ์ฉํ๋ฉด ๊ธฐ์กด ํด๋์ค์ ์์ค ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์๋ก์ด ๋ฉ์๋์ ๋ฉค๋ฒ ๋ณ์๋ฅผ ๋์ ํ ์ ์๋ค.
- ์๋น(weaving)
- ํ๊น ๊ฐ์ฒด์ ์ ์คํํธ๋ฅผ ์ ์ฉํด์ ์๋ก์ด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ ์ฐจ
- ์ ์คํํธ๋ ํ๊น ๊ฐ์ฒด์ ์กฐ์ธํฌ์ธํธ๋ก ์๋น๋๋ค.
- ์๋น์ ๋์ ๊ฐ์ฒด์ ์์ ์ค ๋ค์๊ณผ ๊ฐ์ ๋ช๊ฐ์ง ์์ ์์ ์ํ๋ ์ ์๋ค.
- ์ปดํ์ผ ์๊ฐ(compile time)
- ํด๋์ค๋ก๋์๊ฐ(classload time)
- ์คํ์๊ฐ(runtime) : ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์ค์ ์ ์คํํธ๊ฐ ์๋น๋๋ค. ๋ณดํต ํ๊น ๊ฐ์ฒด์ ํธ์ถ์ ์์ํ๋ ๊ตฌ์กฐ์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์๋น ์ค์ AOP ์ปจํ ์ด๋๊ฐ ๋์ ์ผ๋ก ๋ง๋ค์ด๋ธ๋ค. ์คํ๋ง AOP ์ ์คํํธ๊ฐ ์๋น๋๋ ๋ฐฉ์์ด๋ค.
- ์ด๋๋ฐ์ด์ค(advice)
- ์คํ๋ง AOP ์ ์คํฉํธ
- ๋น์ ๊ฐ์ธ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์คํ์๊ฐ์ ์์ฑํจ์ผ๋ก์จ ์ ์คํํธ๊ฐ ์คํ๋ง ๊ด๋ฆฌ ๋น์ ์๋น๋๋ค. ํ๋ก์ ๊ฐ์ฒด๋ ํ๊น ๊ฐ์ฒด๋ก ์์ฅํด์ ์ด๋๋ฐ์ด์ค ๋์ ๋ฉ์๋์ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ , ํ๊น ๊ฐ์ฒด๋ก ํธ์ถ์ ์ ๋ฌ(forward)ํ๋ค.
- ์ ์คํฉํธ์ ๋ก์ง์ ํ๋ก์๊ฐ ๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ ๋์ ์คํ๋๋ฉฐ, ๊ทธ ๋ค์์ ํ๊น ๋น์ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
- ์คํ๋ง AOP์์๋ ํ๋ก์๊ฐ ์คํ์๊ฐ์ ์์ฑ๋๋ฏ๋ก ์ ์คํํธ๋ฅผ ์๋นํ๊ธฐ ์ํ ๋ณ๋์ ์ปดํ์ผ๋ฌ๋ ํ์์น ์๋ค.
5์ฅ ์คํ๋ง์ ๋ฐ์ดํฐ ์ก์ธ์ค ์ฒ ํ
- ์คํ๋ง์ด ๋น๊ฒ์ฌํ unchecked exception ์ ๊ณต
- ํ ํ๋ฆฟ ๋ฉ์๋
- ์คํ๋ง์ ๋ฐ์ดํฐ ์ก์ธ์ค ์ ์ฐจ์์์ ๊ณ ์ ๋ ๋จ๊ณ์ ๊ฐ๋ณ์ ์ธ ๋จ๊ณ๋ฅผ ํ
ํ๋ฆฟ(template)๊ณผ ์ฝ๋ฐฑ(callback)์ด๋ผ๋ ๋ ๊ฐ์ง์ ๋ณ๋ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ค.
- ํ ํ๋ฆฟ์ ํ๋ก์ธ์ค์ ๊ณ ์ ๋ ๋ถ๋ถ์ ๋ด๋นํ๊ณ , (ํธ๋์ ์ ์ ์ด, ์์ ๊ด๋ฆฌ ๋ฐ ์์ธ์ฒ๋ฆฌ ๋ฑ)
- ์ฝ๋ฐฑ์ ๋ง์ถค ๋ฐ์ดํฐ ์ก์ธ์ค ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ค. (์ง์๊ฐ์ฒด/statement ์์ฑ, ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ, ์ง์๊ฒฐ๊ณผ ์ถ์ถ๊ณผ ๋ณํ ๋ฑ)
- ์ง์ฐ๋ก๋ฉ(lazy loading) : ๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ์ ์ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ข ์ข ๊ด๋ จ์ฑ ์๋ ๊ฐ์ฒด ์ ์ฒด๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๊ธด๋ค. ์ง์ฐ ๋ก๋ฉ์ ํ์๋ก ํ๋ ์ค์ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์ฌ ์ ์๊ฒ ํด์ค๋ค.
- ์กฐ๊ธฐ ์ธ์ถ(eager fetching) : ์ง์ฐ ๋ก๋ฉ์ ๋ฐ๋ ๊ฐ๋ ์ผ๋ก ํ ๋ฒ์ ์ฟผ๋ฆฌ๋ก ์ ์ฒด ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ํด ์ค๋ค. → ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์์ ๋ฐ์ํ๋ ๊ฐ๋น์ผ ์๋ณต ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
- ์ผ์ค์ผ์ด๋ฉ(cascading) : ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋ณ๊ฒฝ์ ๊ฐํ์ ๋ ๋ค๋ฅธ ํ ์ด๋ธ๋ ๋์ผํ๊ฒ ๋ณ๊ฒฝ๋ผ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
6์ฅ ํธ๋์ ์ ๊ด๋ฆฌ
- ํธ๋์ ์
(transaction)
- ๋ชจ ์๋๋ฉด ๋
- ํธ๋์ ์ ์ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ๋์ ์์ ๋จ์๋ก ๋ฌถ์ด์ ์ ์ฒด ์์ ์ด ๋ค ์ด๋ค์ง๊ฑฐ๋, ์๋๋ฉด ํ๋๋ ์ด๋ค์ง์ง ์๊ฒ ํ ์ ์๋ค.
- ํธ๋์ ์ ์ ์ํํธ์จ์ด์์ ๋ฐ์ดํฐ๋ ๋ฆฌ์์ค๋ค์ ๋ฌด๊ฒฐ์ฑ์ด ๊นจ์ง์ง ์๊ฒ ํ๋ ์ค์ํ ์ญํ ์ ํ๋ค.
- ํธ๋์ ์
์ 4๊ฐ์ง ๊ตฌ์ฑ ์์
- ์์์ฑ(Atomic) : ํธ๋์ ์ ์ ์ฌ๋ฌ ๊ฐ์ ์กํฐ๋นํฐ๊ฐ ํ๋์ ๋จ์์์ ์ผ๋ก ๋ฌถ์ธ ๊ฒ์ด๋ค. ์์์ฑ์ ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์์ ์ด ์ผ์ด๋๊ฑฐ๋ ํ๋๋ ์ผ์ด๋์ง ์๋ ๊ฒ์ ๋ณด์ฅํ๋ค. ํธ๋์ญ์ ๋ด์ ์กํฐ๋นํฐ ์ค ํ๋๋ผ๋ ์คํจํ๋ค๋ฉด ํธ๋์ญ์ ์ด ์คํจํ๊ณ ๋กค๋ฐฑ๋๋ค.
- ๋ฌด๊ฒฐ์ฑ(Consistent) : ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด ์์คํ ์ ๊ทธ ์์คํ ์ด ๋ชจ๋ธ๋งํ ๋น์ฆ๋์ค์ ๋ฌด๊ฒฐ์ฑ์ ์ํ๋ฅผ ์ ์งํ๋ค. ๋ฐ์ดํฐ๋ ํ์ค๊ณผ ๋ถ์ ํฉ์ ์ผ์ผํค์ง ์์์ผ ํ๋ค.
- ๊ฒฉ๋ฆฌ์ฑ(Isolated) : ํธ๋์ญ์ ์ ์ฌ๋ฌ ๋ช ์ ์ฌ์ฉ์๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ก ์์ ํด๋ ๊ฐ ์ฌ์ฉ์์ ์์ ์ด ์๋ก ๋ค์ํค์ง ์๊ฒ ํด์ผ ํ๋ค. ํธ๋์ญ์ ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ฝ๊ฑฐ๋ ์ฐ์ง ์๋๋ก ๊ฒฉ๋ฆฌ๋ผ์ผ ํ๋ค.
- ์ง์์ฑ(Durable) : ํธ๋์ญ์ ์ด ์๋ฃ๋๋ฉด ์์คํ ์ ์ด์์ด ์๊ธฐ๋๋ผ๋ ํธ๋์ญ์ ์ ๊ฒฐ๊ณผ๊ฐ ์์๋ผ์ผ ํ๋ค. ์ด๋ฅผ ์ํด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ค๋ฅธ ํํ์ ์์์ ์ธ ์ ์ฅ์์ ์ ์ฅํด์ผ ํ๋ค.
- ํธ๋์ ์
๊ฒฉ๋ฆฌ ์์ค(isolation level)
- ๋ํฐ ์ฝ๊ธฐ(dirty read) : ๋ํฐ ์ฝ๊ธฐ ๋ฌธ์ ๋ ํ ํธ๋์ญ์ ์์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ํด ๋ณ๊ฒฝ๋์ง๋ง ์์ง ์ปค๋ฐ๋์ง๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค. ์ด ๋ฐ์ดํฐ๊ฐ ์ปค๋ฐ๋์ง ์๊ณ ๋กค๋ฐฑ๋์ด ๋ฒ๋ฆฐ๋ค๋ฉด, ์ฒซ ๋ฒ์งธ ํธ๋์ญ์ ์์ ์ฝ์ ์ด ๋ฐ์ดํฐ๋ ์ ํจํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ๋๋ค.
- ๋ฐ๋ณตํ ์ ์๋ ์ฝ๊ธฐ(nonrepeatable read) : ๋ฐ๋ณตํ ์ ์๋ ์ฝ๊ธฐ ๋ฌธ์ ๋ ํธ๋์ญ์ ์ด ๊ฐ์ ์ง์๋ฅผ ๋ ๋ฒ ์ด์ ์ํํ ๋ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ป๊ฒ ๋๋ ๋ฌธ์ ๋ฅผ ๋งํ๋ค. ์ด๋ ๋ณดํต ๊ฐ ์ง์ ์ํ ์ฌ์ด์ ๋์ ์งํ ์ค์ธ ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ด ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ค.
- ํฌํ ์ฝ๊ธฐ(phantom read) : ํฌํ ์ฝ๊ธฐ๋ ๋ฐ๋ณตํ ์ ์๋ ์ฝ๊ธฐ์ ์ ์ฌํ์ง๋ง ์ฐจ์ด๊ฐ ์๋ค. ํฌํ ์ฝ๊ธฐ๋ ์ด๋ค ํธ๋์ญ์ (T1)์ด ๋ ์ด์์ ๋ฐ์ดํฐ ํ์ ์ฝ์ ๋ค์, ๋์ ์งํ ์ค์ธ ๋ค๋ฅธ ํธ๋์ญ์ (T2)์ด ์ถ๊ฐ ํ์ ์ฝ์ ํ ๋ ๋ฐ์ํ๋ค. T1์์ ๋์ผํ ์ง์๋ฅผ ๋ค์ ์ํํ๋ฉด, T1์ ์ด์ ์๋ ์๋ ๋ฐ์ดํฐ ํ๊น์ง ์ฝ๊ฒ ๋๋ค.
7์ฅ ์คํ๋ง MVC๋ฅผ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
- ํ์ผ ์
๋ก๋ ์ฒ๋ฆฌ
- ํ๋ฉด์์ ์ ๋ก๋ํ ํ์ผ์ ๋ฐ๋๋ค (ํผ์ ํ์ผ ์ ๋ก๋ ํ๋ ์ถ๊ฐ)
- ์ปจํธ๋กค๋ฌ์์ ์ ๋ก๋๋ ํ์ผ์ ๋ฐ๋๋ก ํ๋ค (์ ๋ก๋ ํ์ผ ์์ )
- multipart/form-data ์ค์ ํ์ผ ์์คํ ์ ํ์ผ ์ ์ฅ
- 2๋ฒ ์ ๋ก๋ ํ์ผ ์์
@RequestMapping(method=RequestMethod.POST)
public String addSpitterFromForm(@Valid Spitter spitter, BindingResult bindingResult,
@RequestParam(value="image", required=false) MultipartFile image) {
if(bindingResult.hasErrors()) {
return "spitters/edit";
}
spitterService.saveSpitter(spitter);
try {
if(!image.isEmpty()) { // ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ๋ฉด ๋ค์์ผ๋ก ๋์ด๊ฐ
validateImage(image); // ์ด๋ฏธ์ง ์ ํจ์ฑ ๊ฒ์ฆ
saveImage(spitter.getId() + ".jpg", image); // ์ด๋ฏธ์ง ํ์ผ ์ ์ฅ
}
} catch (ImageUploadException e) {
bindingResult.reject(e.getMessage());
return "spitters/edit";
}
return "redirect:/spitters/" + spitter.getUsername();
}
- ValidateImage() ๋ฉ์๋๋ ์ ๋ก๋๋ ํ์ผ์ด ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋์ง ํ์ธ
- jpeg ํ์ผ์ด ๋ง๋์ง ํ์ธํ๊ณ ์ ํจ์ฑ ๊ฒ์ฆ์ ์คํจํ๋ฉด RuntimeException์ ๊ฐ๋จํ ํ์ฅํ ImageUploadException์ ๋ฐ์์ํจ๋ค.
private void validateImage(MultipartFile image) {
if(!image.getContentType().equals("image/jpeg")) {
throw new ImageUploadException("Only JPG images accepted");
}
}
- 3๋ฒ ํ์ผ ์์คํ
์ ํ์ผ ์ ์ฅ
- saveImage()๋ webRootPath์ ๊ฐ ๊ธฐ๋ฐ์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ java.io.File ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- File ๊ฐ์ฒด๊ฐ ์ค๋น๋๋ฉด, ์ํ์น ์ปค๋จผ์ค IO(Apache Commons IO)์ FileUtils๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์ ์ฅํ๋ค.
- ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ImageUploadException์ด ๋ฐ์ํ๋ค.
- ํ์ผ์์คํ
๊ด๋ฆฌ ๋ฌธ์
- ํ์ผ ์ ์ฅ์ ์ํ ์ถฉ๋ถํ ๊ณต๊ฐ ํ๋ณด ์ฑ ์
- ํ๋์จ์ด ๋ฌธ์ ๋ฐ์์ ๋๋นํ ๋ฐฑ์ ๋์ฑ
- ํด๋ฌ์คํฐ๋ก ์ฌ๋ฌ ์๋ฒ์ ๊ฑธ์ณ ์๋ ์ด๋ฏธ์ง ํ์ผ ๋๊ธฐํ ์ฒ๋ฆฌ
9์ฅ ์คํ๋ง ์ํ๋ฆฌํฐ
- ๋ชจ๋ ์๋ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ HttpServletRequest๋ก ์์ํ๋ค. ์์ฒญ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ ๊ทผ์ (access point)์ด๋ผ๋ฉด, ๋ฐ๋ก ๊ทธ ์์ฒญ์ด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋ณด์์ด ์์๋๋ ๊ณณ์ด๋ค.
- ์๋ธ๋ฆฟ ํํฐ ํ๋ก์ฑ
- ์คํ๋ง ์ํ๋ฆฌํฐ๋ ๋ค์ํ ๋ณด์์ ์ ๊ณตํ๊ธฐ ์ํด ์๋ธ๋ฆฟ ํํฐ๋ฅผ ์ด์ฉํ๋ค.
- ์๋ธ๋ฆฟ ํํฐ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ web.xml ํ์ผ์ ๋ค์ํ <filter>๋ฅผ ์ ์ธํ๋ค๋ ๋ป์ด๋ค.
- ์คํ๋ง ์ํ๋ฆฌํฐ๋ ์ผ๋ จ์ ์๋ธ๋ฆฟ ํํฐ๋ฅผ ์ฌ์ฉํด์ ์คํ๋ง MVC ์ปจํธ๋กค๋ฌ๋ฅผ ํฌํจํด ์น ์์์ ๋ํ ์ ๊ทผ์ ์ ์ดํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์คํํธ๋ฅผ ํตํด ์คํ๋ง ์ํ๋ฆฌํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋ ํธ์ถ์ ๋ณด์์ ์ ์ฉํ ์ ์๋ค.
10์ฅ ์คํ๋ง ํตํฉ
- ์คํ๋ง ๋ถํธ ๋ฆฌ๋ชจํ
- ๋ฆฌ๋ชจํ (remoting)์ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋น์ค ๊ฐ์ ๋ํ๋ค.
- ์๊ฒฉ ๋ฉ์๋ ํธ์ถ(RMI)
- RMI๋ ์๋ฐ์ ํ์ค ๊ฐ์ฒด ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ฐฉํ๋ฒฝ์ ๊ฐ๋ก์ง๋ฌ ์ฌ์ฉํ๊ธฐ๋ ์ด๋ ต๋ค.
- ์คํ๋ง์ HTTP ํธ์ถ์(invoker)๋ ๋ฐฉํ๋ฒฝ์ด ์์ด๋ ๊ด์ฐฎ๊ณ , HTTP๋ฅผ ๊ฐ๋ก์ง๋ฌ ๋ฆฌ๋ชจํ ์ ์ํํ๋ ๋์์ ์๋ฐ์ ์ง๋ ฌํ๋ฅผ ์ด์ฉํ๋ค.
11์ฅ ์คํ๋ง์๊ฒ ์ฝ๊ฐ์ ํด์(REST)์
- REST๋ ์ก์ ์งํฅ์ด ์๋๋ผ ๋ฆฌ์์ค ์งํฅ์ด๋ค. ๋ฆฌ์์ค๋ฅผ ์๋ณํ๊ณ ์์น๋ฅผ ๋ํ๋ธ๋ค.
- HTTP ๋ฉ์๋๋ ์์ ์ฑ(safety)์ ๋ฉฑ๋ฑ(idempotency)์ด๋ผ๋ ๋ ๊ฐ์ง ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ฉ์๋๊ฐ ๋ฆฌ์์ค์ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด ์์ ํ๋ค๊ณ ๊ฐ์ฃผํ๋ค.
- ๋ฉฑ๋ฑ์ ์ ๋ฉ์๋๋ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ๋ ๋ณ๊ฒฝํ์ง ์์ ์๋ ์์ง๋ง, ๋ฐ๋ณต๋๋ ์์ฒญ์ด ์ฒซ ๋ฒ์งธ ์์ฒญ ์ดํ์ ๋ฐ์ํ ์ ์๋ ์ด๋ ํ ๋ถ์์ฉ๋ ์ผ์ผํค์ง ์๋๋ค.
- ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง, ์ฆ ์๋ฒ์ ๋์ผํ ์์ฒญ์ด ๋ฐ๋ณต์ ์ผ๋ก ์ผ์ด๋๋๋ผ๋ ๋์ผํ ์๋ต ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.
12์ฅ ์คํ๋ง ๋ฉ์์ง
๋น๋๊ธฐ์ ๋ฉ์์ง
- ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ฐ์ ์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฌ์ง ์๋ ํต์ ๋ฐฉ์
์๋ฐ ๋ฉ์์ง ์๋น์ค(Java Message Service, JMS)
- ๋ฉ์์ง ์ค๊ฐ์(message broker)
- ๋ชฉ์ ์ง(destination)
- ํ(queue)
- ์ ๋ ์ ๋ชจ๋ธ(point to point)
- ํ ํฝ(topic)
- ๋ฐํ๊ตฌ๋ (publish-subscribe)
- ํ(queue)
13์ฅ ๊ธฐํ ์ฃผ์์ฌํญ
์ค์ ์ธ๋ถํ
- ํ๋กํผํฐ ๊ฐ ์ค์ ์ ์คํ๋ง ์ค์ ์ ๋ฐ์ผ๋ก ์ด๋์์ผ ์ธ๋ถ ํ๋กํผํฐ ํ์ผ์ ๋ฐฐ์นํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ค์ ๋ฐฐํฌํ๊ฑฐ๋ ๋ค์ ๋ฌถ์ง ์์๋ ๊ด๋ฆฌ๋ ์ ์๋ ๋ฐฉ๋ฒ
- ํ๋กํผํฐ ๋์น ๋ณ์ ์ค์ ์(property placeholder configurers)
- ํ๋กํผํฐ ์ค๋ฒ๋ผ์ด๋(property overriders)
JNDI(Java Naming and Directory Interface) ๊ฐ์ฒด ์์ด์ด๋ง
// TODO
์คํ๋ง ์ธ ์ก์ 6ํ ์ฝ๊ธฐ
'๋ ์' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฅ ๋จน์ฌ์ฃผ๋ ๊ฒฝ์ ํ (0) | 2024.10.19 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ ๊ธธ, ๋ฉํ ์๊ฒ ๋ฌป๋ค (0) | 2024.08.29 |
์ฌํ ์ํํธ์จ์ด (2) | 2024.01.25 |
์คํ๋ง ์ ๋ฌธ์ ์ํ ์๋ฐ ๊ฐ์ฒด ์งํฅ์ ์๋ฆฌ์ ์ดํด (0) | 2022.12.06 |
ํค๋ ํผ์คํธ ๋์์ธ ํจํด (0) | 2022.11.05 |
๋๊ธ