Inner Class를 스프링 빈으로 등록하는 경우 static 키워드를 붙여주지 않으면 오류가 발생합니다. 다음 코드를 통해 확인하겠습니다. @SpringBootTest class InnerClassTests { @Test void AutowiredOption() { ApplicationContext ac = new AnnotationConfigApplicationContext(InnerClass.class); } class InnerClass { @Autowired public void setNoBean1(){} } } 발생하는 오류 UnsatisfiedDependencyException: Error creating bean with name 'InnerClassTests.InnerClass': Un..
분류 전체보기
빈 스코프 빈 스코프는 빈이 존재할 수 있는 범위를 뜻합니다. 스프링은 다음과 같은 다양한 스코프를 지원합니다. 싱글톤(singleton) : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넒은 범위의 스코프입니다. 프로토타입(prototype) : 스프링 컨테이너가 프로토타입 빈의 생성과, 의존관계 주입까지만 관여하고 더는 관리하지 않는 매우 짦은 범위의 스코프입니다. (초기화 메서드까지만 불러주고 더는 관리하지 않기에 종료 메서드는 호출되지 않습니다.) 웹 관련 스코프 : request : 웹 요청이 들어오고 나서 나갈때 까지 유지되는 스코프입니다. session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프입니다. application : 웹의 서블릿 컨텍스트와 같은 범위로..
스프링 빈의 생명주기 관리 빈이 생성되거나 소멸되는 경우 특정한 작업을 하고싶은 경우가 있습니다. 하나의 예시로는 빈이 생성될 때 데이터베이스 커넥션 풀을 미리 생성하는 경우가 있습니다. 이러한 작업을 위해 스프링 빈의 초기화 작업과 종료 작업을 처리하는 방법을 알아보도록 하겠습니다. 스프링 빈 생명주기 콜백 빈 생명주기 콜백은 스프링 빈이 생성된 후 의존관계 주입이 완료되거나 죽기 직전에 스프링 빈 안에 있는 메서드를 호출해주는 기능입니다. 스프링 빈의 이벤트사이클 스프링 컨테이너 생성 $\to$ 빈 생성 $\to$ 의존관계 주입 $\to$ 초기화 콜백 $\to$ 사용 $\to$ 소멸전 콜백 $\to$ 스프링 종료 초기화 콜백 : 빈이 생성되고 빈의 의존관계 주입이 완료된 후 호출됩니다. 소멸전 콜백 ..
보호되어 있는 글입니다.
요즘은 OAuth2를 사용하여 소셜 로그인을 통해 가입이 가능한 서비스들이 굉장히 많다. 스프링 시큐리티에서도 OAuth2를 이용한 소셜 로그인 방식을 지원하는데, 필자는 맨 처음 이를 사용할때 너무 어려웠었다. 지금부터 시큐리티에서 OAuht2가 어떻게 동작하는지 알아보자. 의존성 관리 우선 OAuth2를 사용하려면 OAuth2-client 라이브러리를 이용해야 한다. build.gradle 에 다음을 추가하자. implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' oauth2Login() 의 작동방식 WebSecurityConfigurerAdapter 를 상속받은 Security Config 파일에서 oauth2 로그인..
@Autowired 사용 시 조회된 빈이 2개 이상일 경우 @Autowired를 통한 의존관계 자동 주입 방법을 사용할 경우에, 동일한 타입의 빈이 2개 이상이라면 오류가 발생합니다. 이는 두개의 빈들 중 어떠한 빈을 주입해야 할 지 결정하지 못해서 발생하는 문제인데, 간단하게는 구체 클래스를 사용하거나, 구체 클래스에 해당하는 필드명(혹은 파라미터명)을 사용함으로써 해결할 수 있습니다. 그러나 이는 DIP를 위반하는 방법입니다. 이를 해결하기 위한 방법으로 @Qualifier와 @Primary와, 어노테이션을 직접 만들어 사용하는 방법이 있는데, 하나하나 살펴보도록 하겠습니다. @Primary 사용 @Primary는 우선순위를 정하는 방법입니다. 사용방법은 되게 간단합니다. @Componet @Prim..
특정 타입의 빈이 여러개 등록되어 있을 때, 등록한 모든 빈이 필요한 경우가 있습니다. 사용자의 등급에 따라 다른 서비스가 적용되어야 하거나, 여러 서비스들 중 하나를 클라이언트가 선택할 수 있는 경우 등의 경우가 그 예시입니다. 이럴 때 List나 Map, Set을 사용하여 쉽게 해결할 수 있습니다. 등록한 빈 모두 조회 방법을 알아보자. public class DiscountService { private final Map policyMap; private final List policiList; private final Set policieSet; @Autowired public DiscountService( Map policyMap, List policiList, Set policieSet ){ ..
@Qualifier의 문제점 @Qualifier("mainDiscountPolicy") 처럼, 문자를 직접 적어주는 방식은 컴파일 시점에 체크가 되지 않습니다. 이를 해결하기 위해 어노테이션을 직접 만들어서 사용하는 방법이 있습니다. 어노테이션 직접 만들기 다음과 같이 어노테이션 속 @Qualifier를 사용하여 직접 어노테이션을 만들 수 있습니다. @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER,ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Qualifier("mainDiscountPolicy") pu..