Spring / ์์กด๊ด๊ณ ์ฃผ์ - @Autowired ์ต์ ์ฒ๋ฆฌ, ์์ฑ์ ์ฃผ์ ์ฌ์ฉ ๊ถ์ฅ
by rlaehddnd0422@Autowired ์ต์ ์ฒ๋ฆฌ
์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ ์คํ๋ง ๋น์ด ์์ด๋ @Autowired๊ฐ ๋์ํด์ผ ํ ๋๊ฐ ์๋ค.
package tmp;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository)
{
this.myRepository = myRepository;
}
}
์๋ฅผ๋ค์ด, ์์ ๊ฐ์ Service์ Repository ํด๋์ค๊ฐ ์๊ณ Service๊ฐ Repository๋ฅผ ์์กดํ๊ณ Repository๋ ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ง ์์ ์ํฉ์ด ์๋ค๊ณ ํด๋ณด์.
1. MyService ํด๋์ค์ @Component๋ฅผ ๋ถ์ฌ ๋น์ผ๋ก ๋ฑ๋กํด์ฃผ์๊ณ , MyRepository๋ ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ง ์์ ์ผ๋ฐ ์๋ฐ ํด๋์ค์ด๋ค.
2. MyService๋ MyRepository๋ฅผ ์์กดํ๋ ๊ฐ์ฒด๋ก @Autowired๋ฅผ ๋ถ์ฌ MyService์ ์์ฑ์๋ฅผ ํตํด ์ฃผ์ ๋ฐ๋๋ก ํ๋ค.
-> ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋์ด ์์ง ์์ ํด๋์ค๋ @Autowired๋ฅผ ์ฌ์ฉํด๋ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ ์ ์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ๋ฐฉ์์ ์ต์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
1. @Autowired(required = false) : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด ์์ ์(setter) ๋ฉ์๋ ์์ฒด๊ฐ ํธ์ถ์ด ์๋จ
2. @Nullable : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด null์ด ์ ๋ ฅ๋จ
3. Optional<> : ์๋ ์ฃผ์ ํ ๋์์ด ์์ผ๋ฉด Optional.empty๊ฐ ์ ๋ ฅ๋จ
TestCode
package hello.core.AutoWiredTest;
import hello.core.AppConfig;
import hello.core.member.Member;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.lang.Nullable;
import java.util.Optional;
public class AutowiredTest {
@Test
void AutowiredOption()
{
ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);
}
// Member๋ ์คํ๋ง bean์ด ์๋ ์ผ๋ฐ ์๋ฐ ํด๋์ค !
static class TestBean{
@Autowired(required = false)
public void setNoBean1(Member member)
{
System.out.println("member = " + member);
}
@Autowired
public void setNoBean2(@Nullable Member member)
{
System.out.println("member = " + member);
}
@Autowired
public void setNoBean3(Optional<Member> member)
{
System.out.println("member = " + member);
}
}
}
โ๏ธ์ฐธ๊ณ : Optional, @Nullable์ ์คํ๋ง ์ ๋ฐ์ ๊ฑธ์ณ ์ง์๋๋ค.
@Autowired๋ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ์.
๊ณผ๊ฑฐ์๋ ์์ ์ ์ฃผ์ ๊ณผ ํ๋ ์ฃผ์ ์ ๋ง์ด ์ฌ์ฉํ์ง๋ง, ์ต๊ทผ์๋ DIํ๋ ์์ํฌ ๋๋ถ๋ถ์์ ์์ฑ์ ์ฃผ์ ์ ๊ถ์ฅํ๋ค.
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์
๋ถ๋ณ ์ ๋
1. ์ ํ๋ฆฌ์ผ์ด์ ์์๋ถํฐ ์ข ๋ฃ๊น์ง ์์กด๊ด๊ณ๊ฐ ๋ฐ๋์ผ์ด ์๋ค. ์คํ๋ ค ์์กด๊ด๊ณ๋ ์ข ๋ฃ ์ ๊น์ง ๋ฐ๋๋ฉด ์๋๋ค.
2. ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด setter ๋ฉ์๋๋ฅผ public์ผ๋ก ์ด์ด๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ก ์ธํด ์ค์๋ก ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์๋ ์์ด ์ข์ ์ค๊ณ ๋ฐฉ๋ฒ์ด ์๋.
3. ์์ฑ์ ์ฃผ์ ์ ๊ฐ์ฒด ์์ฑ์ ๋ฑ 1๋ฒ ํธ์ถ๋๋ฏ๋ก ๋ถ๋ณํ๊ฒ ์ค๊ณํ ์ ์๋ค.
๋๋ฝ ๋ฐฉ์ง
ํ๋ ์์ํฌ ์์ด ์์ํ ์๋ฐ ์ฝ๋๋ก ๋จ์ ํ ์คํธ ํ ๋,
์์ ์(setter) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
public class OrderServiceImpl implements OrderService {
// ์์ ์ ์ผ์ผ๋ฏ๋ก final ๋บ
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
//...
}
์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ก ํ ์คํธ๋ฅผ ํ ๋๋ @Autowired๊ฐ ํ๋ ์์ํฌ ์์์ ๋์ํ ๋๋ ์์กด๊ด๊ณ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ง, ์์ ์๋ฐ์ฝ๋ ํ ์คํธ์ ๊ฒฝ์ฐ์๋ ๋ฐ์ํ์ง ์๋๋ค.
class OrderServiceImpTest {
@Test
void createOrder()
{
OrderServiceImp orderService =new OrderServiceImp();
orderService.createOrder(1L,"ItemA",1000);
}
}
- ์คํ์ ๋์ง๋ง OrderServiceImp์ ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋๋ฝ๋์ด NPE๊ฐ ๋ฐ์ํ๋ค.
- setter ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์์กด๊ด๊ณ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋์์ ๋ ์ด๋ค ๊ฒ ๋๋ฝ๋์๋์ง ๋์ ํ ๋ณด์ด์ง ์๋๋ค.
- ํ์ง๋ง ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์์กด๊ด๊ณ ์ฃผ์ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋์์ ๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์๋์ด ์ด๋ค ๊ฐ์ ํ์๋ก ์ฃผ์ ํด์ผ ํ๋์ง ์ ์ ์๋ค.
final ํค์๋ ์ฌ์ฉ
์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ํ๋์ final ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋์ ์์ฑ์์์ ํน์๋ผ๋ ๊ฐ์ด ์ค์ ๋์ง ์๋ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ์์ ์์ ๋ฐ์์์ผ์ค๋ค.
@Component
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
}
์ ๋ณด๋ฉด ํ์ ํ๋์ธ discountPolicy ์ ๊ฐ์ ์ค์ ํด์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์ด ๋๋ฝ๋์๋ค. ์๋ฐ๋ ์ปดํ์ผ ์์ ์ ๋ค์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
java: variable discountPolicy might not have been initialized
์ปดํ์ผ ์ค๋ฅ๋ ์ธ์์์ ๊ฐ์ฅ ๋น ๋ฅด๊ณ , ์ข์ ์ค๋ฅ๋ค.
<์ ๋ฆฌ>
- ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์คํ๋ง ํ๋ ์์ํฌ์ ์์กดํ์ง ์๊ณ , ์์ํ ์๋ฐ ์ธ์ด์ ํน์ง์ ๊ฐ์ฅ ์ ์ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๊ธฐ๋ณธ์ผ๋ก๋ ์์ฑ์ ์ฃผ์ ๋ฐฉ์์ ์ฌ์ฉํ์. (์ต์ ์ด ํ์ํ ๊ฒฝ์ฐ์๋ง ์์ ์ ์ฃผ์ ์ ์ฌ์ฉํ์)
- ํ๋์ฃผ์ ์ ์์ฐ๋๊ฒ ์ข๋ค.
๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์ต์ ํ
https://rlaehddnd0422.tistory.com/27
๊ธฐ์กด OrderServiceImp
@Component
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
์์ฑ์๊ฐ ํ๋ ๋ฟ์ผ๋์๋ @Autowired ์๋ตํด๋ ๋๋ค.
@Component
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImp(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฉํ ์ต์ข ๊ฒฐ๊ณผ
@Component
@RequiredArgsConstructor
public class OrderServiceImp implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@RequiredArgsConstructor๋ฅผ ์ฌ์ฉํ๋ฉด final์ด ๋ถ์ ํ๋๋ฅผ ๋ชจ์ ์์ฑ์๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ด์ค๋ค. (์ฝ๋์๋ ๋ณด์ด์ง ์์)
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring / @Qualifier, @Primary (0) | 2023.02.07 |
---|---|
Spring / ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ ์ฝ๋ ์ต์ ํ (0) | 2023.02.06 |
Spring / ์์กด๊ด๊ณ ์ฃผ์ - ์์ฑ์, ์์ ์, ํ๋, ๋ฉ์๋ (0) | 2023.02.03 |
Spring / @ComponentScan, @Component (1) | 2023.02.02 |
Spring / Single-ton Pattern, Single-ton Container (0) | 2023.01.31 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422