@Autowired
@Autowired๋ ์ด๋ฆ ๊ทธ๋๋ก ์๋์ผ๋ก ์์กด ๊ด๊ณ๋ฅผ ์ฐ๊ฒฐ(์ฃผ์ ) ์์ผ์ฃผ๋ ์ด๋ ธํ ์ด์ ์ ๋๋ค.
@ComponentScan์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์์กด๊ด๊ณ์ ๋ํ ์ค์ ์ ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค.
ํ์ํ ๊ฐ์ฒด์ "ํ์ "์ ํด๋นํ๋ ๋น์ ์ฐพ์์ ์๋์ผ๋ก ์ฃผ์ ์์ผ์ค๋๋ค.
์์กด๊ด๊ณ ์๋ ์ฃผ์
์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์๋ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ์์ฑ์ ์ฃผ์
- ์์ ์ ์ฃผ์ (Setter ์ฃผ์ )
- ํ๋ ์ฃผ์
์์ฑ์ ์ฃผ์
์์ฑ์๋ฅผ ํตํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํน์ง
- ์์ฑ์ ํธ์ถ์์ ์ ๋จ 1ํ๋ง ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ๋ฉ๋๋ค.
- ๋ถ๋ณ, ํ์ ์์กด๊ด๊ณ์ ์ฌ์ฉํฉ๋๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
์ฅ์
- ์์ฑ์๊ฐ ํ๋์ธ ๊ฒฝ์ฐ์๋ @Autowired๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
- ์์กด์ฑ ์ฃผ์ ๋์์ ํ๋๋ฅผ final๋ก ์ค์ ํ์ฌ, ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
- ๋ํ final๋ก ์ค์ ํ ๊ฒฝ์ฐ ๋กฌ๋ณต์์ ์ ๊ณตํ๋ @Requiredargsconstructor ์ด๋ ธํ ์ด์ ์ ํตํด ๊ฐํธํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
์์ ์ ์ฃผ์
setter๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํน์ง
- ์ ํ, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉํฉ๋๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
@Autowired
public setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
ํ๋ ์ฃผ์
ํ๋์ ๋ฐ๋ก ์ฃผ์ ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํน์ง
- ์ฝ๋๊ฐ ๊ฐ๊ฒฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธ๋ถ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ์ ํ ์คํธํ๊ธฐ ํ๋ค์ด์ง๋๋ค.
- DI ํ๋ ์์ํฌ๊ฐ ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ ์ ์์ต๋๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ฝ๋์ ๊ด๊ณ ์๋ ํ ์คํธ ์ฝ๋ ๋ฑ์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private final MemberRepository memberRepository;
}
์ต์ ์ฒ๋ฆฌ
@Autowired๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ ํ ์คํ๋ง ๋น์ด ์์ด๋ ๋์ํด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ธฐ๋ณธ์ ์ผ๋ก @Autowired๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์๋ ์ฃผ์ ๋์์ ์ต์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
- @Autowired(required = false) : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์ ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ์ด ์๋ฉ๋๋ค. (์์ฑ์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.)
- @Nullable : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด null ์ด ์ ๋ ฅ๋ฉ๋๋ค.
- Optional : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด Optional.empty๊ฐ ์ ๋ ฅ๋ฉ๋๋ค.
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("noBean1 = " + member);
}
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("noBean2 = " + member);
}
@Autowired
public void setNoBean3(Optional<Member> member) {
System.out.println("noBean3 = " + member);
}
์ฐธ๊ณ
์์ฑ์ ์ฃผ์ ์ Null ์ ํ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
@Component
public class TestBean {
private final Member member;
@Autowired
public TestBean(@Autowired(required = false) Member member) {
System.out.println("member = " + member);
this.member = member;
}
}
ํน์ @Nullable์ด๋ Optional์ ์ฌ์ฉํ ์ ์์ต๋๋ค
package com.example.constructautowired;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
@Component
public class TestBean {
private final Member member;
@Autowired
public TestBean(@Nullable Member member) {
System.out.println("member = " + member);
this.member = member;
}
}
๋ฌด์จ ๋ฐฉ๋ฒ์ด ์ข๋์?
์์ฑ์ ์ฃผ์ ์ ์ถ์ฒํฉ๋๋ค.
์คํ๋ง์ ํฌํจํ DI ํ๋ ์์ํฌ ๋๋ถ๋ถ์ด ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋๋ฐ, ๊ทธ ์ด์ ๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ถ๋ณ
- ๋๋ถ๋ถ์ ์์กด๊ด๊ณ ์ฃผ์ ์ ํ๋ฒ ์ผ์ด๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ์์ ๊น์ง ์์กด๊ด๊ณ๋ฅผ ๋ณ๊ฒฝํ ์ผ์ด ์์ต๋๋ค. ์คํ๋ ค ๋๋ถ๋ถ์ ์ข ๋ฃ ์ ๊น์ง ๋ณํ๋ฉด ์๋ฉ๋๋ค.
- ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ค๋ฉด setter ๋ฅผ public ์ผ๋ก ์ธ๋ถ์ ๋ ธ์ถ์์ผ์ผํฉ๋๋ค.
- ์ฆ ๋๊ตฐ๊ฐ ์ค์๋ก ์์ ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
๋๋ฝ
- ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ ์์ํฌ ์์์ ๋์ํ ๋๋ ์์กด๊ด๊ณ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๊ทธ๋ฌ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์คํํ๋ ๊ฒฝ์ฐ, ํ๋ ์์ํฌ๊ฐ ์์ด ์คํํ๊ฒ ๋๋๋ฐ, ์ด๋ ๋๋ฝ์ ํ๋ฉด NPE๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋๋ฝํ์ ๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
final ํค์๋
- ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์์ ๊ฐ์ด ์ค์ ๋์ง ์์์ ๊ฒฝ์ฐ, ์ด๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ๋ง์์ค๋๋ค.
- ๋ํ ๋กฌ๋ณต์ ์ฌ์ฉํ๋ฉด ์ฃผ์ ์ ๊ต์ฅํ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋๋ ๊ทธ ์์์ ๋๋ค.
@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;
}
}
์์๊ฐ์ ์ฝ๋๋ฅผ ๋กฌ๋ณต์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ค์ผ ์ ์์ต๋๋ค.
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
์กฐํ๋ ๋น์ด 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ
@Autowired๋ ํ์ ์ผ๋ก ๋น์ ์กฐํํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์ ํ์ ์ผ๋ก ์กฐํ๋ ๋น์ด 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ, ๋ฌด์์ ์ฃผ์ ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- @Autowired ํ๋ ๋ช ๋งค์นญ
- @Qualifier-> @Qualifier๋ผ๋ฆฌ ๋งค์นญ -> ๋น ์ด๋ฆ ๋งค์นญ
- @Primary ์ฌ์ฉ
@Autowired ํ๋ ๋ช ๋งค์นญ
@Autowired๋ ํ์ ๋งค์นญ์ ์๋ํ ์ดํ, ์กฐํ๋ ๋น์ด ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ํ๋ ์ด๋ฆ(์์ฑ์ ์ฃผ์ ๋ฑ์ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ ์ด๋ฆ)์ ์ฌ์ฉํ์ฌ ์ถ๊ฐ ๋งค์นญ์ ์งํํฉ๋๋ค.
DiscountPolicy ํ์ ์ด RateDiscountPolicy์, FixDiscountPolicy๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ , ์ด๋ฅผ ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
@Autowired
private DiscountPolicy discountPolicy;//RateDiscountPolicy์, FixDiscountPolicy๊ฐ ์กด์ฌํ์ฌ ์ค๋ฅ
์์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํฉ๋๋ค.
@Autowired
private DiscountPolicy rateDiscountPolicy;
@Qualifier, @Primary ์ฌ์ฉ
https://ttl-blog.tistory.com/9
๐ Reference
'๐๏ธ Spring > ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ํน์ ํ์ ์ ๋น์ ๋ชจ๋ ์กฐํํ๋ ๋ฐฉ๋ฒ (0) | 2021.12.11 |
---|---|
[Spring] @Qualifier ๋์ ์ด๋ ธํ ์ด์ ์ ์ง์ ๋ง๋ค์ด๋ณด์ (0) | 2021.12.11 |
[Spring] @ComponentScan (0) | 2021.12.11 |
[Spring] @Configuration (0) | 2021.12.11 |
[Spring] ์ฑ๊ธํค (feat. ์ฑ๊ธํค์ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ฐฉ์) (2) | 2021.12.11 |