[Spring Intro] Section 04. ์คํ๋ง ๋น๊ณผ ์์กด๊ด๊ณ_์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ , ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
# ์คํ๋ง ๋น์ ๋ฑ๋กํ๊ณ ์์กด๊ด๊ณ ์ค์ ํ๊ธฐ
์ง๋ Section3์์ ๊ตฌ์ถํ๋ ๋ฐฑ์๋ ๊ธฐ๋ฅ์ ํ๋ฉด์ ๋ถ์ฌ๋ณด์.
ํ๋ฉด ๊ตฌ์ถ์ ์ํด์๋ Controller์ View Template์ด ํ์ํ๋ค.
๊ทธ๋ฌ๋ ค๋ฉด MemberController๋ฅผ ๋ง๋ค์ด์ผ ํ๋๋ฐ,
MemberController๋ MemberService๋ฅผ ํตํด์ ํ์๊ฐ์ ๊ณผ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ค.
์ด๋ฌํ ๊ด๊ณ๋ฅผ 'MemberController๊ฐ MemberService์ ์์กดํ๋ค'๊ณ ํํํ๋ค.
@Controller : ์คํ๋ง์ด ์ฒ์์ ๋ฐ ๋ ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๊ธฐ๋๋ฐ,
์ด๋ @Controller๊ฐ ์์ผ๋ฉด ๊ฐ์ฒด(์ฌ๊ธฐ์์๋ MemberController)๋ฅผ ์์ฑํด์
์คํ๋ง ์ปจํ ์ด๋์ ๋ฃ์ด ๋ . ์ด๋ ๊ฒ ์ปจํ ์ด๋์ ๋ฃ์ด๋๋ฉด ์คํ๋ง์ด ๊ด๋ฆฌํ๊ฒ ๋จ.
์ด ๊ณผ์ ์ ์คํ๋ง ์ปจํ ์ด๋์์ ์คํ๋ง ๋น์ด ๊ด๋ฆฌ๋๋ค ๊ณ ํํํ๋ค.
์๋ ์ฌ์ง์ ํตํด ์ข ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
# ํ์ ์ปจํธ๋กค๋ฌ์ ์์กด๊ด๊ณ ์ถ๊ฐ
ํ์ ์ปจํธ๋กค๋ฌ
src/main/java/hello.hellospring/controller/MemberController.java
package hello.hellospring.controller;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
์์ฑ์์ @Autowired๊ฐ ์์ผ๋ฉด ์คํ๋ง์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ
์ด๋์์ ์ฐพ์์ ๋ฃ์ด์ค๋ค.
์ด๋ ๊ฒ ๊ฐ์ฒด ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ DI(Dependency Injection), ์์กด์ฑ ์ฃผ์
์ด๋ผ ํ๋ค.
์ด์ ํ
์คํธ์์๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฃผ์
ํ๊ณ , ์ฌ๊ธฐ์๋ @Autowired์ ์ํด ์คํ๋ง์ด ์ฃผ์
ํด์ค๋ค.
# ์ค๋ฅ ๋ฐ์
Consider defining a bean of type 'hello.hellospring.service.MemberService' in your configuration.
๊ทธ๋ฌ๋ ์ฝ๋๋ฅผ ์คํ์์ผ๋ณด๋ฉด, @Autowired๋ฅผ ์ฌ์ฉํ์์๋ ์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
memberService๊ฐ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ง ์๋ค๋ ์ค๋ฅ์ธ๋ฐ, ๊ทธ ์ด์ ๋ฅผ ์์ธํ ์ดํด๋ณด์.
์ฐธ๊ณ
helloController๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ์ปจํธ๋กค๋ฌ์ฌ์ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
@Controller๊ฐ ์์ด๋ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
MemberController์ @Autowired๋ฅผ ํตํด ์คํ๋ง ์ปจํ ์ด๋์์ memberService๋ฅผ ๊ฐ์ ธ์์ผ ํ๋๋ฐ,
MemberController๋ annotation์ ๊ฑธ์ด๋์๊ธฐ ๋๋ฌธ์ ์๋ ๋ฑ๋ก๋์ง๋ง
memberService๋ ์์ํ ์๋ฐ ํด๋์ค์ด๊ธฐ ๋๋ฌธ์ ์คํ๋ง์ด ์ด๋ฅผ ์ธ์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.
์ด๋, MemberService์์ @Service๋ฅผ ์ ์ธํ๊ณ ,
MemoryMemberRepository์ @Repository๋ฅผ ์ ์ธํ๋ฉด
๊ฐ๊ฐ์ด ์คํ๋ง ์ปจํ ์ด๋์ ๋ฑ๋ก๋๋ค.
# ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ
- ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์
- ์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
# ์ปดํฌ๋ํธ ์ค์บ ์๋ฆฌ
- @Component ์ ๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
- @Controller ์ปจํธ๋กค๋ฌ๊ฐ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋ ์ด์ ๋ ์ปดํฌ๋ํธ ์ค์บ ๋๋ฌธ์ด๋ค.
- @Component๋ฅผ ํฌํจํ๋ ๋ค์ ์ ๋ ธํ ์ด์ ๋ ์คํ๋ง ๋น์ผ๋ก ์๋ ๋ฑ๋ก๋๋ค.
- @Controller
- @Service
- @Repository
@Controller๋ฅผ ํตํด ์ธ๋ถ ์์ฒญ์ ๋ฐ๊ณ ,
@Service์์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ง๋ค๊ณ ,
@Repository์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ๋ณดํต ์ ํํ๋ ํจํด์ด๋ค.
# ํ์ ์๋น์ค ์คํ๋ง ๋น ๋ฑ๋ก
java/hello/hellospring/service/MemberService.java
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
์ฐธ๊ณ : ์์ฑ์์ @Autowired๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ์์ฑ ์์ ์ ์คํ๋ง ์ปจํ ์ด๋์์ ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
(์์ฑ์๊ฐ 1๊ฐ๋ง ์์ผ๋ฉด @Autowired๋ ์๋ตํ ์ ์๋ค.)
# ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ ์คํ๋ง ๋น ๋ฑ๋ก
java/hello/hellospring/repository/MemoryMemberRepositoryTest.java
@Repository
public class MemoryMemberRepository implements MemberRepository {}
# ์คํ๋ง ๋น ๋ฑ๋ก ์ด๋ฏธ์ง
> ์ด๋ ๊ฒ memberService์ memberRepository๊ฐ ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์๋ค.
์ ๊ณผ์ ๋ค์ด ๊ฐ์ฒด ์์กด๊ด๊ณ๋ฅผ ์ธ๋ถ์์ ๋ฃ์ด์ฃผ๋ DI(Dependency Injection), ์์กด์ฑ ์ฃผ์
์ด๋ค.
# ์ฃผ์
์ฐ๋ฆฌ๋ HelloSpringApplication์ ์คํํ๊ธฐ ๋๋ฌธ์
hello.hellospring ํจํค์ง๋ฅผ ํฌํจํ ๋ชจ๋ ํ์ ์์๋ค์
์คํ๋ง์ด ์ ๋ถ ์ปดํฌ๋ํธ ์ค์บ์ ์คํํ๋ค.
ํ์ง๋ง ๊ทธ ์ด์ธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ์คํํ์ง ์๋๋ค.
(์ ์ฌ์ง์์ demo ์์น์ ํจํค์ง์ ๊ทธ ํ์ ์์์ธ demo.java์
@Service์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฃ์ด๋ ์ค์บ์ ํ์ง ์๋๋ค.)
# ์ฑ๊ธํค์ ๋ํด
์คํ๋ง์ ์คํ๋ง ์ปจํ
์ด๋์ ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋, ๊ธฐ๋ณธ์ผ๋ก ์ฑ๊ธํค์ผ๋ก ๋ฑ๋กํ๋ค(์ ์ผํ๊ฒ ํ๋๋ง ๋ฑ๋กํด์ ๊ณต์ ํ๋ค).
๋ฐ๋ผ์ ๊ฐ์ ์คํ๋ง ๋น์ด๋ฉด ๋ชจ๋ ๊ฐ์ ์ธ์คํด์ค๋ค.
์ค์ ์ผ๋ก ์ฑ๊ธํค์ด ์๋๊ฒ ์ค์ ํ ์ ์์ง๋ง, ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๋ฉด ๋๋ถ๋ถ ์ฑ๊ธํค์ ์ฌ์ฉํ๋ค.
ex ) ์ ์คํ๋ฆฐ ๋น ๋ฑ๋ก ์ด๋ฏธ์ง์ ์ํ์์
orderService๊ฐ @Autowired๋ฅผ ํตํด memberRepository๊ฐ ํ์ํ๋ค๊ณ ํ๋ฉด ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋ฃ์ด์ค๋ค.
(์ค์ ์ผ๋ก memberRepository๋ฅผ @Autowired ํ ๋ ๋ง๋ค ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๋ฃ๋๋ก ํ ์ ์์)
์๋ฐ ์ฝ๋๋ก ์ง์ ์คํ๋ง ๋น ๋ฑ๋กํ๊ธฐ
์์ํ๊ธฐ ์ด์ ์ ์์ ์์ฑํ๋ ํ์ ์๋น์ค์ ํ์ ๋ฆฌํฌ์งํ ๋ฆฌ์
@Service, @Repository, @Autowired ์ ๋ ธํ ์ด์ ์ ์ ๊ฑฐํ๊ณ ์งํํ๋ค.
!! MemberController์ @Autowired๋ ์ ๊ฑฐํ์ง ์๋ ๊ฒ์ ์ฃผ์ํ์. !!
# ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น ๋ฑ๋ก
java/hello.hellospring/SpringConfig.java
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Bean์ ํตํด memberService์ memberRepository๋ฅผ ๊ฐ๊ฐ ์คํ๋ง ๋น์ ๋ฑ๋กํ๊ณ
return new MemberService(memberRepository())์์
์คํ๋ง ๋น์ ๋ฑ๋ก๋์ด ์๋ memberRepository๋ฅผ memberService์ ๋ฃ์ด์ค๋ค. (@Autowired์ ๊ฐ์ ํจ๊ณผ)
์๋ฃํ๋ฉด ์๋ฐ ์ฝ๋๋ฅผ ํตํ ์คํ๋ง ๋น ๋ฑ๋ก์ผ๋ก ์ด์ ์ปดํฌ๋ํธ ์ค์บ๊ณผ ๊ฐ์ ๊ตฌ์กฐ๊ฐ ์์ฑ๋๋ค.
์ปดํฌ๋ํธ ์ค์บ์ผ๋ก ์๋ ์์กด๊ด๊ณ ์ค์ vs ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น ๋ฑ๋ก
โ๏ธ XML๋ก ์ค์ ํ๋ ๋ฐฉ์์ด ์์ง๋ง ์ต๊ทผ์๋ ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์๋ตํ๋ค.
โ๏ธ DI์๋ ํ๋ ์ฃผ์
, setter ์ฃผ์
, ์์ฑ์ ์ฃผ์
์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
# ํ๋ ์ฃผ์
@Controller
public class MemberController {
@Autowired private MemberService memberService;
...
> ๋ณํ์ ์์ ๋กญ๊ฒ ํ ์ ์๋ค๋ ๋จ์ ์ด ์์
# setter ์ฃผ์
@Controller
public class MemberController {
private MemberService memberService;
public void setMemberService(MemberService memberService) {
this.memberService = memberService;
}
}
> ๋๊ตฐ๊ฐ๊ฐ MemberController๋ฅผ ํธ์ถํ์๋ setMemberService๊ฐ public์ผ๋ก ์ด๋ ค์์ด์ผ ํจ
setMemberService๋ ํ๋ฒ ์ธํ ๋๋ฉด ์ ๋ฐ๋์ง ์๋๋ฐ publicํ๊ฒ ๋ ธ์ถ๋๋ค๋ ๋จ์ ์ด ์์
# ์์ฑ์ ์ฃผ์
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
> ์กฐ๋ฆฝ ์์ ์ ์์ฑ์๋ก ํ ๋ฒ๋ง ์กฐ๋ฆฝํด๋๊ณ ์ดํ๋ก๋ ๋ณ๊ฒฝํ์ง ๋ชปํ๋๋ก ๋ง๋ ๊ฒ์ด ๊ฐ๋ฅํจ
์์กด๊ด๊ณ๊ฐ ์คํ ์ค์ ๋์ ์ผ๋ก ๋ณํ๋ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ผ๋ฏ๋ก ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค.
โ๏ธ ์ค๋ฌด์์๋ ์ฃผ๋ก ์ ํํ๋ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๊ฐ์ ์ฝ๋๋ ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ ํํ ๋์ง ์๊ฑฐ๋, ์ํฉ์ ๋ฐ๋ผ ๊ตฌํ ํด๋์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ฉด ์ค์ ์ ํตํด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
- ์ฐ๋ฆฌ๋ ์์ง ๋ฐ์ดํฐ ์ ์ฅ์๊ฐ ์ ์ ๋์ง ์์๋ค๋ ๊ฒ์ ์ ์ ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ์ผ๋ฏ๋ก
์ดํ์ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ค๋ฅธ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๋ฐ๊ฟ์ผ ํจ.
์ด๋ ๊ธฐ์กด์ ์ด์ ์ค์ธ ์ฝ๋๋ฅผ ํ๋๋ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐ๊ฟ ์ ์๋๋ก ํ๊ธฐ ์ํด
์ปดํฌ๋ํธ ์ค์บ ๋ฐฉ์ ๋์ ์๋ฐ ์ฝ๋๋ก ์คํ๋ง ๋น์ ์ค์ ํ๋ค.
-> SpringConfig ํ์ผ์ memberRepository์์ return new MemoryMemberRepository()๋ฅผ
์ดํ์ return new dbMemberRepository()๋ก๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค! ์์ฃผ ์ฌ์.
โ๏ธ ์ฃผ์ : @Autowired๋ฅผ ํตํ DI๋ helloController , memberService ๋ฑ๊ณผ ๊ฐ์ด ์คํ๋ง์ด ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์์๋ง ๋์ํ๋ค.
์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ์ง ์๊ณ ๋ด๊ฐ ์ง์ ์์ฑํ ๊ฐ์ฒด์์๋ ๋์ํ์ง ์๋๋ค.
โ๏ธ ์คํ๋ง ์ปจํ ์ด๋, DI ๊ด๋ จ๋ ์์ธํ ๋ด์ฉ์ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ฐ์์์ ์ค๋ช ํ๋ค.
๋ด์ฉ ๋ฐ ์ด๋ฏธ์ง ์ถ์ฒ : ๊น์ํ์ ์คํ๋ง ์ ๋ฌธ