분류 전체보기(593)
-
@Qualifier, @Primary를 사용하여 스프링 빈 조회
1. @Qualifier, @Primary의 필요성 @Autowired나 스프링 컨테이너의 getBean()과 같은 메소드를 이용하여 스프링 컨테이너의 스프링 빈을 타입으로 조회하는 경우가 있습니다. 그런데 스프링 컨테이너에 동일한 타입의 스프링 빈이 2개 이상 있는 경우 타입으로 조회시 NoUniqueBeanDefinitionException 에러가 발생할 수 있습니다. 예를 들어 DiscountPolicy라는 인터페이스의 구현체가 2개가 있고 두 구현체 모두 스프링 컨테이너에 스프링 빈으로 등록되어 있는 상태입니다. 위와 같은 상황에서 @Autowired를 사용하여 자동 주입을 수행할때 스프링 빈의 타입으로 조회합니다. 위 그림과 같이 자동 주입시 DiscountPolicy 인터페이스 타입으로 등록되..
2023.05.06 -
컴포넌트 스캔의 스프링 빈 중복 등록과 충돌
스프링 빈 중복 등록 컴포넌트 스캔시 @Component, @Service와 같은 애노테이션이 적용된 클래스를 대상으로 자동으로 스프링 빈으로 등록할수도 있지만 @Configuration과 @Bean을 통해서 수동적으로 빈을 등록할 수 있습니다. 스프링 빈이 중복 등록되는 경우 어떻게 되는지 알아봅니다. 1. 자동 빈 등록 vs 자동 빈 등록 NoUniqueBeanDefinitionException 예외 발생 동일한 인터페이스를 구현한 구현체가 2개 있고 두 구현체 모두 @Component를 적용하였다고 가정합니다. @Component public class MemoryMemberRepository implements MemberRepository { // ... } @Component public cl..
2023.05.03 -
컴포넌트 스캔의 필터(Filter) 생성
필터 필터의 필요성 컴포넌트 스캔시 옵션으로 includeFilter 또는 excludeFilter를 통해서 특정한 범위의 대상은 스프링 빈으로 등록하거나 제외할 수 있습니다. 이때 includeFilter 또는 excludeFilter 옵션값으로 필터를 설정합니다. 필터(Filter)의 종류 includeFilter : 컴포넌트 스캔에 스프링 빈으로 등록할 탐색 범위를 추가합니다. excludeFilter : 컴포넌트 스캔에 스프링 빈으로 등록 제외할 탐색 범위를 추가합니다. 필터 등록 방법 1. includeFilter에 설정할 커스텀 애노테이션 정의 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @in..
2023.05.03 -
컴포넌트 스캔(ComponentScan)
목차 컴포넌트 스캔의 필요성 컨포넌트 스캔 예시 excludeFilters basePackages basePackageClasses 컴포넌트 스캔(ComponentScan) 컴포넌트 스캔은 클래스를 탐색하며 @Component 애노테이션이 붙은 클래스를 스프링 빈으로 등록하는 기능입니다. 컴포넌트 스캔의 필요성 컴포넌트 스캔이 필요한 이유는 기존 @Bean을 통해서 수동적으로 스프링 빈을 등록하였지만, 등록할 빈 개수가 증가할수록 관리가 어려워집니다. 따라서 이러한 빈 등록을 자동적으로 해야할 필요성이 있습니다. 컴포넌트 스캔을 사용하지 않고 기존 스프링 빈을 등록하는 대표적인 방법은 @Bean 애노테이션을 사용하는 것입니다. 다음 코드와 같이 @Configuration 애노테이션이 적용된 클래스의 메소..
2023.05.03 -
SRP(Single Responsility Principle, 단일 책임 원칙)
SRP(Single Responsility Principle, 단일 책임 원칙) 단일 책임 원칙은 어떤 원칙인가? 어떤 한 객체는 하나의 책임만을 가져야 한다는 원칙입니다. 여기서 책임이란 어떤 객체가 그 객체에 맞는 역할을 수행하기 위한 기능들을 의미합니다. 역할은 객체가 어떤 책임들을 수행할 것인지 정의한 것입니다. 제 주관적인 생각으로는 단일 책임이라는 표현보다는 단일 역할 원칙이라는 표현이 더 적절하다고 생각합니다. 즉, 한 객체는 하나의 역할만을 갖고 책임들을 수행해야 한다는 원칙이라고 생각합니다. 역할 : 객체가 역할에 맞는 책임들을 수행할 것인지 정의한 것 책임 : 역할에 맞는 기능들 예를 들면 자동차라는 객체의 주요한 역할은 운전하는 것입니다. 그렇다면 자동차 역할에 따른 책임들이 존재할 ..
2023.05.03 -
애플리케이션 logging을 위한 적절한 방법
1. 작업을 위해서 적절한 도구들을 사용하자 SLF4J를 활용하여 다음과 같이 구현할 수 있습니다. log.debug("Found {} records matching filter: '{}'", records, filter); 2. 잊지말자, 로깅 레벨(logging levels)들은 너를 위한 것이다. 1) ERROR : 요청을 처리하는 중 오류가 발생한 경우 표시됩니다. 2) WRAN : 처리 가능한 문제, 향후 시스템 에러의 원이 될 수 있는 경고성 메시지를 표시합니다. 3) INFO : 상태 변경과 같은 정보성 로그를 표시합니다. 4) DEBUG : 프로그램을 디버깅하기 위한 정보를 표시합니다. 5) TRACE : 추적 레벨은 DEBUG 레벨보다 훨씬 상세한 정보를 표시합니다. 3. 무엇을 로깅할 ..
2023.05.01