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();
}
๊ทธ๋๋ ์๋๋ฑ๋ก์ ์ฌ์ฉํ๊ณ ์ถ๋ค? ๊ทธ๋ ๋ค๋ฉด ์ต์ํ ๊ฐ์ ํจํค์ง ๋ด๋ถ์ ๋ฌถ์ด๋์ด ๋ฑ ๋ณด๊ณ ๋๊ตฌ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ํ์.
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring / Bean Scope (0) | 2023.02.11 |
---|---|
Spring / ์คํ๋ง ๋น Life-cycle callback (0) | 2023.02.10 |
Spring / @Qualifier, @Primary (0) | 2023.02.07 |
Spring / ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ์ฝ๋ ์ต์ ํ (0) | 2023.02.06 |
Spring / ์์กด๊ด๊ณ ์ฃผ์ - @Autowired ์ต์ ์ฒ๋ฆฌ, ์์ฑ์ ์ฃผ์ ์ฌ์ฉ ๊ถ์ฅ (0) | 2023.02.06 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422