728x90

Mock 빈 오류에 관해서

그동안 혼자 공부한 것들을 토대로 프로젝트를 하나 해보려고 한다.
나름 공부한다고 공부를 했는데 HelloWorld 구현하는데 컨트롤러를 만들어두고 테스트 코드를 내의지대로 처음 작성해봤다.
MockMvc 클래스를 사용하여 Mock Bean을 주입받으려고 했더니 빈이 등록되지 않았다는 오류를 받았다.
일단 오류에는 두가지가 있었다.
@SpringBootTest 어노테이션을 사용할때 @WebMvcTest도 같이 사용해서 MockBean을 주입받는줄 알고 바로 넣었는데 두 Mock객체가 공유되어있는 객체가 아니고 서로 다른 객체이다. 그래서 두개의 빈이 충돌이 발생한다.

여기서 해결책은 두가지였다.

  • @SpringBootTest@AutoConfigurationMockMvc를 사용한 후 MockMvc의 @Autowired를 제거 하는 방법
  • @ExtendWith, @WebMvcTest@Autowired를 같이 사용하는 방법

이렇게 두가지가 있었다.

먼저 @SpringBootTest의 경우 일반적인 테스트로 슬라이싱을 사용하지 않기 때문에 전체 응용 프로그램 Context를 시작한다. 때문에 전체 응용 프로그램을 불러서 모든 bean을 주입하기 때문에 속도가 느리다고 한다.

@WebMvcTest의 경우는 뒤에 ()를 사용해 특정 레이어를 테스트하고 모의 객체를 사용하기 때문에 필요한 bean을 직접 세팅해줘야 하는 단점이 있지만, 가볍고 빠르게 테스트 할 수 있다.

위의 두가지중 아래의 방법에서는 같이 @AutoConfigurationMockMvc를 사용이 가능하다.

가짜 객체인 Mock을 사용할 때 bean 주입하는데에 있어서 이것을 생각하고 주입해주도록 하자.

728x90

'Spring' 카테고리의 다른 글

Spring Data JPA  (0) 2022.08.06
Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] Spring Security  (0) 2022.08.03
의존성 주입 어노테이션 정리  (0) 2022.08.03
728x90

스프링 시큐리티

스프링 시큐리티는 스프링 기반의 애플리케이션의 보안(인증, 권한, 인가 등) 을 담당하는 스프링 하위 프레임워크이다.
인증인과를 담당하는 프레임워크이다.

🔒스프링 시큐리티 특징과 구조

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있다

  • Filter 기반으로 동작하여 MVC와 분리하여 관리 동작

  • 어노테이션을 통한 간단설정

  • 세션과 쿠키 방식으로 인증

  • 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리

어떤 유저가 로그인을 했을 시에 기본 회원과 admin 유저가 있다고 가정을 하면 회원인지 admin인지 인증 관리자가 먼저 판단을 한다. 그래서 누구인지 명확하게 알고 이 로그인한 유저에 대한 권한을 접근 결정 관리자가 판단을 하는데 여기서 특정 기능에 대한 권한이 없다면 그 동작은 실행시켜주지 않게끔 동작을 수행한다.

  • 인증 관리자는 UsenamePasswordAuthenticationFilter, 접근 결정 관리자는 FilterSecurityInterceptor가 수행한다.

🔒스프링 시큐리티 기본 구조
스프링 시큐리티 기본 구조

📢각 필터별 기능 설명

필터 기능
SecurityContextPersistenceFilter SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당함
LogoutFilter 로그아웃 URL로 지정된 가상URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃 시킴
UsernamePasswordAuthenticationFilter 사용자 명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함
DefaultLoginPageGeneratingFilter 폼기반 또는 OpenId 기반 인증에 사용하는 가상URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성한다
BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하고 이를 처리함
RequestCacheAwareFilter 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용됨 --> 현재 요청과 관련있는 캐시 요청이 있는지 확인하고 있다면 캐시요청을 처리해줌
AnonymousAuthenticationFilter 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨
SessionManagementFilter 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움
ExceptionTranslationFilter 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리
FilterSecurityInterceptor 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌
728x90

