본문 바로가기

분류 전체보기

(78)
자동/수동 빈에 대한 올바른 선택 정답은 없지만 영한님이 추천해주신 기준은 이렇다. ∨ 빈 자동 등록 - 업무 로직은 '컨트롤러, 서비스, 리포지토리'와 같이 어느정도의 패턴이 있고 로직 수도 매우 많다. 따라서 자동 기능을 권장한다. 문제가 발생한다면 그 위치도 파악하기 쉬운 것이 업무 로직이다. ∨ 빈 수동 등록 - 기술 지원 로직은 애플리케이션 전반에 광범위한 영향을 미치고 그 수도 적다. 또한 업무로직에 비해 기술 지원 로직은 적용이 되고있는지 아닌지 파악이 어려운 경우가 많다. 따라서 수동으로 빈을 등록하여 설정 정보에 바로 나타나게끔 명확히 하는 것이 좋다. (스프링이 제공하는 자동 등록 빈 기능은 예외다. 그건 스프링의 의도대로 사용하자.) - 비즈니스 로직 중에서도 다형성을 적극 활용하고 있는 경우 수동 빈 등록이 좋을 수..
annotation 직접 만들기 (@Qualifier 관련) 이전 학습에서 @Autowired가 주입해줄 빈을 조회할 때 동일타입 빈이 2개이상 존재할 때 해결하는 방법 중 하나로 @Qualifier를 지정하는 방법을 알았다. (약간 포트키같은 느낌으루다가...) 그러나 @Qualifier를 연결할 때 @Qualifier("mainDiscountPolicy")처럼 지정을 하는데, 문자열이다보니까 오타가 날 수도 있다. 그래서 문제가 있어도 컴파일타임에 잡아낼 수 없다. 이를 해결하는 좋은 방법은 @Qualifier 관련된 annotation을 새로 직접 정의해주는 것이다. (저 위에 붙은 annotation들은 @Qualifier에서 그대로 긁어온 것이다. @Qualifier 기능을 그대로 가져야 하므로..) @Target({ElementType.FIELD, El..
@Autowired 조회 빈이 2개 이상일 때 | 문제점 해결 & 해당 타입 빈 모두 보기 @Autowired도 ac.getBean(XXX.class)처럼 Type으로 조회하기 때문에 해당 타입 빈이 유일하지 않다면 문제다. 예시) 만약 생성자에서 DiscountPolicy를 주입받는 상황이라고 하자. (by @Autowired) 그런데 DiscountPolicy의 하위 클래스 중 @Component인 클래스가 2개일 때, 그러니까 FixDiscountPolicy와 RateDiscountPolicy로 2개가 스프링빈으로 등록되어있을 때, @Autowired 의존관계 자동 주입시 NoUniqueBeanDefinitionException 오류가 발생한다. 이러한 의존관계 자동 주입시 동일타입 빈 문제를 어떻게 해결할까? 3가지 방법이 있는데, @Primary를 많이 사용한다. 나머지 방법들도 사용..
생성자 코드 최적화 - lombok 라이브러리 생성자 코드를 최적화하기 위해서 lombok 라이브러리를 사용 lombok 라이브러리 추가 & 플러그인 설치 후 다음과 같이 변경할 수 있었다. - 이전 코드 : final 필드에 대해 생성자 내용 작성이 필요하다. @Component public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRep..
생성자 주입 권장 수정자 주입 문제점 : setter를 public으로 열어두는 것은 변경의 소지가 있음 => 좋지 않은 설계임 : 프레임워크 도움 없이 순수하게 자바코드로 단위테스트 할 경우 생성자 주입 권장 : 대부분 한번 의존관계를 주입하면 애플리케이션 종료때까지 변경할 일이 없고, 불변해야 함 : 생성자는 객체생성시 딱 1번만 호출하므로 불변 설계 가능 : final 키워드를 사용할 수 있다. 생성자에서만 세팅 가능 & 반드시 세팅하게 됨 & 한번 정해지면 불변 필드 주입은 사용하지 말자 : 코드는 엄청 간단하지만.. 그냥 앞에 @Autowired를 붙이면 끝이지만.. : 스프링 컨테이너 없이는 Test 아예 불가 : 딱딱해짐 (예시) ∨ 수정자 메서드를 둘 경우 Test에서 자주 만나게 될 문제 (순수 자바 코드..
자동주입 - 옵션 처리 @Autowired에서 주입가능한 스프링 빈이 없어도 동작해야 할 때가 있다. cf. required 옵션 디폴트가 true라서 주입대상이 없으면 오류가 발생한다. ↓ 자동 주입 대상을 설정해야 한다. 자동 주입 대상을 옵션으로 처리하는 방법을 알아보자 ↓ 예제) 스프링빈으로 관리되는 객체가 아닌 Member객체를 @Autowired 메서드의 매개변수로 넣은 상태다. 즉 @Autowired에서 주입가능한 스프링빈이 없는 상태이다. static class TestBean { //1. //호출 안됨 - 의존관계가 없을 경우 아예 호출안됨 @Autowired(required = false) public void setNoBean1(Member member) { System.out.println("setNoBe..
3회차 결과 section7 : 의존관계 자동 주입
3회차 목표 스프링 section 6~7
다른 블로그