๋น์ฆ๋์ค ์๊ตฌ์ฌํญ๊ณผ ์ค๊ณ
ํ์
- ํ์์ ๊ฐ์ ํ๊ณ ์กฐํํ ์ ์๋ค.
- ํ์์ ์ผ๋ฐ๊ณผ VIP ๋ ๊ฐ์ง ๋ฑ๊ธ์ด ์๋ค.
- ํ์ ๋ฐ์ดํฐ๋ ์์ฒด DB ๋ฅผ ๊ตฌ์ถํ ์ ์๊ณ , ์ธ๋ถ ์์คํ ๊ณผ ์ฐ๋ํ ์ ์๋ค.
์ฃผ๋ฌธ๊ณผ ํ ์ธ ์ ์ฑ
- ํ์์ ์ํ์ ์ฃผ๋ฌธํ ์ ์๋ค.
- ํ์ ๋ฑ๊ธ์ ๋ฐ๋ผ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ ์ ์๋ค.
- ํ ์ธ ์ ์ฑ ์ ๋ชจ๋ VIP ๋ 1000์์ ํ ์ธํด์ฃผ๋ ๊ณ ์ ๊ธ์ก ํ ์ธ์ ์ ์ฉํ๋ค.
- ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ํ์ฌ์ ๊ธฐ๋ณธ ํ ์ธ ์ ์ฑ ์ ์์ง ์ ํ์ง ๋ชปํ๊ณ , ์คํ ์ง์ ๊น์ง ๊ณ ๋ฏผ์ ๋ฏธ๋ฃจ๊ณ ์ถ๋ค. ์ต์ ์ ๊ฒฝ์ฐ ํ ์ธ์ ์ ์ฉํ์ง ์์ ์ ์๋ค.
ํ์ ๋๋ฉ์ธ ์ค๊ณ
ํ์ ๋๋ฉ์ธ ํ๋ ฅ ๊ด๊ณ
ํ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
ํ์ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
Web MVC ๊ฐ๋ฐ
ํ์ ์น ๊ธฐ๋ฅ - ํ ํ๋ฉด ์ถ๊ฐ
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
/
๊ฒฝ๋ก๋ก ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ์ GetMapping ์ ํตํด ์์ฒญ์ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ์๋๋ ค ๋ก์ง์ ์ํํ๋ค.
์ปจํธ๋กค๋ฌ๋ ์ ์ ํ์ผ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ธฐ ๋๋ฌธ์, ์์ฒญ์ด ๋ค์ด์์ ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋จผ์ ์กฐํํ์ฌ ํด๋น ์์ฒญ์ ๋ฐ์ ์ ์๋ ์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ค.
๋๋ฌธ์, ๊ธฐ์กด์ static ์์ ์๋ index.html
์ด ๋ฐํ๋์ง ์๊ณ , templates ์์ home.html
์ ๋ ๋๋งํ์ฌ ์๋ตํ๋ค.
ํ์ ์น ๊ธฐ๋ฅ - ๋ฑ๋ก
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@GetMapping(value = "/members/new")
public String createForm() {
return "members/createMemberForm";
}
@PostMapping(value = "/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());
memberService.join(member);
return "redirect:/";
}
}
ํ์ ๋ฑ๋กํ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ ๊ฐ์ด ๊ตฌํํ๋ค.
/members/new
๊ฒฝ๋ก๋ก ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ, ์ ์ปจํธ๋กค๋ฌ๊ฐ ์์ฒญ์ ๋ฐ๊ฒ ๋๊ณ , templates ์์ ์๋ members ๋๋ ํ ๋ฆฌ์ createMemberForm.html
์ ๋ ๋๋งํ์ฌ ์๋ตํ๋ค.
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ํ์ ๋ฑ๋ก ํ์ด์ง๊ฐ ๋์์ง ์ํ์์ POST ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค๋ฉด, PostMapping ์ ํตํด ์์ฒญ์ ๋ฐ๊ฒ๋๋ค.
Form ์ผ๋ก ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ์ฌ ์ปจํธ๋กค๋ฌ๊ฐ ๋ฐ๊ฒ๋๊ณ , ์ด๋ฅผ ๋๋ฉ์ธ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ์ฌ service ๋ ์ด์ด์๊ฒ ์ ๋ฌํ๋ค.
๋ชจ๋ ํ์ ๋ฑ๋ก ๋ก์ง์ด ์ํ๋ ์ดํ redirect:/
๋ฅผ ํตํด ํ ํ๋ฉด์ผ๋ก redirect ํ๋ค.
ํ์ ์น ๊ธฐ๋ฅ - ์กฐํ
@GetMapping(value = "/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
/members
๊ฒฝ๋ก๋ก ์์ฒญ์ด ๋ค์ด์์ ๊ฒฝ์ฐ์ ํ์ ๋ชฉ๋ก์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์์ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
memberService.findMembers();
๋ฅผ ํตํด ๋ฉค๋ฒ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์์จ ํ model ์ attribute ์ add ํด์ค๋ค.
์ดํ templates ์์ ์๋ members ๋๋ ํ ๋ฆฌ์ memberList.html
์ ๋ ๋๋งํ์ฌ ์๋ตํ๋ค.
์ฃผ๋ฌธ๊ณผ ํ ์ธ ๋๋ฉ์ธ ์ค๊ณ
์ฃผ๋ฌธ ๋๋ฉ์ธ ํ๋ ฅ, ์ญํ , ์ฑ ์
์ฃผ๋ฌธ ๋๋ฉ์ธ ์ ์ฒด
์ฃผ๋ฌธ ๋๋ฉ์ธ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ฃผ๋ฌธ ๋๋ฉ์ธ ๊ฐ์ฒด ๋ค์ด์ด๊ทธ๋จ
์ ์ฅ์๋ ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝํด๋ ์๋น์ค ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
์๋ก์ด ํ ์ธ ์ ์ฑ ๊ฐ๋ฐ
RateDiscountPolicy ์ถ๊ฐ
์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ๊ณผ ๋ฌธ์ ์
ํ ์ธ ์ ์ฑ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํด๋ณด์
ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl
์ฝ๋๋ฅผ ๊ณ ์ณ์ผ ํ๋ค.
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
...
}
์ฃผ๋ฌธ์๋น์ค ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl
๋ ์ฌ์ค ์ธํฐํ์ด์ค๋ ์์กดํ๋ฉด์ ๊ตฌํ์ฒด์๋ ์์กดํ๊ณ ์๋ค. ๋ฐ๋ผ์ ํด๋น ์์กด๊ด๊ณ๋ DIP ๋ฅผ ์๋ฐํ๊ณ ์๋ค.
๋ํ, ํ์ฌ ์ฝ๋๋ ๊ธฐ๋ฅ์ ํ์ฅํด์ ๋ณ๊ฒฝํ๋ฉด, ํด๋ผ์ด์ธํธ ์ฝ๋์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ OCP ๋ ์๋ฐํ๋ค.
์ค์ ์์กด๊ด๊ณ
์ธํฐํ์ด์ค๋ง ์์กดํ๋๋ก ์ค๊ณ ๋ณ๊ฒฝ
public class OrderServiceImpl implements OrderService {
private DiscountPolicy discountPolicy;
...
}
์ค์ ์คํํด๋ณด๋ฉด NPE ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋๊ตฐ๊ฐ๊ฐ ํด๋ผ์ด์ธํธ์ธ OrderServiceImpl
์ DiscountPolicy
๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ ์ฃผ์
ํด์ฃผ์ด์ผ ํ๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
AppConfig ๋ฑ์ฅ
์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด ๋์ ๋ฐฉ์์ ๊ตฌ์ฑ(config)ํ๊ธฐ ์ํด, ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ฑ
์์ ๊ฐ์ง๋ ๋ณ๋์ ์ค์ ํด๋์ค, AppConfig
๋ฅผ ์์ฑํ๋ค. AppConfig
๋ ์ ํ๋ฆฌ์ผ์ด์
๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์์ฑํ ๊ฐ์ฒด๋ฅผ ์์ฑ์๋ฅผ ํตํด ์ฃผ์
ํ๋ค.
MemberServiceImpl
์ ์์ฑ์๋ฅผ ํตํด์ ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ ์ง๋ ์ค์ง ์ธ๋ถ์์ ๊ฒฐ์ ๋๊ณ , MemberServiceImpl
์ ์ด์ ๋ถํฐ ์์กด๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ์ธ๋ถ์ ๋งก๊ธฐ๊ณ ์คํ์๋ง ์ง์คํ๋ค.
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
AppConfig
๋ฅผ ํตํด ๊ฐ์ฒด ์์ฑ๊ณผ ์ฐ๊ฒฐ์ ์ญํ ์ ์์ํ๋ค. ์ด๋ฅผ ํตํด DIP ๋ฅผ ์ค์ํ ์ ์๊ฒ๋๋ค.
ํ์ ๊ฐ์ฒด ์ธ์คํด์ค ๋ค์ด์ด๊ทธ๋จ
AppConfig
๋ฅผ ํตํด MemoryMemberRepository
๋ฅผ ์์ฑํ๊ณ MemberServiceImpl
์ ์ฃผ์
ํ๋ค. MemberServiceImpl
์
์ฅ์์๋ ์์กด๊ด๊ณ๊ฐ ๋ง์น ์ธ๋ถ์์ ์ฃผ์
๋๋ ๊ฒ ๊ฐ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ Dependency Injection ์์กด์ฑ ์ฃผ์
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ก์ด ๊ตฌ์กฐ์ ํ ์ธ ์ ์ฑ ์ ์ฉ
ํ ์ธ ์ ์ฑ ์ ๋ณ๊ฒฝ
AppConfig
์ ๋ฑ์ฅ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ์ฌ์ฉ ์์ญ๊ณผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ๋ ์์ญ์ผ๋ก ๋ถ๋ฆฌ๋์๋ค.
ํ ์ธ ์ ์ฑ
์ ๋ณ๊ฒฝํด๋ AppConfig
๋ง ๋ณ๊ฒฝํ๋ฉด ๋๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ ์์ญ์ ์ด๋ค ์ฝ๋๋ ๋ณ๊ฒฝ์ด ์๋ค.
์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ์ฉ
SRP ๋จ์ผ ์ฑ ์ ์์น
๊ธฐ์กด ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์ง์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๊ณ , ์คํํ๋ ๋ค์ํ ์ฑ
์์ ๊ฐ์ง๊ณ ์์๋ค.
AppConfig
๋ฅผ ํตํด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ฒฐํ๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ ์ ์์๋ค.
์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ ์คํํ๋ ์ฑ
์๋ง ๋ด๋นํ ์ ์์๊ณ , SRP ๋ฅผ ์ค์ํ ์ ์์๋ค.
DIP ์์กด๊ด๊ณ ์ญ์ ์์น
์๋ก์ด ํ ์ธ ์ ์ฑ
์ ๊ฐ๋ฐํ๊ณ ์ ์ฉํ๋ ค๊ณ ํ๋, ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
AppConfig
๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์ถ์ํ ์ธํฐํ์ด์ค์๋ง ์์กดํ ์ ์๋๋ก ๋ณ๊ฒฝํ๊ณ , AppConfig
์์ ๊ตฌํ์ฒด๋ฅผ ์์ฑํ์ฌ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ ์ ์๋๋ก ํ์๋ค.
์ด๋ฅผ ํตํด DIP ์ญ์ ์ค์ํ ์ ์์๋ค.
OCP ๊ฐ๋ฐฉ-ํ์ ์์น
๋คํ์ฑ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ DIP ๋ฅผ ์ง์ผฐ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ ์์ญ๊ณผ ๊ตฌ์ฑ ์์ญ์ผ๋ก ๋๋ด๋ค.
AppConfig
๋ฅผ ํตํด ์๋ก์ด ๊ตฌํ์ฒด๋ฅผ ์ฃผ์
ํ๊ฒ ๋๋ฉด, ์ํํธ์จ์ด ์์๋ ์๋กญ๊ฒ ํ์ฅ๋์์ง๋ง, ์ฌ์ฉ ์์ญ์ ๋ณ๊ฒฝ์ ๋ซํ ์์์ ์ ์ ์๋ค. ์ด๋ ๊ฒฐ๊ตญ OCP ๋ฅผ ์ค์ํ๋ ํ์์ด๋ค.
IoC, DI, ์ปจํ ์ด๋
์ ์ด์ ์ญ์ IoC, Inversion of Control
๊ธฐ์กด ํ๋ก๊ทธ๋จ์ ํด๋ผ์ด์ธํธ ๊ตฌํ ๊ฐ์ฒด๊ฐ ์ค์ค๋ก ํ์ํ ์๋ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๊ณ , ์คํํ๋ค.
์ฆ, ๊ตฌํ ๊ฐ์ฒด๊ฐ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ค์ค๋ก ์กฐ์ข
ํ๋ค.
๋ฐ๋ฉด, AppConfig
์ ๋ฑ์ฅ ์ดํ, ๊ตฌํ ๊ฐ์ฒด๋ ์์ ์ ๋ก์ง์ ์คํํ๋ ์ญํ ๋ง ๋ด๋นํ๊ณ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ AppConfig
๊ฐ ๊ฐ์ ธ๊ฐ๋ค.
์ด๋ ๋ฏ, ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ์ ์ง์ ์ ์ดํ๋ ๊ฒ์ด ์๋ ์ธ๋ถ์์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ ์ด์ ์ญ์ ์ด๋ผ๊ณ ํ๋ค.
ํ๋ ์ ์ํฌ vs ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ๋ ์์ํฌ๊ฐ ๋ด๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ์ดํ๊ณ ๋์ ์คํํ๋ฉด ๊ทธ๊ฒ์ ํ๋ ์์ํฌ๋ค. ๋ฐ๋ฉด, ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ง์ ์ ์ด์ ํ๋ฆ์ ๋ด๋นํ๋ค๋ฉด ๊ทธ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๊ฒ์ด๋ค.
์์กด๊ด๊ณ ์ฃผ์ DI, Dependency Injection
์์กด๊ด๊ณ๋ ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ์, ์คํ ์์ ์ ๊ฒฐ์ ๋๋ ๋์ ์ธ ์์กด๊ด๊ณ๋ฅผ ๋ถ๋ฆฌํด์ ์๊ฐํด์ผ ํ๋ค. ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ ํด๋์ค๊ฐ ์ฌ์ฉํ๋ import ์ฝ๋๋ง ๋ณด๊ณ ๋ ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ํ๋จํ ์ ์๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ์ง ์์๋ ๋ถ์ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ค. ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ค์ ์์ฑ๋ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์ฐ๊ฒฐ๋ ์์กด๊ด๊ณ๋ฅผ ์๋ฏธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ์ฌ ์์กด๊ด๊ณ๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ค. ์์กด์ฑ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ ์ ์ธ ํด๋์ค ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ , ๋์ ์ธ ๊ฐ์ฒด ์ธ์คํด์ค ์์กด๊ด๊ณ๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒ์ด๋ค.
IoC ์ปจํ ์ด๋์ DI ์ปจํ ์ด๋
AppConfig ์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ด๋ฆฌํ๊ณ , ์์กด๊ด๊ณ๋ฅผ ์ฐ๊ฒฐํด ์ฃผ๋ ๊ฒ์ IoC ์ปจํ ์ด๋ ํน์ DI ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค. ์์กด๊ด๊ณ ์ฃผ์ ์ ์ด์ ์ ๋ง์ถ์ด ์ต๊ทผ์๋ ์ฃผ๋ก DI ์ปจํ ์ด๋๋ผ๊ณ ํ๋ค.
์คํ๋ง์ผ๋ก ์ ํํ๊ธฐ
์คํ๋ง ์ปจํ ์ด๋
ApplicationContext
๋ฅผ ์คํ๋ง ์ปจํ
์ด๋๋ผ๊ณ ํ๋ค. ๊ธฐ์กด์๋ AppConfig
๋ฅผ ์ฌ์ฉํด ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ DI ํ์ง๋ง, ์ด์ ๋ถํฐ๋ ์คํ๋ง ์ปจํ
์ด๋๋ฅผ ํตํด ์ฌ์ฉํ๋ค.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
์คํ๋ง ์ปจํ
์ด๋๋ @Configuration
์ด ๋ถ์ AppConfig
๋ฅผ ์ค์ (๊ตฌ์ฑ) ์ ๋ณด๋ก ์ฌ์ฉํ๋ค.
์ฌ๊ธฐ์ @Bean
์ด๋ผ ์ ํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํธ์ถํด์ ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋กํ๋ค.
์คํ๋ง ์ปจํ
์ด๋์ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ด๋ผ๊ณ ํ๋ฉฐ, ๋ฉ์๋๋ช
์ ์คํ๋ง ๋น์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ค.
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 10000);
System.out.println("order = " + order);
}
}
๊ธฐ์กด AppConfig
๋ง์ ์ฌ์ฉํ ๋๋ ํ์ํ ๊ฐ์ฒด๋ฅผ AppConfig
๋ฅผ ์ฌ์ฉํด ์ง์ ์กฐํํ์ง๋ง, ์ด์ ๋ถํฐ๋ ์คํ๋ง ์ปจํ
์ด๋๋ฅผ ํตํด์ ํ์ํ ์คํ๋ง ๋น์ ์ฐพ์์ผ ํ๋ค.
์คํ๋ง ๋น์ ์์ ๊ฐ์ด applicationContext.getBean()
์ ํตํด ์ฐพ์ ์ ์๋ค.
์ด๋ก์จ, ๊ฐ์ฒด๋ฅผ ์คํ๋ง ๋น์ ๋ฑ๋กํ๊ณ ์คํ๋ง ์ปจํ
์ด๋์์ ์คํ๋ง ๋น์ ์ฐพ์์ ์ฌ์ฉํ ์ ์๋ค.
์ฝ๋๊ฐ ๋ ๋ณต์กํด์ง ๊ฒ ๊ฐ์๋ฐ, ๊ตณ์ด ์คํ๋ง ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํด์ผํ ๊น? ๋ฌด์จ ์ฅ์ ์ด ์์๊น?