• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

Spring Study - 4

14 Dec 2020

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

๋ชฉ์ฐจ

  1. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ •
  2. ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ•˜๊ธฐ

์ˆ˜๊ฐ• ์ฝ”์Šค๋Š” ์ธํ”„๋Ÿฐ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


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

  • ํ™”๋ฉด์„ ๋ถ™์ด๊ธฐ ์œ„ํ•ด ์ปจํŠธ๋กค๋Ÿฌ, ๋ทฐ ํ…œํ”Œ๋ฆฟ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฉค๋ฒ„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•˜๋Š”๋ฐ, ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…์„ ํ•˜๊ณ , ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ด ์˜์กด๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ํ‘œํ˜„ํ•˜๋Š”๋ฐ, ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฉค๋ฒ„ ์„œ๋น„์Šค๋ฅผ ์˜์กดํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.
  • Controller ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์ด ๋œฐ ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์Šคํ”„๋ง์ด ๋“ค๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์Šคํ”„๋ง ๋นˆ์ด ๊ด€๋ฆฌ๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๊ณต๋ถ€ํ•  ๋•Œ, ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— helloController๋ผ๋Š” ๊ฒŒ ์Šคํ”„๋ง ๋นˆ์ด๋‹ค.
  • ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•
    1. ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์˜์กด๊ด€๊ณ„ ์„ค์ • : Service interface์— ๋“ค์–ด๊ฐ€๋ณด๋ฉด Componenet ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋‹ค. Service๋Š” Component์˜ ํŠน์ˆ˜ํ™”๋œ ์ผ€์ด์Šค. Controller, Repository๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋‹ค ๋“ฑ๋ก์„ ํ•œ๋‹ค.
      • ์•„๋ฌด๋ฐ๋‚˜ @Component๊ฐ€ ์žˆ์–ด๋„ ๋˜๋Š”์ง€? HelloSpringApplication์„ ์‹คํ–‰์‹œํ‚ค๋ฉด hello.hellospring package์™€ ๊ทธ ํ•˜์œ„๋ฅผ ์ญ‰ ์ˆœํšŒํ•˜๋ฉฐ Component๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์‚ดํ•€๋‹ค. ์ฆ‰ ์•„์˜ˆ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€์— ์žˆ์œผ๋ฉด ์Šค์บ” ๋Œ€์ƒ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.
      • ์ฐธ๊ณ ) ์Šคํ”„๋ง์€ ์Šคํ”„๋ง ์ปจํ…Œ๋‹ˆ์–ด๋„ค ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. ์œ ์ผํ•˜๊ฒŒ ํ•˜๋‚˜๋งŒ ๋“ฑ๋กํ•ด์„œ ๊ณต์œ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์Šคํ”„๋ง ๋นˆ์ด๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋‹ค. ์„ค์ •์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ด ์•„๋‹ˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์‹ฑ๊ธ€ํ†ค์„ ์ œ์™ธํ•œ๋‹ค.

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

  • @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๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
    1. this.memberRepository = memberRepository ์ด๋Ÿฐ ์‹์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•
    2. ์ƒ์„ฑ์ž๋ฅผ ๋นผ๊ณ , ํ•„๋“œ์— @Autowired private MemberService memberService๋กœ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•. ์•ˆ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๊ฐ„์— ๋ฐ”๊ฟ”์น˜๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์•„์˜ˆ ์‚ฌ๋ผ์ง„๋‹ค.
    3. setter ์ฃผ์ž… : ์„ธํ„ฐ ์œ„์— @Autowired๋ฅผ ํ•˜๋Š”๋ฐ, ๋‹จ์ ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฉค๋ฒ„ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ public์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์ . ์ค‘๊ฐ„์— ์ž˜๋ชป ๋ฐ”๊พธ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค. ํ•œ ๋ฒˆ ์„ธํŒ…์ด ๋œ ํ›„์—๋Š” ๋ฐ”๊ฟ€ ์ผ์ด ์—†๋‹ค. ๋‹ค๋งŒ ๊ฐœ๋ฐœ์€ ์ตœ๋Œ€ํ•œ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„์•ผํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋Š” ํ˜ธ์ถœํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์—๋งŒ ๋„ฃ๊ณ  ๊ทธ ์ดํ›„์—๋Š” ๋ง‰๋„๋ก ์‚ฌ์šฉํ•œ๋‹ค. ์˜์กด ๊ด€๊ณ„๊ฐ€ ์‹คํ–‰์ค‘์— ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ๊ฑฐ์˜ ๊ฑฐ์˜ ์—†์œผ๋ฏ€๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฉด ์„ค์ •์„ ํ†ตํ•ด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. => ์ด ๊ฐ•์˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ์ €์žฅ์†Œ๊ฐ€ ์„ ์ •๋˜์ง€ ์•Š์€ ๊ฐ€์ƒ์˜ ์ƒํ™ฉ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, MemoryMemberRepository๋Š” ์‹ค์ œ DB์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฆฌํผ์ง€ํ† ๋ฆฌ๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค. ์ด์— ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ํ•˜๋‚˜๋„ ์†๋Œ€์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋ฐ”๋€Œ๋Š” ์ƒํ™ฉ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ •๋ฆฌ

  • ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์€ @Component ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค. @Component๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์€ ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์ž๋™์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค. ์ด๋•Œ ์˜์กด๊ด€๊ณ„๋ž€, A๊ฐ€ B๋ฅผ ํ†ตํ•ด ํŠน์ • ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค๋ฉด A๊ฐ€ B๋ฅผ ์˜์กดํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ํ•ด๋‹น ๊ฐ•์˜์—์„  ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ memberService๋ฅผ ์˜์กดํ•œ๋‹ค. memberService๋ฅผ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…(join ๊ธฐ๋Šฅ), ๋ฐ์ดํ„ฐ ์กฐํšŒ(findMembers)๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


springbackend Share Tweet +1