# Spring / List,Map์„ ์ด์šฉํ•œ ๋™์ผํƒ€์ž… ๋นˆ ์‚ฌ์šฉ, ์ž๋™๊ณผ ์ˆ˜๋™์˜ ์˜ฌ๋ฐ”๋ฅธ ์‹ค๋ฌด ์šด์˜ ๊ธฐ์ค€
Study Repository

Spring / List,Map์„ ์ด์šฉํ•œ ๋™์ผํƒ€์ž… ๋นˆ ์‚ฌ์šฉ, ์ž๋™๊ณผ ์ˆ˜๋™์˜ ์˜ฌ๋ฐ”๋ฅธ ์‹ค๋ฌด ์šด์˜ ๊ธฐ์ค€

by rlaehddnd0422

๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด DiscountPolicy๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ FixDiscountPolicy์™€ RateDiscountPolicy๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด Spring๊ณผ List, Map์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ„์™€๊ฐ™์€ ์ „๋žต ํŒจํ„ด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

package hello.core.AutoWiredTest;

import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.List;
import java.util.Map;

public class AllMyBeanTest {

    static class DiscountService {
        private final Map<String, DiscountPolicy> policyMap;
        private final List<DiscountPolicy> policies;

        @Autowired
        public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
            this.policyMap = policyMap;
            this.policies = policies;
            System.out.println("policyMap = " + policyMap);
            System.out.println("policies = " + policies);
        }

        public int getDiscountPrice(Member member, int price, String discountCode) {
            DiscountPolicy discountPolicy = policyMap.get(discountCode);
            return discountPolicy.discount(member,price);
        }
    }

    @Test
    void AllBeansTest()
    {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);
        String[] beanDefinitionNames = ac.getBeanDefinitionNames();
        for (String beanDefinitionName : beanDefinitionNames) {
            BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
            if(beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATION)
            {
                System.out.println("beanDefinitionName = " + beanDefinitionName);
            }
            
        }
        
        Member member = new Member(1L,"kdo6301", Grade.VIP);
        MemberService memberService = ac.getBean(MemberService.class);
        memberService.join(member);
        DiscountService discountService = ac.getBean(DiscountService.class);
        int discountPrice = discountService.getDiscountPrice(member,10000,"fixDiscountPolicy");

        Assertions.assertThat(discountPrice).isEqualTo(1000);

    }
}

 

new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ์ž์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋ฐ, ์—ฌ๊ธฐ์— AutoAppConfig์™€ DiscountService๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ–ˆ๋‹ค. ์ฆ‰ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋นˆ ๋“ฑ๋ก.

๋“ฑ๋กํ•˜๊ณ  ๋‚œ ๋’ค์˜ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ

 

์ฃผ์ž…

  • Map<String, DiscountPolicy> policyMap : Key(String)์— ์Šคํ”„๋ง ๋นˆ ์ด๋ฆ„(BeanDefinitionName), Value(DiscountPolicy) ํ•ด๋‹น ๋นˆ ์ด๋ฆ„๊ณผ ๋งค์นญ๋˜๋Š” DiscountPolicy๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • List<DiscountPolicy> : DiscountPolicy ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•œ ๋ชจ๋“  ์Šคํ”„๋ง ๋นˆ์ด ๋‹ด๊ธด๋‹ค.

 

 

๋กœ์ง

DiscountService์˜ policyMap์— ์ฃผ์ž…๋œ <๋นˆ์ด๋ฆ„, ๋นˆ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” ๋นˆ>์„ ํ†ตํ•ด

discount ๋ฉ”์†Œ๋“œ์—์„œ ์ž…๋ ฅ๋œ discountCode String์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ฒจ String์— ๋งž๋Š” ๋นˆ์„ ์ฐพ์•„์„œ ์‹คํ–‰

 

 

 

 

 

์ž๋™ ๋นˆ ๋“ฑ๋ก, ์ˆ˜๋™ ๋นˆ๋“ฑ๋ก ์–ด๋–ค ๊ฑธ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ??

 

