spring 5

[TroubleShooting] Ambiguous @ExceptionHandler method mapped for [class ... MethodArgumentNotValidException]

TroubleShooting 발생한 문제 GlobalExceptionHandler 를 작성중에 다음과 같이 작성중에 아래 와 같은 Bean creation 문제가 터졌다. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'handlerExceptionResolver' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Failed to instantiate [org.springframework.web...

Troubleshooting 2024.02.02

Spring Security - Filter의 동작 원리

Spring Security 동작 원리 이해하기 이 글은 다른 글들을 짜집기하여 본인의 Spring Security 이해를 돕기 위해 작성하는 글입니다. Security를 커스터마이징하여 사용하기 앞서 동작 원리를 이해하고 프로젝트에 적용하기 위해 정리를 합니다. Spring Security는 웹 서비스에서 MVC 패턴 이전에 작동하는 `필터`로서 동작합니다. 필터란 클라이언트 요청이 서블릿으로 가기 전에 먼저 처리할 수 있도록 톰캣(WAS)에서 지원해주는 기능입니다. 그래서 설정도 톰캣의 설정파일인 `web.xml`에 하지만, 스프링 부트를 사용하는 환경이고, 최신 스프링 부트(2.7 버전 이상)에서는 컴포넌트 기반의 설정을 지향하므로 컴포넌트 기반의 설정법을 다루어볼 예정입니다. 이 글의 중심은 Sp..

Web Dev/Spring 2022.08.02

Spring: 로그인 - UserDetailsServiceImpl loadUserByUsername 문제

발생한 문제 Spring Security 를 이용해 로그인을 만들던 도중 문제가 생겼다. AuthenticationManager 가 username과 password를 받아 처리해야하게끔 하려고 했다. 그래서 WebSecurityConfig에 다음과 같이 처리하였다. @Bean // Security 추가 설정하도록 빈 생성 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // API (POST /api/**) 에 대해 CSRF 무시 http.csrf() .ignoringAntMatchers("/**"); http .authorizeHttpRequests((authz) -> authz .antMatchers("/ima..

Troubleshooting 2022.08.01

IoC, DI, 컨테이너 그리고 Bean

IoC, DI 그리고 컨테이너 모든 객체는 클라이언트 객체와 서버 객체로 나뉜다. 이 때, 호출하는 객체가 호출 당하는 객체에게 의존적이며 의존 관계에 있다고 표현한다. IoC 제어의 역전 (Inversion of Control) 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 서버 구현 객체를 생성하고, 연결하고, 실행했다. 한마디로 구현 객체가 프로그램의 제어 흐름을 직접 조종했다. 개발자 입장에서는 당연한 흐름이다. 반면에 AppConfig(스프링의 역할을 대신 해주는 커스텀 클래스)가 생긴 이후에는 구역 영역과 사용 영역으로 나뉘어 AppConfig는 사용해야하는 객체를 구현하고 역할을 표현하는 일만하고 사용 영역은 비즈니스 로직을 담당하게 되었다. 이렇게 객체가 스스로 사용해야하는 객체를 ..

Web Dev/Spring 2022.07.29

스프링 시작시 코드를 실행 시키는 3가지 방법

스프링 시작시 코드를 실행 시키는 3가지 방법 캠프 강의를 듣다가 스프링 부트를 시작하는 main메소드가 들어있는 OOOApplication.java 내부에 새로운 메소드를 만들어 테스트를 진행하는 것을 보고 정리해두면 좋을 것 같아 적는다. 스프링 부트가 시작되고 각 빈들이 만들어지게 되는데 이 때 초기화를 하고 필요한 로직을 끼워 넣는 방법이다. 사용할 일이 있을 것 같긴 하나 구체적으로는 모르겠어서 일단 정리해둔다. 0. 스프링 부트 애플리케이션 main 메소드 내부에 코드 넣기 제일 쉬운 방법이다. 스프링을 시작하려면 이 main method를 거쳐가게 되고, 그 이후에 어떤 코드를 넣는다면 스프링 부트가 초기화되고 난 이후에 바로 실행이 가능하다. 다만, 보통의 경우에는 스프링을 통해 생성된 빈..

Web Dev/Spring 2022.07.22