1. 개요보통 횡단 관심사(로깅, 트랜잭션, 인증/인가 등)를 분리하기 위해 Spring AOP를 많이 사용한다. Spring AOP 방식 외에도 관심사를 분리하기 위해 Filter 또는 Interceptor를 사용하기도 한다. Filter와 Interceptor가 무엇인지 알아보고, 어떤 차이가 있는지 살펴보자. 2. 요청 처리 구조필터와 Interceptor를 알아보기 전에 일반적인 Spring Boot 서버는 클라이언트 요청을 어떻게 처리하는지 간략하게 짚고 넘어가자. 클라이언트가 요청을 보내면 어떻게 처리될까?클라이언트가 브라우저에서 요청을 보내면, 가장 뭔저 톰캣(WAS)이 이를 받는다. 톰캣은 웹 서버이자 서블릿 컨테이너로서 요청을 적절한 서블릿을 찾아 전달한다. 이때 Spring 컨테이너에 ..

Programming/Spring
1. 개요Spring Boot로 페이지네이션 API를 구현할 때 보통, Pageable을 사용하여 간편하게 구현한다.Pageable을 컨트롤러의 메서드의 인자로 선언할 때, Spring MVC는 요청 파라미터를 자동으로 해석하여 Pageable 객체를 주입해준다. 어떤식으로 동작하는지 자세히 살펴보자.@RequiredArgsConstructor@RequestMapping("/v1/articles")@RestControllerpublic class ArticleController { @GetMapping public ResponseEntity>> getArticles( @PageableDefault(size = 10, sort = "createdAt", direction = S..
1. 개요현재 프로젝트에서 Spring Security로 세션-쿠기 기반 인증을 사용하며, Spring SecurityFilterChain을 커스터마이징하여 REST API 방식으로 인증을 처리하고 있다. Form 로그인 방식을 사용하지 않고, AbstractAuthenticationProcessingFilter를 상속받은 커스텀 인증 필터( ApiAuthenticationFilter)를 UsernamePasswordAuthenticationFilter 이전에 실행되도록 등록했다. SecurityFilterChain 구성 예시@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http ..
개요보통 단위 테스트에서 의존 객체의 메서드 호출을 검증하기 위해 verify(), BDDMockito.then() 메서드를 사용한다.의존 객체의 메서드 호출 여부외에도 호출 시 전달된 인자까지 검증하고 싶어 찾아보다가, ArgumenetCaptor라는 것을 알게되었다. ArguementCaptor란?Mockito에서 제공하는 테스트 유틸리티로 모킹된 객체의 메서드 호출될 때 전달된 인자를 캡처(capture)하여, 테스트 코드 내에서 해당 인자를 검증할 수 있게 하는 기능이다.이를 통해, 단순히 메서드 호출 여부뿐만 아니라, 호출 시점에 어떤 인자가 전달되었는지에 대해 검증할 수 있다. ArguementCaptor 적용 코드ArgumentCaptor.forClass(User.class)를 통해 캡처하고..
1. 개요@DataJpaTest를 통해 Repository 계층에 대한 슬라이스 테스트 작성하고 있었다.그 과정에서 메서드 레벨에서 개별적으로 테스트를 실행했을 때는 정상적으로 테스트가 통과되었지만, 클래스 레벨 혹은 전체 테스트를 실행했을 때 테스트가 실패하는 경우가 발생했다. 코드와 로그를 통해 문제의 원인을 파악해 보자. 2. 문제 코드문제 코드data.sql 파일은 테스트용 데이터를 삽입하기 위한 sql 구문이 들어 있는 파일이다.@Sql을 통해 테스트 데이터 삽입을 위해 data.sql을 실행하고 있다.@DisplayName("Repository - 회원")@Sql(scripts = "/sql/data.sql")@Import(TestJpaConfig.class)@DataJpaTestclass U..
1. 개요김영한님의 실전! '스프링 부트와 JPA 활용2 - API 개발과 성능 최적화' 강의를 수강하면서 개인적으로 중요하게 생각하는 핵심 부분과 새롭게 알게된 내용을 정리한 포스팅입니다https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-API%EA%B0%9C%EB%B0%9C-%EC%84%B1%EB%8A%A5%EC%B5%9C%EC%A0%81%ED%99%94/dashboard 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의 | 김영한 - 인프런김영한 | , 스프링 부트, 실무에서 잘 쓰고 싶다면? 복잡한 문제까지 해결하는 힘을 길러보세요. 🚩 본 강의는 로드맵 과정입니다. 본 강의는 자..
1. 개요김영한님의 '실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발' 강의를 수강하면서 개인적으로 중요하게 생각하는 핵심 부분과 새롭게 알게된 내용을 정리한 포스팅입니다https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard 실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 강의 | 김영한 - 인프런김영한 | , 스프링 부트, 실무에서 잘 쓰고 싶다면? 깊이있는 설계와 개발을 경험해 보세요. 🚩 본 강의는 로드맵 과정입니다. 본 강의는 자바 백엔드 개발의 실전 코스를 시작하는 첫 강의입니www.inflearn.com 2. 도메인 모델 ..
1. 개요Spring Boot에서 정의되지 않은 API를 호출할 때, 기본적으로 반환되는 404 응답을 원하는 형식으로 커스터마이징 하고자 한다. 이를 위해 Spring Boot에서 예외를 처리하는 동작 방식을 분석하고, 응답을 커스텀 하게 정의해보자. 기본적으로 정의되지 않은 API를 호출하면 아래와 같은 응답이 반환된다. 1. 헤더의 미디어 타입이 text/html 일 때미리 정의된 에러 페이지를 반환한다. 2. 헤더의 미디어 타입이 text/html 아닐 때미리 정의된 JSON 형식의 응답을 반환한다.{ "timestamp": "2025-04-03T06:05:25.489+00:00", "status": 404, "error": "Not Found", "path": "/api/v..
1. 개요Spring Boot로 시계열 데이터베이스인 InfluxDB 2와 연동하는 방법에 대해서 알아보자. 2. InfluxDB 서버 환경 구성먼저 InfluxDB를 도커로 띄워보자. https://docs.influxdata.com/influxdb/v2/install/use-docker-compose/ Install InfluxDB using Docker Compose | InfluxDB OSS v2 DocumentationThank you for your feedback! Let us know what we can do better:docs.influxdata.comdocker-compose.ymlversion: '3.8'services: influxdb: image: influxdb:2 ..
1. 비동기 프로그래밍이 필요한 이유비동기란 현재 처리중인 쓰레드에서 작업하던 Task를 다른 sub 쓰레드에게 Task를 위임하는 행위이다. 비동기를 사용하면 클라이언트는 서버에게 요청을 하고 응답을 기다릴 필요가 없다.그로 인해 더많은 Task를 처리할 수 있고, 실시간 성 응답이 필요없는 경우 유용하게 사용할 수 있다. 비동기가 필요한 경우 예시회원 가입 후 이메일 전송: 사용자는 회원가입을 완료하면, 이메일을 비동기적으로 처리하여 사용자는 회원가입만 완료되면 다른 작업을 처리할 수 있다.알림 기능: 특정 이벤트가 발생한 후 사용자에게 알림을 비동기적으로 보내어, 프로세스가 멈추지 않고 계속 실행하도록 한다. 2. Thread Pool 정의a. Thread Pool이란?Thread Pool이란 ..