@ComponentScan, @Component๋ฅผ ์ด์šฉํ•œ ์ž๋™ ๋“ฑ๋ก ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์ž.

์ ์  ์ž๋™์„ ์„ ํ˜ธํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค. 

Spring์—์„œ๋Š” @Component ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ @Controller, @Service, @Repository์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ๊ณ„์ธต์— ๋งž์ถ”์–ด ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

๊ฑฐ๊ธฐ์— ๋”ํ•ด์„œ ์ตœ๊ทผ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” @ComponentScan์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๋‹ค์–‘ํ•œ ์Šคํ”„๋ง ๋นˆ๋“ค๋„ ์กฐ๊ฑด์ด ๋งž์œผ๋ฉด ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๋‹ค.

 

 

๊ทธ๋Ÿฌ๋ฉด @Bean์„ ์ด์šฉํ•œ ์ˆ˜๋™ ๋“ฑ๋ก์€ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํฌ๊ฒŒ ์—…๋ฌด ๋กœ์ง ๋นˆ๊ณผ ๊ธฐ์ˆ  ์ง€์› ๋นˆ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

 

์—…๋ฌด ๋กœ์ง ๋นˆ์ด๋ผ๊ณ  ํ•จ์€ ์›น์„ ์ง€์›ํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š”  ์„œ๋น„์Šค, ๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ. โ–ถ๏ธŽ ์ฃผ๋กœ ์ž๋™ ๋นˆ ๋“ฑ๋ก ์‚ฌ์šฉ

 

๊ธฐ์ˆ  ์ง€์› ๋นˆ์ด๋ผ๊ณ  ํ•จ์€ ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ, ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ (AOP)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋นˆ. DB ์—ฐ๊ฒฐ์ด๋‚˜ ๊ณตํ†ต ๋กœ๊ทธ์ฒ˜๋ฆฌ๊ฐ™์€ ์—…๋ฌด ๋กœ์ง์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๊ณตํ†ต ๊ธฐ์ˆ . โ–ถ๏ธŽ ์ฃผ๋กœ ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก ์‚ฌ์šฉ

 

๊ธฐ์ˆ ์ง€์›๋กœ์ง์€ ์—…๋ฌด๋กœ์ง๊ณผ ๋น„๊ตํ•ด์„œ ๊ทธ ์ˆ˜๊ฐ€ ๋งค์šฐ ์ ๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋–„๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋””์—์„œ ๋ฌธ์ œ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ˆ˜๋™ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์ข‹๋‹ค.

 

+ ๋‹คํ˜•์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ์—…๋ฌด ๋กœ์ง์€ ์ˆ˜๋™ ๋“ฑ๋ก์„ ๊ณ ๋ฏผํ•ด๋ณด์ž.

 

์œ„์™€ ๊ฐ™์ด ์ž๋™ ๋“ฑ๋ก ๋นˆ DiscountPolicy์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ policy map์—์„œ๋Š” DiscountPolicy์— ์–ด๋–ค ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ํ™•์ธํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

๋ฌผ๋ก  command + option + B ๋‹จ์ถ•ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„์ฒด๊ฐ€ ์–ด๋–ค๊ฒŒ ์žˆ๋Š”์ง€ ๋ณผ ์ˆœ ์žˆ์ง€๋งŒ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ์—” ์–ด๋ ต๋‹ค.

 

์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋œ๋‹ค. 

@Configuration
  public class DiscountPolicyConfig {
      @Bean
      public DiscountPolicy rateDiscountPolicy() {
          return new RateDiscountPolicy();
      }
      @Bean
      public DiscountPolicy fixDiscountPolicy() {
          return new FixDiscountPolicy();
      }

๊ทธ๋ž˜๋„ ์ž๋™๋“ฑ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค? ๊ทธ๋ ‡๋‹ค๋ฉด ์ตœ์†Œํ•œ ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋‚ด๋ถ€์— ๋ฌถ์–ด๋‘์–ด ๋”ฑ ๋ณด๊ณ  ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์ž.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