[Spring] 4.์Šคํ”„๋ง ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„

 

1. ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๊ณ  ์˜์กด๊ด€๊ณ„ ์„ค์ •ํ•˜๊ธฐ

- ํšŒ์› ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํšŒ์›์„œ๋น„์Šค์™€ ํšŒ์› ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์˜์กด๊ด€๊ณ„ ์„ค์ • = ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋ฅผ ์˜์กดํ•˜๊ฒŒ๋” ๋งŒ๋“ค๊ธฐ

 

* ํšŒ์› ์ปจํŠธ๋กค๋Ÿฌ์— ์˜์กด๊ด€๊ณ„ ์ถ”๊ฐ€

ใ„ด controller - MemberController

@Controller
public class MemberController {
 // member service๋Š” ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•ด์„œ ๊ณต์šฉ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด ๋ผ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๋งŒ๋“คํ•„์š”๊ฐ€ ์—†๋‹ค.
 // private final MemberService memberService = new MemberService();
 
 @Autowired
 public MemberController(MemberService memberService) {
   this.memberService = memberService;
 }
 
}

@Controller ์–ด๋…ธํ…Œ์ด์…˜

-> ์Šคํ”„๋ง ์‹œ์ž‘ํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ์ฒด ์ƒ์„ฑํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ๊ณ  ๊ด€๋ฆฌํ•ด์คŒ

 

@Autowired ์–ด๋…ธํ…Œ์ด์…˜

-> ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋œฐ ๋•Œ memberController ์ƒ์„ฑํ•˜๋Š”๋ฐ, ์ƒ์„ฑ์ž ํ˜ธ์ถœํ•˜๋Š”๋ฐ, ์ƒ์„ฑ์ž์— autowired ์žˆ์œผ๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” memberservice๋ฅผ ๊ฐ€์ ธ์™€ ์—ฐ๊ฒฐ์‹œ์ผœ์คŒ (์ค‘๋ณต์œผ๋กœ ์ƒ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ์ด์œ )

-> memberService์— @serviceํ•ด์ค˜์•ผ controller์ชฝ์—์„œ ์˜ค๋ฅ˜์•ˆ๋œธ

 

* ํšŒ์› ์„œ๋น„์Šค ์ˆ˜์ •

ใ„ด service - MemberController

@Service
public class MemberService {
  private final MemberRepository memberRepository;
  
  @Autowired
  public MemberService(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
  }
}

@Service ์–ด๋…ธํ…Œ์ด์…˜

-> ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— memberservice ๋“ฑ๋กํ•ด์คŒ

 

@Autowired ์–ด๋…ธํ…Œ์ด์…˜

-> ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ ˆํฌ ๊ฐ€์ ธ์™€์„œ ์„œ๋น„์Šค๋ž‘ ์—ฐ๊ฒฐ์‹œ์ผœ์คŒ

 

* ํšŒ์› ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์ˆ˜์ •

ใ„ด repository - MemoryMemberRepository

@Repository
public class MemoryMemberRepository implements MemberRepository {
  private static Map<Long, Member> store = new HahsMap<>();
  private static long sequence = 0L;
  
  @Override
  public Member save(Member member) {
    member.setId(++sequence);
    store.put(member.getId(), member);
    return member;
  }
  
}

@Repository ์–ด๋…ธํ…Œ์ด์…˜

-> ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋กํ•ด์คŒ

 

-----์ด๋ ‡๊ฒŒ ํ•ด๋†“์œผ๋ฉด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ / ์„œ๋น„์Šค / ๋ ˆํฌ ๋ฅผ ์‹น ๊ฐ€์ ธ์™€์คŒ ------

 

 

1) Controller

- ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ค˜์•ผํ•จ (์ƒ์„ฑ์ž์— autowired ์‚ฌ์šฉ)

   ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ๋  ๋•Œ ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” ๋ฉค๋ฒ„์„œ๋น„์Šค ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ๋‹ค ๋„ฃ์–ด์คŒ

 

2) Service

- ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์„œ๋น„์Šค์™€ ๋ ˆํฌ ์—ฐ๊ฒฐ์‹œ์ผœ์ค˜์•ผํ•จ (์ƒ์„ฑ์ž์— autowired ์‚ฌ์šฉ)

   ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™

 

 

** ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

1) ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •

- @Controller / @Service / @Repository ๋ง๊ณ  ์›๋ž˜ @Component ์ž„

- @Component ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋จ (์ปดํฌ๋„ŒํŠธ ์Šค์บ”)

 

> ์Šค์บ”์€ HellopspringApplication์ด ํฌํ•จ๋œ ํŒจํ‚ค์ง€ ํ•˜์œ„๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก

> ์Šคํ”„๋ง์€ ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ ๋“ฑ๋กํ• ๋•Œ [์‹ฑ๊ธ€ํ†ค]์œผ๋กœ ๋“ฑ๋ก (์ปจํ…Œ์ด๋„ˆ / ์„œ๋น„์Šค / ๋ ˆํฌ) = ํ•˜๋‚˜๋งŒ ๋“ฑ๋กํ•ด์„œ ๊ณต์œ 

    orderService์—์„œ memberRepo ๋˜‘๊ฐ™์€๊ฑฐ ๋‹ฌ๋ผ๊ณ  ํ• ์ˆ˜์žˆ์Œ

    = ๊ฐ™์€ ์Šคํ”„๋ง ๋นˆ์ด๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค

 

2) ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ

๋ฐ–์— SpringConfig.class ์ƒ์„ฑ (application์ด๋ž‘ ๋™์ผํ•œ ๋ ˆ๋ฒจ)

@Configuration
public class SpringConfig {
  
  @Bean
  public MemberService memberService() {
    return new MemberService(memberRepository());
  }
  
  @Bean
  public MemberRepository memberRepository() {
    return new MemoryMemberRepository();
  }
}

 

>์žฅ๋‹จ์  ์กด์žฌ

1) xml ํ•  ๋•Œ ์ž๋ฐ”์ฝ”๋“œ๋กœ ์ง์ ‘ ์‚ฌ์šฉ

2) DI์—๋Š” [ํ•„๋“œ ์ฃผ์ž…], [setter ์ฃผ์ž…], [์ƒ์„ฑ์ž ์ฃผ์ž…] ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

    a) [์ƒ์„ฑ์ž ์ฃผ์ž…] ์ƒ์„ฑ์ž ํ†ตํ•ด์„œ ์„œ๋น„์Šค๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฃผ์ž…๋จ

    b) [ํ•„๋“œ ์ฃผ์ž…]์ƒ์„ฑ์ž ๋นผ๊ณ  ํ•„๋“œ์— @Autowired private MemberService memberService; -> ์ด๋ ‡๊ฒŒ ์ฃผ์ž…ํ• ์ˆ˜๋„์žˆ์Œ (๊ถŒ์žฅX, ์ˆ˜์ •๋ถˆ๊ฐ€)

    c) [setter ์ฃผ์ž…] setMemberServiceํ•จ์ˆ˜๋กœ ์ฃผ์ž… -> ๋ˆ„๊ตฐ๊ฐ€ memberContorller๋ฅผ ํ˜ธ์ถœํ–ˆ์„๋•Œ publicํ•˜๊ฒŒ ๋…ธ์ถœ์ด ๋จ (์ž˜๋ชป๋ฐ”๊พธ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋จ) // ํ•œ๋ฒˆ ์„ธํŒ…ํ•˜๋ฉด ๋ฐ”๊ฟ€์ผ์ด ์—†๊ธดํ•จ

 

> ์š”์ฆ˜ ๊ถŒ์žฅํ•˜๋Š” ์Šคํƒ€์ผ -> ์ƒ์„ฑ์ž ์ฃผ์ž… (์ปจํ…Œ์ด๋„ˆ ์˜ฌ๋ผ๊ฐ€๋Š” ์‹œ์ ์— ์ƒ์„ฑ๋˜๊ณ  ๋๋‚จ)

> ์‹คํ–‰์ค‘์—(๋Ÿฐํƒ€์ž„) ๋ฐ”๋€Œ์ง„ ์•Š์Œ -> ๋ฐ”๋€”๋•Œ๋Š” ์ฝ”๋“œ ์ˆ˜์ • ํ›„ ๋‹ค์‹œ ์‹คํ–‰

> ์‹ค๋ฌด์—์„œ๋Š” (์ปจํŠธ๋กค๋Ÿฌ/์„œ๋น„์Šค/๋ ˆํฌ)๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ์‚ฌ์šฉ (์ •ํ˜•ํ™”๋œ)

   ์ •ํ˜•ํ™”๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌํ˜„ ํด๋ž˜์Šค ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋ฉด ์„ค์ •์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

> ์ฃผ์˜) @Autowired๋ฅผ ํ†ตํ•œ DI๋Š” ์ปจํŠธ๋กค๋Ÿฌ/์„œ๋น„์Šค ๋“ฑ ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์—์„œ๋งŒ ๋™์ž‘! (๋‚ด๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์—์„œ๋Š” ๋™์ž‘X)

  • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ์— ๊ณต์œ ํ•˜๊ธฐ
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ ํ•˜๊ธฐ