'Spring' 카테고리의 다른 글

Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] MockMvc Bean 주입 에러  (0) 2022.08.04
의존성 주입 어노테이션 정리  (0) 2022.08.03
Spring Test MockMvc 한글 깨짐 처리  (0) 2022.08.03
728x90

@Resource, @Autowired, @Inject 차이점 정리

세 개의 어노테이션은 컨테이너에 생성된 빈(Bean) 객체를 자동으로 주입받을 수 있도록 해주는 어노테이션들이다. 주의할 점은 Bean 객체가 생성될 때 어노테이션을 스캔해서 자동 주입해준다. 일반적인 방법으로 해당 클래스의 instance를 new해서 생성하면 어노테이션은 작동하지 않는다.
그냥 Bean 설정 파일에서 하나하나 ref="다른bean" 을 생략할수 있다. 설정파일에서 Bean을 등록하지 않고 어노테이션을 통해(@Bean) 등록할 수도 있는데 원리는 같다.

@Resource

Java에서 지원하는 어노테이션이며 특정 프레임워크에 종속적이지 않다.
순서는 아래와 같다.

이름 > 타입 > @Qualifier > 성공

name 속성의 이름을 기준으로 찾는다. 없으면 타입, 없으면 @Qualifier 어노테이션의 유무를 찾고 그 어노테이션이 붙은 속성에 의존성을 주입한다.

context:annotation-config/ 구문을 꼭 xml에 추가해야한다.

사용할 수 있는 위치
멤버변수, setter메소드

@Autowired

Spring에서 지원하는 어노테이션
찾는 순서

타입 > 이름 > @Qualifier > 성공

@Autowired는 주입하려고 하는 객체의 타입이 일치하는지를 찾고 객체를 자동으로 주입한다.
만약 타입이 존재하지 않는다면 @Autowired에 위치한 속성명이 일치하는 bean을 컨테이너에서 찾는다. 그리고 이름이 없을 경우 @Qualifier 어노테이션의 유무를 찾아 그 어노테이션이 붙은 속성에 의존성을 주입해준다.

context:annotation-config/ 구문을 꼭 xml에 추가해야한다.

사용할 수 있는 위치
생성자, 멤버변수, setter 메소드에 적용이 가능함.

스프링 4.3버전 이후부터 생성자가 1개일경우 @Autowired 어노테이션을 생략이 가능하다.

@Inject

Java에서 지원하는 어노테이션이다. 특정 프레임워크에 종속적이지 않다.
찾는 순서

타입 > @Qualifier > 이름 > 실패

@Autowired와 동일하게 작동은 하지만 찾는 순서가 다르다.
@Inject를 사용하기 위해선 maven이나 gradle에 javax 라이브러리 의존성을 추가해야한다.

사용할 수 있는 위치
멤버변수, setter 메소드, 생성자, 일반 메소드에 적용 가능

@Qualifier

만약에 타입이 동일한 bean객체가 여러개가 있을시에 Spring이 Exception을 일으킨다.
스프링이 어떤 bean을 어떤것에 주입해야될지 모르기 때문에 스프링 컨테이너를 초기화하면서 에러를 발생시킨다.

  • @Autowired의 주입대상이 한개여야하는데 실제로 두개 이상의 Bean이 존재하여 주입할때 객체를 선택할 수 없다.
  • 단, @Autowired가 적용된 필드나 설정 메소드의 property 이름과 같은 이름을 가진 Bean객체가 존재할 경우에는 이름이 같은 Bean 객체를 주입받는다.

Exception
@Qualifier에 지정한 Bean 한정자 값을 갖는 Bean이 존재하지 않으면 Exception 발생함.

정리

@Resource @Autowired @Inject
범용 Java에서 지원 Spring 전용 Java에서 지원
연결방식 이름으로 매핑 타입에 맞춰서 연결 타입에 맞춰서 연결
728x90

'Spring' 카테고리의 다른 글

Spring -> Spring Boot 마이그레이션  (0) 2022.08.05
[Spring] MockMvc Bean 주입 에러  (0) 2022.08.04
[Spring] Spring Security  (0) 2022.08.03
Spring Test MockMvc 한글 깨짐 처리  (0) 2022.08.03

+ Recent posts