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

์ด๊ฐ€์€ยท2024๋…„ 4์›” 11์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
4/13
post-thumbnail

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

ํ™”๋ฉด ๊ตฌ์ถ•์„ ์œ„ํ•ด์„œ๋Š” Controller์™€ View Template์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋Ÿฌ๋ฉด MemberController๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”๋ฐ, MemberController๋Š” MemberService๋ฅผ ํ†ตํ•ด์„œ ํšŒ์›๊ฐ€์ž…๊ณผ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ด€๊ณ„๋ฅผ MemberController๊ฐ€ MemberService์— ์˜์กดํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๐ŸŽˆ ์Šคํ”„๋ง ๋นˆ

์Šคํ”„๋ง์ด ์ฒ˜์Œ์— ๋œฐ ๋•Œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ, ๊ฑฐ๊ธฐ์— @Controller์ด ์žˆ์œผ๋ฉด MemberController ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์–ด๋‘”๋‹ค. ์ด๋ ‡๊ฒŒ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ์–ด๋‘๋ฉด ์Šคํ”„๋ง์ด ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋ฉฐ, ์ด ๊ณผ์ •์„ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์Šคํ”„๋ง ๋นˆ์ด ๊ด€๋ฆฌ๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

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

@Controller
public class MemberController {
    private final MemberService memberService; //์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ฐ›์•„์จ์•ผ ํ•˜๋Š” ์ž…์žฅ

    @Autowired
    public MemberController(MemberService memberService) { //์ƒ์„ฑ์ž
        this.memberService = memberService;
    }
}
  1. controller ํŒจํ‚ค์ง€์— MemberController ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

๐ŸŽˆ @Autowired
์ƒ์„ฑ์ž์— @Autowired๊ฐ€ ์žˆ์œผ๋ฉด ์Šคํ”„๋ง์ด ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ฐพ์•„์„œ ๋„ฃ์–ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์˜์กด๊ด€๊ณ„๋ฅผ ์™ธ๋ถ€์—์„œ ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์„ DI(Dependency Injection), ์˜์กด์„ฑ ์ฃผ์ž…์ด๋ผ ํ•œ๋‹ค. ์ด์ „ ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ฃผ์ž…ํ–ˆ๊ณ , ์—ฌ๊ธฐ์„œ๋Š” @Autowired์— ์˜ํ•ด ์Šคํ”„๋ง์ด ์ฃผ์ž…ํ•ด์ค€๋‹ค.

๐ŸŽˆ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

MemberService๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋Š” ์˜ค๋ฅ˜์ด๋‹ค.

MemberController์˜ @Autowired๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ memberService๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ, memberService๊ฐ€ ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์ด ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

@Service
public class MemberService {}

@Repository
public class MemoryMemberRepository implements MemberRepository {}

โœ” MemberService์— @Service๋ฅผ ์„ ์–ธํ•˜๊ณ , MemoryMemberRepository์— @Repository๋ฅผ ์„ ์–ธํ•˜๋ฉด ๊ฐ๊ฐ์ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋˜์–ด ์—๋Ÿฌ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

โž• ์Šคํ”„๋ง์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ, ๊ธฐ๋ณธ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค(์œ ์ผํ•˜๊ฒŒ ํ•˜๋‚˜๋งŒ ๋“ฑ๋กํ•ด์„œ ๊ณต์œ ํ•œ๋‹ค) ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์Šคํ”„๋ง ๋นˆ์ด๋ฉด ๋ชจ๋‘ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋‹ค. ์„ค์ •์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ด ์•„๋‹ˆ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

๐ŸŽˆ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•˜๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•

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

๐Ÿ“– ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ์›๋ฆฌ

@Component ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ์œผ๋ฉด ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.
@Controller๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ ์ด์œ ๋„ ์ปดํฌ๋„ŒํŠธ ์Šค์บ” ๋•Œ๋ฌธ์ด๋‹ค.
@Component๋ฅผ ํฌํ•จํ•˜๋Š” @Controller, @Service, @Repository ์–ด๋…ธํ…Œ์ด์…˜๋„ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.

๐ŸŽˆ ์Šคํ”„๋ง ๋นˆ ์ž๋™ ๋“ฑ๋ก ์œ ์˜์‚ฌํ•ญ

โœ” ์Šคํ”„๋ง ๋นˆ ์ž๋™ ๋“ฑ๋ก์€ ํ•˜์œ„ ํŒจํ‚ค์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์ด๋ฃจ์–ด์ง„๋‹ค.

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

MemberService์™€ MemberRepository์˜ @Service, @Repository, @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ฑฐํ•˜๊ณ  ์ง„ํ–‰

@Configuration
public class SpringConfig {

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  1. hello.hellospring์— SpringConfig ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  2. @Bean์„ ํ†ตํ•ด memberService๋ฅผ ๋“ฑ๋กํ•ด์ค€๋‹ค. ์ด๋•Œ, MemberService์—๋Š” ์ƒ์„ฑ์ž์—์„œ memberRepository๊ฐ€ ํ•„์š”ํ•˜๋‹ค. memberRepository๋„ Bean์œผ๋กœ ๋“ฑ๋กํ•ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์Šคํ”„๋ง์ด ๋œฐ ๋•Œ SpringConfig๋ฅผ ์ฝ๊ณ  @Bean ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹ฌ๋ฆฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋˜๊ณ , ์Šคํ”„๋ง ๋นˆ์— ๋“ฑ๋ก๋˜์–ด ์žˆ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋“ค์„ MemberService์— ๋„ฃ์–ด์ค€๋‹ค.

๐ŸŽˆ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋กํ–ˆ์„ ๋•Œ์˜ ์žฅ์ 

์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋ณ€๋™ ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๋ฉด, ์—ฌ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ @Configuration์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ๋‹ค๋ฅธ ๊ฒƒ์„ ์ˆ˜์ •ํ•  ํ•„์š”์—†์ด ์ด ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด DB๋ฅผ ์—ฐ๊ฒฐํ•œ DbMemberRepositroy๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•˜๋ฉด, SpringConfig ํด๋ž˜์Šค์—์„œ return ๊ฐ’์„ DbMemberRepository๋กœ ๋ณ€๊ฒฝ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๐ŸŽˆ ์˜์กด์„ฑ ์ฃผ์ž…(DI) 3๊ฐ€์ง€ ๋ฐฉ๋ฒ•

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

ํ•„๋“œ ์ฃผ์ž… : ๋ณ€ํ˜•์„ ์ž์œ ๋กญ๊ฒŒ ํ•  ์ˆ˜ ์—†๋‹ค
setter ์ฃผ์ž… : public์œผ๋กœ ์—ด๋ ค์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— public์œผ๋กœ ๋…ธ์ถœ๋˜์–ด ์žˆ์–ด์•ผ ํ•ด์„œ ์œ„ํ—˜ํ•˜๋‹ค
์ƒ์„ฑ์ž ์ฃผ์ž… : ์กฐ๋ฆฝ ์‹œ์ ์— ์ƒ์„ฑ์ž๋กœ ํ•œ ๋ฒˆ๋งŒ ์กฐ๋ฆฝํ•ด๋†“๊ณ  ์ดํ›„๋กœ๋Š” ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค

์˜์กด๊ด€๊ณ„๊ฐ€ ์‹คํ–‰์ค‘์— ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์œผ๋ฏ€๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค.

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ 

profile
๊ฐ€๋ฟก์ด์˜ ๊ณต๋ถ€ ์ƒ์ž๐Ÿ“ฆ

0๊ฐœ์˜ ๋Œ“๊ธ€