[Spring] - Spring Bean

Bean

์Šคํ”„๋ง ๋นˆ์€ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ” ๊ฐ์ฒด(POJO; Plain Old Java Object)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

IntelliJ๋กœ ์Šคํ”„๋ง ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด @RestController, @Service ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ ํด๋ž˜์Šค์˜ ์™ผ์ชฝ์„ ๋ณด๋ฉด ์กฐ๊ทธ๋งŒํ•œ ์ฝฉ(๐Ÿซ˜) ๊ฐ™์€๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์— ์ถ”๊ฐ€ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์™œ ๋นˆ์„ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ? ์šฐ๋ฆฌ๊ฐ€ @RestController ์–ด๋…ธํ…Œ์ด์…˜์„ ๋นผ๊ณ  ์‹คํ–‰ํ•˜๋ฉด, ํ•ด๋‹น ์ปจํŠธ๋กค๋Ÿฌ์— ์žˆ๋Š” API๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰๊ณผ ๋นˆ์ด ์–ด๋–ค ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž!

Spring Container

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์˜ ์ฃผ์š” ์—ญํ• ์€ ๋นˆ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ ๊ด€๋ฆฌ, ์ƒ์„ฑ๋œ ๋นˆ์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

Spring Bean์ด ์ถ”๊ฐ€๋˜๋Š” ๊ณต๊ฐ„์€ ๋ฐ”๋กœ Spring Container๋ผ๋Š” ๊ณณ์ด๋‹ค.
์–ด๋–ค ๊ณผ์ •์„ ๊ฑฐ์ณ ์ปจํ…Œ์ด๋„ˆ์— ๋นˆ์ด ๋“ฑ๋ก๋˜๋Š”์ง€ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๊ณผ์ •์„ ๋ณด๋ฉด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

0. ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ PasswordEncoder๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋“ฑ๋กํ•œ๋‹ค.

@Configuration
public class AppConfig {
    @Bean
    public PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }

    @Bean
    public ModelMapper modelMapper(){
        return new ModelMapper();
    }
}

์ด์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜๋Š” ์ด์œ ๋Š”, ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•˜๊ณ  ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ฆ‰, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋ฉด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

@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();
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ์˜ˆ์‹œ๋กœ ์ด ์„ค์ • ํŒŒ์ผ์ด ์–ด๋–ค ๋ฐฉ์‹์„ ๊ฑฐ์ณ์„œ ๋“ฑ๋ก๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž!

1. ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

ApplicationContext๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
์œ„์—์„œ ์ž‘์„ฑํ•œ AppConfig์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ AnnotationConfigApplicationContext์—๊ฒŒ ๋„˜๊ฒจ์ค€๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ํ†ตํ•ด @Configuration, @Component, @Service ๋“ฑ๊ณผ ๊ฐ™์€ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด๋Š” ๊ฒƒ์ด๋‹ค.

// ApplicationContext ์ธํ„ฐํŽ˜์ด์Šค
// AnnotationConfigApplicationContext ๊ตฌํ˜„์ฒด
ApplicationContext applicationContext = 
                new AnnotationConfigApplicationContext(AppConfig.class);

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

![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-13 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 44 13](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/831e3b52-2119-4e93-8b9c-f294f4639761)

2. ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์•ž์„œ AppConfig์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ํ† ๋Œ€๋กœ ์Šคํ”„๋ง ๋นˆ ์ €์žฅ์†Œ์— ๋“ฑ๋ก์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-13 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 10 54 59](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/3ce02815-6261-40e0-b57f-ab032023bb20)

์ด ๋•Œ, ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ๋นˆ ์ด๋ฆ„, ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ๋ฐ˜ํ™˜ ๊ฐ์ฒด๋ฅผ ๋นˆ ๊ฐ์ฒด๋กœ ๋“ฑ๋กํ•œ๋‹ค.
๋นˆ์˜ ์ด๋ฆ„์„ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ @Bean(name="...")์„ ํ†ตํ•ด์„œ ์ง์ ‘ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ ˆ๋Œ€! ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋ถ€์—ฌํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๊ธฐ์กด ๋นˆ์„ ๋ฎ์–ด๋ฒ„๋ฆฌ๊ฑฐ๋‚˜, ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

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

memberService์—์„œ memberRepository๋ฅผ ์˜์กดํ•˜๊ณ , orderService์—์„œ memberRepository์™€ discountPolicy๋ฅผ ์˜์กดํ•œ๋‹ค.

![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-13 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 01 52](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/75062b4a-febc-432b-973e-641c7c2ada47)![แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-09-13 แ„‹แ…ฉแ„Œแ…ฅแ†ซ 11 02 18](https://github.com/Jwhyee/Jwhyee.github.io/assets/82663161/695c6ad1-5ca0-4547-8177-05241747421e)

์ด๋ ‡๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ค์ • ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š”๋ฐ, ์ด๋ฅผ DI(Dependency Injection)๋ผ๊ณ  ํ•œ๋‹ค.

Reference

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