์์กด๊ด๊ณ ์๋ ์ฃผ์
1. ๋ค์ํ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
- ์์ฑ์ ์ฃผ์ (constructor) โ
- ์์ ์ ์ฃผ์ (setter)
- ํ๋ ์ฃผ์
- ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
1. ์์ฑ์ ์ฃผ์
์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ ๊ฒ ๋ณด์ฅ
โ ๋ถ๋ณ, ํ์ ์์กด๊ด๊ณ์ ์ฌ์ฉ
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService{
// final -> ๋ฐ๋์ ๊ฐ์ ํ ๋นํด์ค์ผํ๋ค.(ํ์, ๋ถ๋ณ)
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired // ์์ฑ์๊ฐ ํ ๊ฐ๋ง ์์ ๊ฒฝ์ฐ ์๋ตํด๋ ๋๋ค.
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
// System.out.println("memberRepository = " + memberRepository);
// System.out.println("discountPolicy = " + discountPolicy);
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
...
}
์์ฑ์๊ฐ ํ ๊ฐ๋ง ์์ ๊ฒฝ์ฐ `@Autowired ์๋ต ๊ฐ๋ฅ
2. ์์ ์ ์ฃผ์ (Setter ์ฃผ์ )
ํ๋์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์ ์ ๋ฉ์๋์ธ setter๋ฅผ ํตํด์ ์์กด ๊ด๊ณ ์ฃผ์
์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉ
์๋ฐ๋น ํ๋กํผํฐ ๊ท์ฝ์ ์์ ์ ๋ฉ์๋ ์ฌ์ฉ
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
...
}
โป ์๋ฐ๋น ํ๋กํผํฐ ๊ท์ฝ: ํ๋์ ๊ฐ์ ์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ setter๋ getter ๋ฉ์๋๋ฅผ ํ์ฉํด ๊ฐ์ ์ฝ๊ฑฐ๋ ์์ ํ๋ ๊ท์น
3. ํ๋ ์ฃผ์
์ฝ๋๊ฐ ๋งค์ฐ ๊ฐ๊ฒฐํ๋ ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด ํ ์คํธํ๊ธฐ ํ๋ค๋ค!
๊ฐ๊ธ์ ์ฌ์ฉ ์์ !!
ํ
์คํธ์ฝ๋๋ ์คํ๋ง ์ค์ ๋ชฉ์ ์ผ๋ก ํ๋ @Configuration
๊ฐ์ ๊ณณ์์๋ง ํน๋ณํ ์ฉ๋๋ก ์ฌ์ฉ
// OrederServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
4.์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
ํ๋ฒ์ ์ฌ๋ฌ ํ๋๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์์ผ๋ ์ ์ฌ์ฉํ์ง๋ ์๋๋ค!
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
2. ์ต์ ์ฒ๋ฆฌ
์ฃผ์ ํ ์คํ๋ง ๋น์ด ์์ด๋ ๋ฉ์๋๋ฅผ ๋์ํ๊ฒ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ์ต์ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ค.
์ต์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
@Autowired(required=false)
: ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ ์๋จorg.springframework.lang.@Nullable
: ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด null์ด ์ ๋ ฅ๋๋ค.Optional<>
: ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉดOptional.empty
๊ฐ ์ ๋ ฅ๋๋ค
// AutowiredTest.java
public class AutowiredTest {
@Test
void AutowiredOption() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
static class TestBean {
// ์คํ๋ง ๋น์ ๋ฑ๋ก๋์ง ์์ ๋์ ์ฃผ์
ํด๋ณด๊ธฐ (Member)
// 1. ์์กด ๊ด๊ณ๊ฐ ์์ผ๋ฉด ์์ ํธ์ถ์ด ์๋๋ค
@Autowired(required = false)
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
// 2. null๋ก ํธ์ถ
@Autowired
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
// 3. Optional.empty ํธ์ถ
@Autowired
public void setNoBean3(Optional<Member> noBean3) {
System.out.println("noBean3 = " + noBean3);
}
}
}
// ํ
์คํธ ๊ฒฐ๊ณผ
// 1. ์ ํธ์ถ์ด ์๋๋ค
noBean2 = null
noBean3 = Optional.empty
3. ์์ฑ์ ์ฃผ์ ์ ์ ํํ๋ผ
์ต๊ทผ์๋ ์์ฑ์ ์ฃผ์ ์ด ๊ถ์ฅ๋๋ค
๋ถ๋ณ
โ ๋๋ถ๋ถ ์์กด ๊ด๊ณ ์ฃผ์ ์ ํ๋ฒ ์ผ์ด๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ์์ ๊น์ง ๋ณ๊ฒฝํ ์ผ์ด ์์ผ๋ฉฐ ๊ถ์ฅ๋์ง ์๋๋ค
์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด setter ๋ฉ์๋๋ฅผ public์ผ๋ก ์ด์ฌ๋์ด์ผ ํ๋ค
- ๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ๋ณ๊ฒฝ ์๋๋ ๋ฉ์๋๋ฅผ ์ด์ด๋๋ ๊ฒ์ ์ง์
์์ฑ์ ์ฃผ์ ์ ๊ฐ์ฒด ์์ฑ ์์๋ง 1๋ฒ ํธ์ถ๋๊ณ ์ดํ์ ํธ์ถ๋์ง ์๋๋ค -> ๋ถ๋ณ ์ค๊ณ
๋๋ฝ**
ํ๋ ์์ํฌ ์์ด ์์ํ ์๋ฐ ์ฝ๋ ๋จ์๋ก ์คํ ์(@Autowired
๋์ x)
- ์์ ์ ์ฃผ์ ์์๋ ์คํ์ ๋๋ NPE๋ฐ์
- ์์ฑ์ ๋ฉ์๋์์๋ ์ปดํ์ผ ์ค๋ฅ ๋ฐ์ -> ๋๋ฒ๊น ์ฉ์ด
final
์์ฑ์ ์ฃผ์
์ฌ์ฉ ์ ํ๋์ final
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค -> ์์ฑ์์์ ๊ฐ์ด ์ค์ ๋์ง ์๋ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ์์ ์ ์ก์์ค๋ค
์์ ์ฝ๋
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
// discountPolicy ๋๋ฝ
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
}
//...
}
์ปดํ์ผ ์ค๋ฅ: java: variable discountPolicy might not have been initialized
โป ์ฐธ๊ณ : ์์ ์ ์ฃผ์ ์ ํฌํจํ ๋๋จธ์ง ์ฃผ์ ๋ฐฉ์์ ๋ชจ๋ ์์ฑ์ ์ดํ์ ํธ์ถ๋๋ฏ๋ก, ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ค์ง ์์ฑ์ ์ฃผ์ ๋ฐฉ์๋ง final ํค์๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ
4. ๋กฌ๋ณต๊ณผ ์ต์ ํธ๋ ๋
๋งค๋ฒ ์์ฑ์ ์ฃผ์ ์ฝ๋ ์์ฑํ๊ธฐ ๋ฒ๊ฑฐ๋กญ๋ค! -> ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐฉ๋ฒ
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.7'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
repositories {
mavenCentral()
}
//lombok ์ค์ ์ถ๊ฐ ์์
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
//lombok ์ค์ ์ถ๊ฐ ๋
dependencies {
//lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ์์
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
//lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
- Preferences(์๋์ฐ File Settings) plugin lombok ๊ฒ์ ์ค์น ์คํ (์ฌ์์)
- Preferences Annotation Processors ๊ฒ์ Enable annotation processing ์ฒดํฌ (์ฌ์์)
- ์์์ ํ ์คํธ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ @Getter, @Setter ํ์ธ
๋กฌ๋ณต์ ํ์ฉํ ์์กด๊ด๊ณ ์ฃผ์
๊ธฐ๋ณธ ์ฝ๋
// OrderServiceImpl.java
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
๋กฌ๋ณต ์ ์ฉ
// OrderServiceImpl.java
@Component
@RequiredArgsConstructor // final์ด ๋ถ์ ์ธ์คํด์ค์ ๋ํ ์์ฑ์๋ฅผ ๋ง๋ค์ด ์ค๋ค
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
...
}
โ @RequiredArgsConstructor
: final์ด ๋ถ์ ํ๋๋ฅผ ๋ชจ์์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค
์ต๊ทผ์๋ ์์ฑ์๋ฅผ 1๊ฐ ๋๊ณ @Autowired
๋ฅผ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋ฉด์, Lombok๋ผ์ด๋ธ๋ฌ๋ฆฌ์ @RequiredArgsConstructor
๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ค
5. ์กฐํ ๋น์ด 2๊ฐ ์ด์์ผ ๋
@Autowired
๋ ํ์
์ผ๋ก ์กฐํํ๋ค (ac.getBean(DiscountPolicy.class)
์ ์ ์ฌ) -> ๊ฐ์ ํ์
์ ๋น์ด 2๊ฐ ์ด์์ด๋ฉด ๋ฌธ์ ๋ฐ์!
์์
// FixDiscountPolicy.java
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
// RateDiscountPolicy.java
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
// ์์กด๊ด๊ฒ ์๋ ์ฃผ์
์คํ
@Autowired
private DiscountPolicy discountPolicy
NoUniqueBeanDefinitionException: No qualifying bean of type
'hello.core.discount.DiscountPolicy' available:
expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
NoUniqueBeanDefinitionException
์ค๋ฅ ๋ฐ์
๊ทธ๋ ๋ค๊ณ ํ์ ํ์ ์ผ๋ก ์ง์ ํ๋ฉด DIP ์๋ฐฐ ๋ฐ ์ ์ฐ์ฑ ๊ฐ์! ๊ทธ๋ฆฌ๊ณ ํ์ ํ์ ๋ ๊ฐ์ผ๋ฉด ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
๊ทธ๋ ๋ค๋ฉด...?
6. @Autowired ํ๋ ๋ช
, @Qualifier
, @Primary
์กฐํ ๋์ ๋น์ด 2๊ฐ ์ด์์ผ ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ
@Autowired
ํ๋ ๋ช ๋งค์นญ@Qualifier
->@Qualifier
๋ผ๋ฆฌ ๋งค์นญ -> ๋น ์ด๋ฆ ๋งค์นญ@Primary
์ฌ์ฉ
1. @Autowired
ํ๋ ๋ช
๋งค์นญ
โ @Autowired
๋ ํ์
๋งค์นญ์ ์๋ํ๊ณ , ์ด๋ ์ฌ๋ฌ ๋น์ด ์์ผ๋ฉด ํ๋ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋น ์ด๋ฆ์ ์ถ๊ฐ ๋งค์นญํ๋ค.
@Autowired
// ๊ธฐ์กด ์ฝ๋
// private DiscountPolicy discountPolicy
// ํ๋ ๋ช
์ ๋น ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝ
private DiscountPolicy rateDiscountPolicy
2. @Qualifier
์ฌ์ฉ
โ @Qualifier
๋ฅผ ํตํด ์ถ๊ฐ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ค๋ค (๋น ์ด๋ฆ ๋ณ๊ฒฝ x)
๋น ๋ฑ๋ก์ @Qualifier
๋ถ์ฌ์ฃผ๊ธฐ
// RateDiscountPolicy.java
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
// FixDiscountPolicy.java
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
์ฃผ์
์์ @Qualifier
๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ๋ฑ๋กํ ์ด๋ฆ์ ์ ์ด์ฃผ๊ธฐ
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
ํด๋น qualifier๋ฅผ ๋ชป ์ฐพ์ผ๋ฉด ๋ค์ ๋น ์ด๋ฆ์ผ๋ก ๋งค์นญ์ ํ์ง๋ง qulifier๋ ๊ฐ๊ธ์ qualifier๋ผ๋ฆฌ ๋งค์นญํ๋ ๊ฒ ๊ถ์ฅ!
3. @Primary
์ฌ์ฉ
โ @Primary
: ์ฐ์ ์์ ์ง์
@Autowired
์์ ์ฌ๋ฌ ๋น์ด ๋งค์นญ๋๋ฉด@Primary
๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค
// rateDiscountPolicy ๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
Primary vs Qualifier
@Qualifier
์ ๋จ์ ์ ์ฃผ์
๋ฐ์ ๋ ๋ชจ๋ ์ฝ๋์ @Qualifier
๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค๋ ๊ฒ
๋ฉ์ธ ์ปค๋ฅ์
์ @Primary
๋ฅผ ํ์ฉํด @Qualifier
์ง์ ์์ด ํธํ๊ฒ ์กฐํ
์๋ธ ์ปค๋ฅ์
์ @Qualifier
๋ฅผ ์ง์ ํด ๋ช
์์ ์ผ๋ก ์ปค๋ฅ์
๋น ํ๋
์ฐ์ ์์
์ข์ ๋ฒ์์ @Qualifier
๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค
7. Annotation ์ง์ ๋ง๋ค๊ธฐ
@Qualifier("mainDiscountPolicy")
์ ๊ฐ์ด ๋ฌธ์๋ฅผ ์ ์ผ๋ฉด ์ปดํ์ผ์ ํ์
์ฒดํฌ๊ฐ ์๋๋ค
์ ๋ ธํ ์ด์ ์ ๋ง๋ค์ด์ ๋ฌธ์ ํด๊ฒฐ
package hello.core.annotation;
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
annotation ์ ์ฉ
@Component
@MainDiscountPolicy
public class RateDiscountPolicy implements DiscountPolicy {}
// OrderServiceImpl.java
//์์ฑ์ ์๋ ์ฃผ์
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
annotation์๋ ์์ ๊ธฐ๋ฅ์ด ์๋ค
์์ ๊ฐ์ด ์ฌ๋ฌ anntotation์ ๋ชจ์์ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ java๊ฐ ์๋๋ผ ์คํ๋ง์์ ์ง์ํด์ฃผ๋ ๊ธฐ๋ฅ
๋ค๋ฅธ annotation๋ ์กฐํฉ / ์ฌ์ ์ํ ์ ์์ผ๋ ๊ฐ๊ธ์ ์ง์
8. List, Map : ์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋
โ ์๋์ ์ผ๋ก ํด๋น ํ์ ์ ์คํ๋ง ๋น์ด ๋ชจ๋ ํ์ํ ๊ฒฝ์ฐ -> List, Map ํ์ฉํด ์ ๋ตํจํด ๊ตฌํ
ex) ํ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํ๋๋ฐ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ํ ์ธ์ ์ข ๋ฅ(rate, fix) ์ ํ ๊ฐ๋ฅ
์์ ์ฝ๋
package hello.core.autowired;
import hello.core.AutoAppConfig;
import hello.core.discount.DiscountPolicy;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.scan.AutoAppConfigTest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
public class allBeanTest {
@Test
void findAllBean() {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy");
Assertions.assertThat(discountService).isInstanceOf(DiscountService.class);
Assertions.assertThat(discountPrice).isEqualTo(1000);
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
Assertions.assertThat(rateDiscountPrice).isEqualTo(2000);
}
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 discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}
๋ก์ง
DiscountService๋ Map์ผ๋ก ๋ชจ๋ DiscoutPolicy
์ฃผ์
๋ฐ๋๋ค (fixDiscountPolicy
& rateDiscountPolicy
)
๋ฉ์๋ discount()
๋ doscountCode๋ก ๋์ด์จ discountPolicy์ ๋ง๋ ์คํ๋ง ๋น์ ์ฐพ์์ ์คํํ๋ค
์ฃผ์
Map<String, DiscountPolicy>
: ํค์ ์คํ๋ง ๋น์ ์ด๋ฆ์, ๊ฐ์ผ๋ก DiscountPolicy ํ์
์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ค๋ค.
List<DiscountPolicy>
: DiscountPolicy ํ์
์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ค๋ค.
๋ง์ฝ ํด๋นํ๋ ํ์ ์ ์คํ๋ง ๋น์ด ์์ผ๋ฉด, ๋น ์ปฌ๋ ์ ์ด๋ Map์ ์ฃผ์
9. ์๋, ์๋์ ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ์ค
๊ธฐ๋ณธ์ผ๋ก๋ ํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ ์ฌ์ฉ
์คํ๋ง์ด ๋์ค๊ณ ์๊ฐ์ด ์ง๋ ์๋ก ์๋ ์ ํธ ์ถ์ธ
@Component
๋ฟ๋ง ์๋๋ผ @Controller
, @Service
, @Repository
์ฒ๋ผ ๊ณ์ธต์ ๋ง์ถ์ด ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ์๋์ผ๋ก ์ค์บํ ์ ์๋๋ก ์ง์
์คํ๋ง๋ถํธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๊ณ ๋ค๋ฅธ ์คํ๋ง ๋น๋ค๋ ์กฐ๊ฑด์ด ๋ง์ผ๋ฉด ์๋์ผ๋ก ๋๋ฅต๋๋๋ก ์ค๊ณ
์๋ ๋น ๋ฑ๋ก์ ๋ก์ง์ ๋ฐ๋ผ ์ฌ์ฉ
โ ์ ๋ฌด ๋ก์ง ๋น
- ์น์ ์ง์ํ๋ ์ปจํธ๋กค๋ฌ, ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค, ๋ฐ์ดํฐ ๊ณ์ธต์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ
- ๋ณดํต ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ
โ ๊ธฐ์ ์ง์ ๋น
- ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ ๊ณตํต ๊ด์ฌ์ฌ(AOP)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋,๊ณตํต ๋ก๊ทธ ์ฒ๋ฆฌ์ฒ๋ผ ์ ๋ฌด ๋ก์ง์ ์ง์ํ๊ธฐ ์ํ ํ๋ถ ๊ธฐ์ ์ด๋ ๊ณตํต ๊ธฐ์ ๋ฑ
์
๋ฌด ๋ก์ง์ ์ซ์๋ ๋งค์ฐ ๋ง๊ณ ํ๋ฒ ๊ฐ๋ฐํ๋ฉด ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ ์ ์ฌํ ํจํด ์กด์ฌ
-> ์๋ ๊ธฐ๋ฅ ์ฌ์ฉ
๊ธฐ์ ์ง์ ๋ก์ง์ ์๊ฐ ์๋์ ์ผ๋ก ์ ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ ๊ฑธ์ณ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๊ณ , ๋ฌธ์ ๋ฐ์ ์ ๋๋ฒ๊น
์ด๋ ค์
-> ์๋ ๋น ๋ฑ๋ก ์ฌ์ฉ
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ธฐ์ ์ง์ ๊ฐ์ฒด๋ ์๋ ๋น์ผ๋ก ๋ฑ๋กํด์ ์ค์ ์ ๋ณด์ ๋ฐ๋ก ๋ํ๋๊ฒ ํ๋ ๊ฒ์ด ์ ์ง๋ณด์ ํ๊ธฐ ์ข๋ค
๋น์ฆ๋์ค ๋ก์ง ์ค์์ ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ ๋
์์ List, Map๊ณผ ๊ฐ์ด ๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ ๊ฒฝ์ฐ ํ์ ์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ต๋ค
โ ์๋ ๋น์ผ๋ก ๋ฑ๋กํ๊ฑฐ๋ ์๋์ผ๋ก ํ๋ฉด ํน์ ํจํค์ง์ ๊ฐ์ด ๋ฌถ์ด๋๊ธฐ
์์ ์ฝ๋
@Configuration
public class DiscountPolicyConfig {
@Bean
public DiscountPolicy rateDiscountPolicy() {
return new RateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy() {
return new FixDiscountPolicy();
}
}
์ค์ ์ ๋ณด์ ์์กด๊ด๊ณ ์ฃผ์ ์ ๋ณด๊ฐ ํ ๋์ ํ์ ๋๋ค
'โญ Personal_Study > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Page ๊ฐ์ฒด์ Collections ๋ฉ์๋๋ฅผ ์ ์ฉํ์ ๋ UnsupportedOperationException ๋ฐ์ ์๋ฌ (0) | 2023.03.30 |
---|---|
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.01.10 |
ComponentScan (0) | 2023.01.07 |
Singleton Container (0) | 2023.01.06 |
์คํ๋ง ์ปจํ ์ด๋ & Bean ์กฐํ (0) | 2023.01.05 |
๋๊ธ