์ธํ๋ฐ ๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ ๊ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ฑํ ๊ธ์ ๋๋ค.
์์กด๊ด๊ณ ์ฃผ์ ์ด๋, ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ์ธ๋ถ์์ ์ค์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํด ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๋ ๊ฒ์ด๋ค. ์ด์ ์ ์ ์ด์ ์ญ์ ๊ณผ ํจ๊ป ์์๋ณธ ์ ์ด ์์๋ค.
๊ทธ๋ ๋ค๋ฉด ํด๋ผ์ด์ธํธ์๊ฒ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ์ ๋ฌํ ๊น? ํฌ๊ฒ 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
1. ์์ฑ์ ์ฃผ์
๋ง ๊ทธ๋๋ก ์์ฑ์๋ฅผ ์ด์ฉํด์ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์์ฑ์๋ฅผ ํธ์ถํ ๋, @Autowired
๊ฐ ๋ถ์ด์์ผ๋ฉด ์คํ๋ง ์ปจํ
์ด๋์์๋ ๋งค๊ฐ๋ณ์์ ๊ฐ์ ํ์
์ ๋น์ ์ฐพ์ ์์ฑ์์ ๋ฃ์ด์ค๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
// ์์ฑ์๊ฐ ๋ฑ 1๊ฐ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ, @Autowired ์๋ต ๊ฐ๋ฅ
@Autowired
public OrderServiceImpl(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
๊ฐ์ฒด๋ฅผ ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ ค๋ฉด, ๋จผ์ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์ฑ์ ๋ฟ์ด๊ณ , ์คํ๋ง ๋น์ ์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌ๋๊ธฐ์ ์ธ์คํด์ค๊ฐ 1๊ฐ๋ง ์์ฑ๋๋ค. ๋ฐ๋ผ์ ์์ฑ์ ์ฃผ์ ์ ์์ฑ์ ํธ์ถ ์์ ์ ๋ฑ 1๋ฒ๋ง ์ผ์ด๋๋ค. ๊ทธ๋์ ์ฃผ๋ก ํ์์ ์ด๊ณ ๋ณํ์ง ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉํ๋ค.
- ํ์: ํ ์ธ ์ ์ฑ ์ ๊ฒฐ์ ํด์ฃผ์ง ์์ผ๋ฉด ์ฃผ๋ฌธ ์๋น์ค๋ฅผ ์ ๊ณตํ ์ ์์ผ๋ฏ๋ก ํ ์ธ ์ ์ฑ ๊ตฌํ์ฒด๋ ๋ฐ๋์ ์ฃผ์ ํด์ฃผ์ด์ผ ํ๋ค.
- ๋ถ๋ณ: ์๋ฅผ ๋ค์ด, ์์ ๊ฒฝ์ฐ์๋
OrderService
๋น์ด ์์ฑ๋๋ ์๊ฐ ํ ์ธ ์ ์ฑ ์ด ๊ฒฐ์ ๋๋ค. ๋น ์์ฑ ์ดํ์๋ ํ ์ธ ์ ์ฑ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์๋์ด ์ธ์ ์ฃผ๋ฌธํ๋ ๋์ผํ ํ ์ธ ์ ์ฑ ์ ์ ์ฉ๋ฐ๋๋ค.
2. ์์ ์ ์ฃผ์ (setter ์ฃผ์ )
@Component
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
์์ ์ ์ฃผ์
์ ์์ ์๋ฅผ ํตํด ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ์ ํ์ ์ฌ์ง, ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์๋ ์์กด๊ด๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํน์ง์ด๋ค. ๋ฐ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์
์คํ ์ค ์ฃผ์
๋ฐ๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์์ ๋๋ ์์ ์ ์ฃผ์
์ ์ฌ์ฉํ๋ค.
(ํ์ง๋ง ์ด๋ฐ ๊ฒฝ์ฐ๋ ๋งค์ฐ ๋๋ฌผ๊ณ , ๋๋ถ๋ถ์ ์์กด๊ด๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์
์ข
๋ฃ ์๊น์ง ๋ณํ๋ฉด ์๋๋ค.)
์์ ์๋ ์์ฑ์๊ฐ ํธ์ถ๋๊ณ ๋ ์ดํ์ ์คํ๋ง ํ๋ ์์ํฌ์ ์ํด ํธ์ถ๋๋ค. ๋ฐ๋ผ์ ์ธ๋ถ์์ setter๋ฅผ ํธ์ถํ ์ ์๋๋ก setter๋ฅผ public์ผ๋ก ์ด์ด๋์ด์ผ ํ๋ค.
๋ง์ฝ ์ฃผ์ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด ์๋์ ๊ฐ์ด ์คํ๋ง ์ปจํ ์ด๋์์ ๋น์ ์กฐํํ์ฌ ์์กด๊ด๊ณ๋ฅผ ์์ ํ๋ฉด ๋๋ค.
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// OrderService ๋น์ ๊ฐ์ ธ์ด
OrderService orderService = context.getBean(OrderService.class);
// ์๋ก์ด DiscountPolicy ๊ฐ์ฒด ์์ฑ
DiscountPolicy newDiscountPolicy = new RateDiscountPolicy();
// OrderService์ DiscountPolicy ํ๋๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ ํธ์ถ
orderService.setDiscountPolicy(newDiscountPolicy);
}
}
3. ํ๋ ์ฃผ์
@Component
public class OrderServiceImpl implements OrderService {
@Autowired private DiscountPolicy discountPolicy;
}
ํ๋ ์ฃผ์ ์ ํ๋์ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ๋ ๋ฐฉ์์ด๋ค. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ์ธ๋ถ์์ ์ฃผ์ ํ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด ํ ์คํธ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์๋ค.
@Autowired
๋ ์คํ๋ง์์ ์ง์ํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ง์ ๊ณง DI ํ๋ ์์ํฌ๊ฐ ์์ด์ผ ํ๋ค๋ ๋ง์ด๊ธฐ๋ ํ๋ค. ํ๋ ์ฃผ์
์ ์ฌ์ฉํ ์ํ๋ก ํ
์คํธ ์ฝ๋๋ฅผ ์คํํ๋ ค๋ฉด, ์คํ๋ง์ ์ ๋ถ ๋์์ฃผ์ด์ผ ํ๋ค.
4. ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
@Component
public class OrderServiceImpl implements OrderService {
private DiscountPolicy discountPolicy;
@Autowired
public void init(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
๊ทธ ์ธ์ ์ผ๋ฐ ๋ฉ์๋๋ฅผ ํตํด์๋ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ๋ฐ์ ์ ์๋ค. ์ฌ์ค์ ์์ ์ ์ฃผ์ ๊ณผ ๋์ผํ๋ฉฐ, ํ ๋ฒ์ ์ฌ๋ฌ ํ๋๋ฅผ ์ฃผ์ ๋ฐ์ ์๋ ์๋ค.
5. ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ์
์ง๊ธ๊น์ง ๋ค์ํ ์์กด๊ด๊ณ ์ฃผ์ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์๋ค. ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์์ง๋ง, ๊ทธ ์ค์์๋ ๊ฐ์ฅ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ก ์์ฑ์ ์ฃผ์ ์ด๋ค. ์๋์ ๊ฐ์ ์ด์ ๋๋ฌธ์ด๋ค.
(1) ๊ฐ์ฒด ๋ถ๋ณ์ฑ ํ๋ณด
๋๋ถ๋ถ์ ์์กด๊ด๊ณ๋ ์ ํ๋ฆฌ์ผ์ด์
์ข
๋ฃ ๋๊น์ง ๋ณํ์ง ์๋๋ค.
์์ฑ์ ์ฃผ์
์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฑ 1๋ฒ๋ง ์คํ๋๊ณ , ์ดํ๋ก๋ ์คํ๋์ง ์์ผ๋ฏ๋ก ๊ฐ์ฒด์ ๋ถ๋ณ์ ๋ณด์ฅํ ์ ์๋ค.
ํ์ง๋ง ์์ ์ ์ฃผ์
๊ณผ ์ผ๋ฐ ๋ฉ์๋ ์ฃผ์
์ setter
๋ฉ์๋๋ฅผ ์ด์ด๋๊ธฐ ๋๋ฌธ์ ์ฃผ์
๋ฐ๋ ๊ฐ์ฒด๊ฐ ์์ ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
(2) ํ ์คํธ ์ ์์กด๊ด๊ณ ์ฃผ์ ๋๋ฝ ๋ฐฉ์ง
์์ํ ์๋ฐ ์ฝ๋๋ก ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ๋, ์์ ์ ์์กด๊ด๊ณ๋ฅผ ์ฌ์ฉํ๋ฉด ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋๋ฝ๋ ์ ์๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
public void createOrder(int price, Member member) {
price = discountPolicy.calcurateDiscountPrice(price, member);
...
}
}
์์ ๊ฐ์ OrderServiceImpl ํด๋์ค๊ฐ ์๋ค. ์์ ์ ์ฃผ์
์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, createOrder()
์ discountPolicy
๋ก๋ถํฐ ํ ์ธ๋ ๊ธ์ก์ ๋ฐ์์ค๊ณ ์๋ค.
์ด์ ์ด ํด๋์ค์ ์ฃผ๋ฌธ ์์ฑ ๊ธฐ๋ฅ์ ๋ํด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
class OrderServiceImplTest {
@Test
void createOrder() {
OrderServiceImpl orderService = new OrderServiceImpl();
orderService.createOrder(..
...
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด NullPointerException
์ด ๋ฐ์ํ๋ค. ์คํ๋ง์์๋ ์ปจํ
์ด๋๊ฐ ์์์ setter๋ฅผ ํธ์ถํ์ฌ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์
ํด ์ฃผ์์ง๋ง, ์คํ๋ง์ด ์๋ ์์ํ ์๋ฐ ์ฝ๋์์๋ setter๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์๋ฌ๋ฅผ ์ก๊ธฐ ๋งค์ฐ ์ด๋ ค์์ง๋ค.
ํ์ง๋ง ์์ ์ ์ฃผ์ ๋์ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. OrderServiceImpl์ ์์ฑ์์ ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฝ๋์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ฒ๋ค๊ฐ IDE๊ฐ ์ด๋ค ๊ฐ์ด ๋๋ฝ๋์๋์ง ์น์ ํ๊ฒ ์๋ ค์ฃผ๊ธฐ๊น์ง ํ๋ค.
๐ก ์์ํ ์๋ฐ ์ฝ๋๋ก ํ ์คํธ๋ฅผ ์์ฑํ๋ ์ด์ ?
ํน์ ํ๋ ์์ํฌ์ ์์กดํ์ง ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ํ ์คํธ์ ๋ ๋ฆฝ์ฑ์ ๋ณด์ฅํ ์ ์๋ค. ๋ํ ํ๋ ์์ํฌ๋ฅผ ๋์ธ ํ์๊ฐ ์์ด ํ ์คํธ ์คํ ์๋๊ฐ ํฅ์๋๋ค. ๋ง์ง๋ง์ผ๋ก ์์กด๊ด๊ณ๋ก ์ฎ์ธ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ํจ๊ป ํ ์คํธํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์, ๋จ์ ํ ์คํธ์ ์ง์คํ ์ ์๋ค.
(3) final ํค์๋ ์ฌ์ฉ ๊ฐ๋ฅ
์์ฑ์ ์ฃผ์
์ ์ ์ธํ ๋ค๋ฅธ ์ฃผ์
๋ฐฉ๋ฒ์ ํ๋์ final
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. final
์ ์ด๊ธฐํํ๋ ค๋ฉด (1) ํ๋์์ ์ด๊ธฐํํ๊ฑฐ๋, (2) ์์ฑ์๋ฅผ ํตํด ์ด๊ธฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฑ์ ์ฃผ์
์ ์ ์ธํ ์ฃผ์
๋ฐฉ์์ ์์ฑ์ ์ดํ์ ํธ์ถ๋๋ฏ๋ก, ํ๋์ final
ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. (ํ๋์์ ์ด๊ธฐํํ๋ฉด ๋์ง์๋? ๋ผ๊ณ ์๊ฐํ๋ค๋ฉด IoC์ DI๋ฅผ ๋ณต์ตํ๊ณ ์ค์.)
์ด์ฒ๋ผ final
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด, ์์ฑ์ ๋งค๊ฐ๋ณ์๋ก ๋์ด์์ผ ํ ๊ฐ์ด ๋์ด์ค์ง ์์ ๊ฒฝ์ฐ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
6. ์์ฑ์ ์ฃผ์ ์ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
๊ทธ๋์ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ๊น์ง ์์๋๋ฐ, ๋๋ฌด ๊ท์ฐฎ๋ค. final ํค์๋๋ ๋ถ์ฌ์ค์ผ ํ๊ณ , ์์ฑ์์ ๋งค๊ฐ๋ณ์๋ ํ๋ํ๋ ๋ฃ์ด์ค์ผ ํ๊ณ ... ๊ทธ๋ฐ ์ฌ๋๋ค์ ์ํด ๋ฐ๋ก ๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ๋ค.
๋กฌ๋ณต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ํ ์ด๋
ธํ
์ด์
์ ์ง์ํ๋ค. ์์ฑ์ ์ฃผ์
์ ์ฌ์ฉํ ์ด๋
ธํ
์ด์
์ @RequiredArgsConstructor
์ด๋
ธํ
์ด์
์ผ๋ก, ์ปดํ์ผ ์์ ์ final
ํค์๋๊ฐ ๋ถ์ ํด๋์ค ํ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
// @Autowired
// public OrderServiceImpl(DiscountPolicy discountPolicy) {
// this.discountPolicy = discountPolicy;
// }
}
์์ ๊ฐ์ด ์ด๋ ธํ ์ด์ ํ๋๋ง ๋ถ์ด๋ฉด, ์๋์ ์ฃผ์ ์ฒ๋ฆฌํ ์์ฑ์๊ฐ ์กด์ฌํ๋ ๊ฒ์ฒ๋ผ ๋์ํ๋ค. (์ฝ๋์๋ ๋ํ๋์ง ์์ง๋ง, ์์ฑ์๋ฅผ ํธ์ถํ๋ฉด ์ ์์ ์ผ๋ก ๋์ํ๋ค.) ์ด์ฒ๋ผ ์์ฑ์ ์ฃผ์ ๊ณผ ๋กฌ๋ณต์ ํจ๊ป ์ด์ฉํ๋ฉด, ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
๐ก ๋กฌ๋ณต์ ๋ํ์ ์ธ ์ด๋ ธํ ์ด์
- @Getter: ํด๋์ค ํ๋์ ๋ํด getter ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑ
- @Setter: ํด๋์ค ํ๋์ ๋ํด setter ๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑ
- @ToString: ํด๋์ค ํ๋์ ๋ํด
toString()
๋ฉ์๋๋ฅผ ์๋์ผ๋ก ์์ฑ- @NoArgsConstructor: ๋งค๊ฐ๋ณ์ ์๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑ
- @AllArgsConstructor: ๋ชจ๋ ํ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๊ฐ๋ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑ
'๐๐ฉ๐ซ๐ข๐ง๐ > ๐๐๐ฌ๐ข๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น ์ค์ฝํ๋? (0) | 2023.09.12 |
---|---|
๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ (0) | 2023.09.12 |
์ปดํฌ๋ํธ ์ค์บ (0) | 2023.09.02 |
์คํ๋ง์์์ ์ฑ๊ธํค ํจํด (0) | 2023.09.02 |
์คํ๋ง ์ปจํ ์ด๋๋? (0) | 2023.09.02 |