spring 5

@ConfigurationProperties 외부 설정

📌 스프링은 외부설정의 묶음 정보를 객체로 변환하는 기능을 제공한다. 이것을 타입 안전한 설정 속성이라 한다. 객체를 사용하면 타입을 사용할 수 있다. 따라서 실수로 잘못된 타입이 들어오는 문제도 방지할 수 있고,객체를 통해서 활용할 수 있는 부분들이 많아진다. @Getter@ConfigurationProperties("my.datasource")@Validatedpublic class MyDataSourcePropertiesV3{ @NotEmpty private String url @NotEmpty private String username; @NotEmpty privaet String password; private Etc etc; public MyDat..

bean 생명주기 콜백 (@PostConstruct,@PreDestroy )

📌 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주고, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.  스프링 컨테이너 생성 > 스프링 빈 생성 > 의존관계 주입 > 초기화 콜백 > 사용 > 소멸전 콜백 > 스프링 종료   스프링에서 지원하는 콜백 방식 인터페이스(InitializingBean, DisposableBean)설정 정보에 초기화메서드, 종료 메서드 지정@PostConstruct,@PreDestroy 애노테이션 지원  이중에서 가장 간결하고 최신 스프링에서 권장하는 방법인 @PostConstruct, @PreDestory에 대해서 알아보자. public class NetworkClient{ private String url; pu..

Spring에서 조회 bean이 2개 이상일 때 (@Primary)

@Autowired 는 type으로 조회한다. @Componentpublic class FixDiscountPolicy implements DiscountPolicy{}@Component public class RateDiscountPolicy implements DiscountPolicy{}@Autowiredprivate DiscountPolicy discountPolicy > NouniqueBeanDefinitionException 오류가 발생한다. DiscountPolicy 의 하위타입인 FixDiscountPolicy, RateDiscountPolicy 를 둘 다 스프링 빈으로 선언했기 때문에  이때 하위 타입으로 지정할 수 도 있겠지만 그렇게 되면 DIP를 위배하고 유연성이 떨어진다.(구체에 의..

Spring 의존관계 자동 주입

의존관계 주입은 크게 4가지 방법이 있다. 생성자 주입수정자 주입(setter 주입)필드 주입일반 메서드 주입 대략 4년전 국비학원 시절.. 나는 필드 주입으로 배웠고 왜 필드 주입을 쓰는지도 모른채 실무에서도 필드 주입으로 열심히 개발을 했었다.  강의에서도 코드의 간결성때문에 많이 쓰였다는 얘기가 있었다. 하지만 필드 주입은 외부에서 변경이 불가능해서 테스트하기 힘들다는 치명적인 단점이 있다. @Componenetpublic class OrderServiceImpl implements OrderService{ @Autowired private MemberRepository memberRepository; @Autowired private DiscountPolicy discount..

컴포넌트 스캔과 의존관계 자동 주입

📌 @ComponentScan 어노테이션을 스프링 설정 파일에 붙여주면 ,@Component가 붙은 것 들은 다 스프링 빈으로 등록해준다. (@Configuration 도 @Component에 속하기 때문에 컴포넌트 스캔이 된다.) 수동 등록 vs 자동 등록   클래스에 @Componenet 를 붙이면 스프링 빈의 이름은 기본적으로 클래스 이름으로 등록되고 맨 앞글자는 소문자로 사용된다.(싱글톤으로 등록된다)생성자에 @Autowired 를 붙이면 의존관계를 자동 주입 해준다.  (생성자 주입) 스프링 bean 등록 확인 테스트 코드 public class AutoAppConfigTest { @Test void basicScan(){ AnnotationConfigApplicatio..