동적으로 빈을 선택해야할 때, Map으로 빈을 받으면 편리하다.예제에서는 두가지 할인 정책이 있는데, Map에 key값만 넘겨주면 각 할인 정책에 맞는 할인가를 알 수 있다. 1. 예제: Map으로 2개의 빈 받아오기DiscountPolicy 인터페이스가 있다.fixDiscountPolicy와 rateDiscountPolicy는 구현 클래스다. ✅FixDiscountPolicy @Componentpublic class FixDiscountPolicy implements DiscountPolicy { private int discountFixAmount = 1000; //1000원 할인 @Override public int discount(Member member, int price) { ..
분류 전체보기
1. 조회하는 빈이 2개 이상일 때, 발생하는 문제@Autowired는 Type으로 조회하기 때문에, DiscountPolicy처럼 하위 타입을 2개 이상 가지고 있는 경우에하위 타입 클래스에 @Component로 의존관계 자동주입을 실행하면 빈 충돌 오류가 발생한다. 2. 빈 충돌 해결방법@Autowired 필드 명 매칭@Qualifier 매칭@Primary 사용1) @Autowired 필드명 매칭@Autowired는 Type 매칭을 먼저 시도한다.이 때, 빈이 여러개 있으면 다음으로 필드명, 파라미터 명으로 빈 이름을 매칭한다. ✅기존 코드@Autowiredpublic OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discoun..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlgrmN%2FbtsHdcRKluh%2Fd28vUFrLrjdLdQ0yloFl90%2Fimg.png)
의존성 주입에 왜 롬복을 알려줄까?왜냐하면, 의존성 주입 4가지 방법 중 생성자 주입방법을 가장 권장하기때문이다.생성자 주입은 생성자를 매번 만들어줘야하는데, 이 귀찮은 작업을 롬복이 도와준다. 1. 롬복이란?롬복(Lombok)은 Java 언어를 위한 라이브러리로 특정한 상황에서 반복적으로 작성되는 코드 조각을 줄여준다.개발자의 생산성을 향상시키는 데 도움이 된다.실무에서 아주 많이 쓰이는 라이브러리! 2. 롬복 라이브러리 설정하는 법 (build.gradle) ✔️build.gradle에 Lombok 라이브러리 코드를 추가하고 재빌드한다.//lombok 설정 추가 시작 configurations { compileOnly { extendsFrom annotationProc..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0LzSl%2FbtsHccElhn4%2FX4vHAvJ5XuAoPqQBzw9dk0%2Fimg.png)
주입할 스프링 빈이 없어도 동작해야 할 때가 있다.그래서 오늘 포스팅 주제는 '의존성 주입 옵션 처리'이다. 1. 자동 주입 대상을 옵션으로 처리하는 방법 3가지required = false@NullableOptional public class AutoWiredTest { @Test void AutoWiredOption(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class); } static class TestBean { //빈으로 등록되지 않은 Member를 주입하는 테스트 @Autowired(required = false)..
1. 의존성 주입이란? 의존성 주입(Dependency Injection, DI)은 객체가 자신의 의존성을 외부로부터 주입받는 디자인 패턴으로, 객체의 생성과 의존성 관리를 스프링 컨테이너가 담당한다. 이 방식은 객체가 자신이 필요로 하는 의존성을 직접 생성하거나 조회하지 않도록 함으로써 코드의 결합도를 낮추고, 유연성과 재사용성을 향상시킨다. 2. 의존관계 주입 방법 4가지생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입실무에서는 주로 생성자 주입과 수정자 주입을 쓰고 필드 주입과 일반 메서드 주입은 거의 쓰지 않는다.그 이유들을 정리하는게 이번 포스팅의 목표다. 3. 의존성 주입 과정스프링에서 스프링 빈을 등록하고 의존성을 주입하는 과정은 일반적으로 다음 단계로 이뤄진다. 1️⃣빈 ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOVCtB%2FbtsG5vq3d4b%2FrQoFECV4DRwN4T02WkyUik%2Fimg.png)
1. 컴포넌트 스캔스프링이 관리하는 컨테이너 내에서 개발자가 정의한 빈(Bean)을 자동으로 찾아서 스프링 컨테이너에 등록하는 메커니즘 2. 컴포넌트 스캔의 필요성컴포넌트 스캔을 하지 않으면 아래 코드와 같이 @Bean으로 일일이 등록해줘야한다.실제 개발환경에서는 훨씬 많은 빈(Bean)이 등록될텐데 이런 반복되는 작업을 컴포넌트 스캔으로 줄일 수 있다.@Configuration //설정정보에 적어주는 어노테이션public class AppConfig { @Bean //스프링 컨테이너에 등록이 된다. public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } @..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkR2E0%2FbtsG33ODXmQ%2FzoS9DOFDwlojGocLBdZEQk%2Fimg.png)
1. 싱글톤 패턴의 필요성웹 어플리케이션은 고객이 계속 요청을 하는데 현재 코드상으로는 고객이 요청을 할때마다 memberService객체가 매번 만들어지는 문제가 있다. ✅Appconfig코드//import는 생략했다.@Configuration //설정정보에 적어주는 어노테이션public class AppConfig { @Bean //스프링 컨테이너에 등록이 된다. public MemberService memberService(){ return new MemberServiceImpl(memberRepository());//생성자 주입 //MemberServiceImpl이 필요로 하는 MemberRepository 의존성을 외부에서 주입 } @Bean ..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8oNBF%2FbtsG0VQqKy9%2FuD5iqv41001B68Xdg8NRdK%2Fimg.png)
1. AppConfig 란?- 애플리케이션의 전체 동작 방식을 구성(config)하기 위해, 구현 객체를 생성하고, 연결하는 책임을 가지는 별도의 설정 클래스 2. AppConfig의 필요성- 클라이언트 코드는 구체클래스에 의존하면 안된다.(인터페이스에만 의존해야한다.) 3. 구체클래스에 의존하는 예제 코드public class OrderServiceImpl implements OrderService {// private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); private final DiscountPolicy discountPolicy = new RateDiscountPolicy();}위 코드를 보면 DiscountPolicy가 ..