4. ์คํ๋ง ๋น๊ณผ ์์กด๊ด๊ณ
๋ชฉ์ฐจ
- ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
- ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
์๊ฐ ์ฝ์ค๋ ์ธํ๋ฐ ์คํ๋ง ์ ๋ฌธ ๊ฐ์๋ฅผ ๋ฃ๊ณ ์์ต๋๋ค.
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ (@Autowired)
- ํ๋ฉด์ ๋ถ์ด๊ธฐ ์ํด ์ปจํธ๋กค๋ฌ, ๋ทฐ ํ ํ๋ฆฟ์ด ํ์ํ๋ค. ์ด๋ฅผ ์ํด ๋ฉค๋ฒ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค์ด์ผํ๋๋ฐ, ๋ฉค๋ฒ ์๋น์ค๋ฅผ ํตํด ํ์๊ฐ์ ์ ํ๊ณ , ๋ฉค๋ฒ ์๋น์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ด์ผ ํ๋ค. ์ด ์์กด๊ด๊ณ๊ฐ ์๋ค๊ณ ํํํ๋๋ฐ, ์ปจํธ๋กค๋ฌ๊ฐ ๋ฉค๋ฒ ์๋น์ค๋ฅผ ์์กดํ๋ค๊ณ ํํํ๋ค.
- Controller ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง์ด ๋ฐ ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์คํ๋ง์ด ๋ค๊ณ ์๋ค. ์ด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ด ๊ด๋ฆฌ๋๋ค๊ณ ํํํ๋ค. MVC์ ํ ํ๋ฆฟ ์์ง์ ๊ณต๋ถํ ๋, ์คํ๋ง ์ปจํ ์ด๋์ helloController๋ผ๋ ๊ฒ ์คํ๋ง ๋น์ด๋ค.
- ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
- ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ : Service interface์ ๋ค์ด๊ฐ๋ณด๋ฉด Componenet ์ด๋
ธํ
์ด์
์ด ์๋ค. Service๋ Component์ ํน์ํ๋ ์ผ์ด์ค. Controller, Repository๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋์ ๋ค ๋ฑ๋ก์ ํ๋ค.
- ์๋ฌด๋ฐ๋ @Component๊ฐ ์์ด๋ ๋๋์ง? HelloSpringApplication์ ์คํ์ํค๋ฉด hello.hellospring package์ ๊ทธ ํ์๋ฅผ ์ญ ์ํํ๋ฉฐ Component๊ฐ ์กด์ฌํ๋์ง ์ดํ๋ค. ์ฆ ์์ ๋ค๋ฅธ ํจํค์ง์ ์์ผ๋ฉด ์ค์บ ๋์์ด ๋์ง ์๋๋ค.
- ์ฐธ๊ณ ) ์คํ๋ง์ ์คํ๋ง ์ปจํ ๋์ด๋ค ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ ์ฑ๊ธํค์ผ๋ก ๋ฑ๋กํ๋ค. ์ ์ผํ๊ฒ ํ๋๋ง ๋ฑ๋กํด์ ๊ณต์ ํ๋ค๋ ๋ป์ด๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์คํ๋ง ๋น์ด๋ฉด ๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค๋ค. ์ค์ ์ผ๋ก ์ฑ๊ธํค์ด ์๋๊ฒ ์ค์ ํ ์ ์์ง๋ง, ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ๋๋ถ๋ถ ์ฑ๊ธํค์ ์ ์ธํ๋ค.
- ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ : Service interface์ ๋ค์ด๊ฐ๋ณด๋ฉด Componenet ์ด๋
ธํ
์ด์
์ด ์๋ค. Service๋ Component์ ํน์ํ๋ ์ผ์ด์ค. Controller, Repository๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ์ปดํฌ๋ํธ๊ฐ ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์คํ๋ง ์ปจํ
์ด๋์ ๋ค ๋ฑ๋ก์ ํ๋ค.
์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
- @Service, @Repository, @Autowired ์ด๋ ธํ ์ด์ ์ ์ ๊ฑฐํ๊ณ ์ง์ ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น ๋ฑ๋ก์ ํ ์๋ ์๋ค. ์๋ ์์์ผ ํ๋ค.
- Spring Configure๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ , @Bean ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
- ์๋น์ค์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ ๋ค ๋น์ ๋ฑ๋กํ๊ณ , ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฑ๋ก๋ ๋น์ ์๋น์ค์ ๋ฃ์ด์ฃผ๋ ๊ทธ๋ฆผ์ด๋ค. (helloController -> MemberService -> MemberRepository)
- ๋น์ฐํ Autowired๊ฐ ํธํ๋ฐ, ์ ๋ ๋ค ์ฐ๋๊ฑธ๊น? ์ฅ๋จ์ ์ด ๊ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- DI์๋ ํ๋ ์ฃผ์
, setter ์ฃผ์
, ์์ฑ์ ์ฃผ์
3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- this.memberRepository = memberRepository ์ด๋ฐ ์์ผ๋ก ์์ฑ์๋ฅผ ํตํด ๋ค์ด์ค๋ ๋ฐฉ๋ฒ
- ์์ฑ์๋ฅผ ๋นผ๊ณ , ํ๋์ @Autowired private MemberService memberService๋ก ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ. ์์ข์ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ค๊ฐ์ ๋ฐ๊ฟ์น๊ธฐํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ ์ฌ๋ผ์ง๋ค.
- setter ์ฃผ์ : ์ธํฐ ์์ @Autowired๋ฅผ ํ๋๋ฐ, ๋จ์ ์ ๋๊ตฐ๊ฐ๊ฐ ๋ฉค๋ฒ ์ปจํธ๋กค๋ฌ๋ฅผ ํธ์ถํ์ ๋ public์ด์ด์ผ ํ๋ค๋ ์ . ์ค๊ฐ์ ์๋ชป ๋ฐ๊พธ๋ฉด ๋ฌธ์ ๊ฐ ์๊ธด๋ค. ํ ๋ฒ ์ธํ ์ด ๋ ํ์๋ ๋ฐ๊ฟ ์ผ์ด ์๋ค. ๋ค๋ง ๊ฐ๋ฐ์ ์ต๋ํ ํธ์ถํ์ง ์์์ผํ๋ ๋ฉ์๋๋ ํธ์ถํ์ง ๋ชปํ๋๋ก ํด์ผํ๊ธฐ ๋๋ฌธ์, ์์ฑํ๋ ์์ ์๋ง ๋ฃ๊ณ ๊ทธ ์ดํ์๋ ๋ง๋๋ก ์ฌ์ฉํ๋ค. ์์กด ๊ด๊ณ๊ฐ ์คํ์ค์ ๋์ ์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ๊ฑฐ์ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค.
- ์ํฉ์ ๋ฐ๋ผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฉด ์ค์ ์ ํตํด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค. => ์ด ๊ฐ์์์๋ ๋ฐ์ดํฐ์ ์ฅ์๊ฐ ์ ์ ๋์ง ์์ ๊ฐ์์ ์ํฉ์ด์๊ธฐ ๋๋ฌธ์, MemoryMemberRepository๋ ์ค์ DB์ ์ฐ๊ฒฐํ๋ ๋ฆฌํผ์งํ ๋ฆฌ๋ก ๋ฐ๋ ๊ฒ์ด๋ค. ์ด์ ๋๋จธ์ง ์ฝ๋๋ ํ๋๋ ์๋์ง ์๊ณ ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ฅผ ์ฌ์ฉํ๋ค. ์ํฉ์ ๋ฐ๋ผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ฐ๋๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ฆฌ
- ์ปดํฌ๋ํธ ์ค์บ์ @Component ์ ๋ ธํ ์ด์ ์ ํตํด ์ด๋ฃจ์ด์ง๋ค. @Component๊ฐ ์์ผ๋ฉด ์คํ๋ง์ ์ปดํฌ๋ํธ ์ค์บ์ ํตํด ํด๋น ๋ฉ์๋๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ฌ ์๋์ผ๋ก ์์กด๊ด๊ณ๋ฅผ ์ค์ ํด์ค๋ค. ์ด๋ ์์กด๊ด๊ณ๋, A๊ฐ B๋ฅผ ํตํด ํน์ ๊ธฐ๋ฅ์ ํ๋ค๋ฉด A๊ฐ B๋ฅผ ์์กดํ๋ค๊ณ ํํํ๋ค. ํด๋น ๊ฐ์์์ ์ปจํธ๋กค๋ฌ๊ฐ memberService๋ฅผ ์์กดํ๋ค. memberService๋ฅผ ํตํด ํ์๊ฐ์ (join ๊ธฐ๋ฅ), ๋ฐ์ดํฐ ์กฐํ(findMembers)๋ฅผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.