๐ ๋ค์ํ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ
โ ์์ฑ์ ์ฃผ์
@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;
}
}
- ์์ฑ์๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ
- ํด๋์ค์ ์์ฑ์๊ฐ ๋ฑ 1๊ฐ ์์ผ๋ฉด @Autowired๋ฅผ ์๋ตํด๋ ์๋ ์ฃผ์ ๋จ
- ์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ๋จ
- ๋ถ๋ณ, ํ์ ์์กด๊ด๊ณ์ ์ฌ์ฉ
โ ์์ ์ ์ฃผ์
@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๋ฅผ ํตํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
- ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉ
โ ํ๋ ์ฃผ์
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
}
- ํ๋์ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์ง๋ง ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด์ ํ ์คํธ ํ๊ธฐ ํ๋ค๋ค๋ ๋จ์ ์ด ์๋ค.
- DI ํ๋ ์์ํฌ๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ฝ๋์ ๊ด๊ณ์๋ ํ ์คํธ์ฝ๋๋ ์คํ๋ง ์ค์ ์ ๋ชฉ์ ์ผ๋ก ํ๋ @Configuration ๊ฐ์ ๊ณณ์์๋ง ํน๋ณํ ์ฉ๋๋ก ์ฌ์ฉํ์.
๐ ์ต์ ์ฒ๋ฆฌ
์ฃผ์ ํ ์คํ๋ง ๋น์ด ์์ด๋ ๋์ํด์ผ ํ ๋๊ฐ ์๋ค. ํ์ง๋ง @Autowired๋ง ์ฌ์ฉํ๋ฉด required ์ต์ ์ ๊ธฐ๋ณธ๊ฐ์ด true๋ก ๋์ด ์์ด์ ์๋ ์ฃผ์ ๋์์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
โ ์๋ ์ฃผ์ ๋์์ ์ต์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ
//ํธ์ถ ์์ฒด๊ฐ ์๋จ
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("setNoBean1 = " + member);
}
//null ํธ์ถ
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("setNoBean2 = " + member);
}
//Optional.empty ํธ์ถ
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("setNoBean3 = " + member);
}
- @Autowired(required=false) : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ์ด ๋์ง ์์
- org.springframework.lang.@Nullable : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด null์ด ์ ๋ ฅ๋๋ค.
- Optional<> : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด Optional.empty๊ฐ ์ ๋ ฅ๋๋ค.
๐ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ์
โ ๋ถ๋ณ
- ๋๋ถ๋ถ์ ์์กด๊ด๊ณ ์ฃผ์ ์ ํ๋ฒ ์ผ์ด๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์์ ๊น์ง ์์กด๊ด๊ณ๊ฐ ๋ณํ๋ฉด ์๋๋ค.
- ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด setter๋ฅผ public์ผ๋ก ์ด์ด๋์ด์ผ ํ๋ค.
- ๋๊ตฐ๊ฐ ์ค์๋ก ๋ณ๊ฒฝํ ์ ์๊ณ ๋ณ๊ฒฝํ๋ฉด ์๋๋ ๋ฉ์๋๋ฅผ ์ด์ด๋๋ ๊ฒ์ ์ข์ ์ค๊ณ ๋ฐฉ์์ด ์๋
- ์์ฑ์ ์ฃผ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฑ ํ๋ฒ๋ง ํธ์ถ๋๋ฏ๋ก ์ดํ์ ํธ์ถ๋๋ ์ผ์ด ์๋ค. ์ฆ ๋ถ๋ณํ๊ฒ ์ค๊ณํ ์ ์๋ค.
โ ๋๋ฝ
- final ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์ ์ธ๊ณผ ๋์์ ํ ๋นํด์ฃผ์ด์ผ ํ๋๋ฐ ์์ฑ์์์ ํ ๋นํ ์ ์๋ค.
- final ๋ณ์์ ๊ฐ์ด ๋๋ฝ๋๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์์กด ๊ด๊ณ ์ฃผ์ ์ ๋๋ฝ์ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
→ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๊ณ , ํ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์๋ ์์ ์ ์ฃผ์ ๋ฐฉ์์ ์ต์ ์ผ๋ก ๋ถ์ฌํ์. ํ๋ ์ฃผ์ ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
๐ ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ต์ ํธ๋ ๋
- ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ @RequiredArgsConstructor ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด final์ด ๋ถ์ ํ๋๋ฅผ ๋ชจ์์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค.
- ์ต๊ทผ์๋ ์์ฑ์๋ฅผ ๋ฑ 1๊ฐ ๋๊ณ , @Autowired๋ฅผ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์ Lombok ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ @RequiredArgConstructor๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ธฐ๋ฅ์ ๋ค ์ ๊ณตํ๋ฉด์ ์ฝ๋๋ ๊น๋ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
์ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ dependencies์์ ์ถ๊ฐํด ์ค ์๋ ์๋ค.
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
...
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
...
}
๐ ์กฐํ ๋น์ด 2๊ฐ ์ด์์ผ ๋ ๋ฌธ์
- @Autowired๋ ํ์ ์ผ๋ก ์กฐํํ๋ค. -> ac.getBean(DiscountPolicy.class)์ ์ ์ฌํ๊ฒ ๋์
- ๊ฐ์ ํ์ ์ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋ก(RateDiscountPolicy, FixDiscountPolicy)ํ๊ณ ์์ ํ์ ์ ๊ฐ์ฒด(DiscountPolicy)์ ์์กด๊ด๊ณ ์ฃผ์ ์ ์คํํ๋ฉด NoUniqueBeanDefinitionException์ด ๋ฐ์ํ๋ค.
โ @Autowired ํ๋ ๋ช
@Autowired
private DiscountPolicy rateDiscountPolicy
- @Autowired๋ ๋จผ์ ํ์ ๋งค์นญ์ ์๋ํ๊ณ , ์ด๋ ์ฌ๋ฌ ๋น์ด ์์ผ๋ฉด ํ๋ ์ด๋ฆ, ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋น ์ด๋ฆ์ ์ถ๊ฐ ๋งค์นญํ๋ค.
โ @Qualifier ์ฌ์ฉ
๋น ๋ฑ๋ก
@Component
@Qualifier("mainDiscountPolicy")
public class RateDiscountPolicy implements DiscountPolicy {}
์์ฑ์ ์๋ ์ฃผ์ ์์
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
- ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ค ์ ์๋ค. ๋น์ ์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ ์๋
- ๋ง์ฝ @Qualifier("mainDiscountPolicy")๋ฅผ ๋ชป์ฐพ์ผ๋ฉด mainDiscountPolicy๋ผ๋ ์ด๋ฆ์ ์คํ๋ง ๋น์ ์ถ๊ฐ๋ก ์ฐพ์
โ @Primary ์ฌ์ฉ
@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
- ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ
- ์ฌ๋ฌ ๋น์ด ๋งค์นญ๋๋ฉด @Primary๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง
- ์ฌ์ฉ ์> ๋ฉ์ธ DB์ ๋ณด์กฐ DB๊ฐ ์์ ๋, ๋ฉ์ธDB์ @Primary๋ฅผ ๊ฑธ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์์ฃผ ์ฌ์ฉ๋จ
โ @Primary vs @Qualifier
- @Qualifier๋ ๋ชจ๋ ์ฝ๋์ ๋ถ์ฌ์ฃผ์ด์ผ ํด์ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
- ๋ฉ์ธ์ผ๋ก ์ฌ์ฉ๋ ๋น์ @Primary๋ฅผ ์ฌ์ฉํด์ ๊ธฐ๋ณธ์ผ๋ก ์กฐํํ๊ณ ์๋ธ๋ก ์ฌ์ฉ๋ ๋น์ @Qualifier๋ฅผ ์ง์ ํด์ ํ์ํ ๋๋ง ๋ช ์์ ์ผ๋ก ํ๋ํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋ค.
- ์คํ๋ง์ ์๋๋ณด๋ค ์๋์ด, ๋์ ๋ฒ์์ ์ ํ๊ถ๋ณด๋ค๋ ์ข์ ์ ํ๊ถ์ด ์ฐ์ ์์๊ฐ ๋์
- @Qualifier > @Primary
๐ ์กฐํํ ๋น์ด ๋ชจ๋ ํ์ํ ๋
์๋์ ์ผ๋ก ํด๋น ํ์ ์ ์คํ๋ง ๋น์ด ๋ค ํ์ํ ๊ฒฝ์ฐ๋ ์๋ค.
์ด ๊ฒฝ์ฐ ์ฃผ์ ๋ฐ์ ๊ฐ์ฒด๋ฅผ Map ๋๋ List๋ก ์ค์ ํ๋ฉด ํด๋น ํ์ ์ ๋ชจ๋ ๊ฐ์ฒด๋ค์ด ์ฃผ์ ๋๋ค.
- Map<String, Class> : map์ ํค์ ์คํ๋ง ๋น์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ๊ณ ๊ทธ ๊ฐ์ผ๋ก ํด๋น ํ์ ์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ค๋ค.
- List<Class> : ํด๋น ํ์ ์ผ๋ก ์กฐํํ ๋ชจ๋ ์คํ๋ง ๋น์ ๋ด์์ค๋ค.
๐ ์๋, ์๋์ ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ๋ฅ
- ํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ
- ์คํ๋ง์ด ๋์ค๊ณ ์๊ฐ์ด ๊ฐ ์๋ก ์๋์ ์ ํธํ๋ ์ถ์ธ์ด๋ค.
- ์คํ๋ง์ @Component๋ฟ๋ง ์๋๋ผ @Controller, @Service, @Repository์ฒ๋ผ ๊ณ์ธต์ ๋ง์ถ์ด ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์๋์ผ๋ก ์ค์บํ ์ ์๋๋ก ์ง์ํ๋ค.
- ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํ๋ฉด ์ค์ ์ ๋ณด๋ฅผ ์ง์ ์์ฑํ๋ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ด ์ค์ด๋ค๊ณ , ์ค์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์์ผ๋ฉฐ OCP, DIP๋ ์งํฌ ์ ์๋ค.
- ์๋ ๋น ๋ฑ๋ก์?
- ์ ๋ฌด ๋ก์ง ๋น : ์ปจํธ๋กค๋ฌ, ์๋น์ค ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฑ์ด ๋ชจ๋ ์ ๋ฌด ๋ก์ง์ด๋ฉฐ ๋ณดํต ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋จ
- ๊ธฐ์ ์ง์๋น : ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ ๊ณตํต ๊ด์ฌ์ฌ(AOP)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ์ ๋ฌด ๋ก์ง์ ๊ฒฝ์ฐ ๊ฐ๋ฐ ์ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ์ฒ๋ผ ์ด๋์ ๋ ์ ์ฌํ ํจํด์ด ์์ผ๋ฏ๋ก ์๋ ๊ธฐ๋ฅ์ ์ ๊ทน ํ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ฐ๋ฉด ๊ธฐ์ ์ง์ ๋ก์ง์ ์๊ฐ ๋งค์ฐ ์ ๊ณ , ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด ์์น๋ฅผ ๋ช ํํ๊ฒ ํ์ ํ๊ธฐ ํ๋ค๋ฏ๋ก ๊ฐ๊ธ์ ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํด์ ๋ช ํํ๊ฒ ๋๋ฌ๋ด๋ ๊ฒ์ด ์ข์
- ๋ํ ์ฝ๋๋ง ๋ณด๊ณ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋น์ผ๋ก ๋ฑ๋ก๋ ์ง ์๊ธฐ ํ๋ค๋ ํจํค์ง๋ก ๋ฌถ์ด๋๊ฑฐ๋ ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํ๋ค.
๊ฐ์ ๋งํฌ
์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
์คํ๋ง ์ ๋ฌธ์๊ฐ ์์ ๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉด์ ์คํ๋ง์ ํต์ฌ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์คํ๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ์คํ ๋ค์ง ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ...
www.inflearn.com
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (8) - ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2022.03.14 |
---|---|
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (6) - ์ปดํฌ๋ํธ ์ค์บ (0) | 2022.03.13 |
[Spring] ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธ (5) - ์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2022.03.13 |