본문 바로가기
  • 개발하는 곰돌이

spring boot35

[Spring Scheduler] 서버 이중화 또는 증설 시 ShedLock을 사용하여 스케쥴러 중복 실행 방지하기 목차들어가기 전에여러가지 이유로 구동되고 있는 서버를 증설해야 하는 경우가 있습니다. 이렇게 서버가 증설되어 여러 대의 서버 인스턴스에서 동일한 서버 애플리케이션이 구동되고 있다면 스케쥴러를 통해 정해진 시간에 주기적으로 동작하는 로직은 여러 서버에서 동시에 실행되었을 때 문제가 발생할 수 있기 때문에 오직 하나의 서버에서만 스케쥴러 작업이 수행되도록 하는 것이 좋습니다. 이번 포스트에서는 오픈 소스 라이브러리인 ShedLock을 사용하여 스프링 애플리케이션의 스케쥴러가 중복으로 실행되지 않도록 방지하는 내용을 다루고자 합니다.ShedLock?ShedLock은 MongoDB, Redis, RDBMS 등의 외부 저장소를 사용하여 다른 노드나 스레드에서 동일한 스케쥴러 작업이 중복 실행되지 않도록 해주는 오.. 2024. 9. 9.
[Spring/Spring Boot] 파일 다운로드와 multipart/form-data 업로드 컨트롤러 메소드 테스트 코드를 작성해보자 목차들어가기 전에최근에 파일을 다운로드 받는 컨트롤러 메소드와 파일을 업로드해서 처리하는 컨트롤러 메소드를 작성하면서 해당 컨트롤러 메소드가 제대로 돌아가는지 확인하려고 테스트 코드를 작성할 일이 있었습니다. 평소에 작성하는 테스트 코드는 평범한 요청과 응답을 가지는 로직에 대한 테스트 코드 뿐이었다 보니 파일 업로드/다운로드와 관련된 테스트 코드를 작성한다는게 상당히 생소했는데 나중에 까먹지 않으려고 기록해두려고 합니다. 본문상의 코드는 모두 코틀린으로 작성되어 있긴 하지만 가장 중요한 파일 업로드나 다운로드 검증 부분은 자바도 별반 다르지 않습니다.파일 업로드 테스트일반적으로 파일을 업로드하는 로직은 MultipartFile을 사용하는 경우가 많습니다. 이를 테스트하기 위해 스프링에서는 Multipa.. 2024. 8. 14.
[MockMvc] MockMvc 테스트 시 한글이 깨져서 테스트에 실패하는 문제 목차문제의 상황Spring REST Docs를 공부해보기 위해 이전에 작성했던 코드의 컨트롤러 테스트 코드를 MockMvc를 사용해서 작성하고 있었다.@SpringBootTest@AutoConfigureMockMvc@AutoConfigureRestDocsclass AdminControllerTest @Autowired constructor( private val tokenProvider: TokenProvider, private val memberRepository: MemberRepository, private val mockMvc: MockMvc, private val objectMapper: ObjectMapper = ObjectMapper()) { @Test fun.. 2024. 6. 19.
[Spring Boot] 스프링 인터셉터(Spring Interceptor)를 활용해서 API 로그를 DB에 기록해보자 목차 들어가기 전에 이전 포스트에서 AOP를 사용해서 API 로그를 기록하는 내용을 다뤘는데 이런 이야기를 들었다. 사실 지금까지 프로젝트를 진행하는 동안 인터셉터를 구현해서 사용했던 적이 없다보니 컨트롤러들에 공통으로 적용하는 로직은 익숙한 AOP로 구현했다. 그런데 인터셉터도 어쨌든 요청과 응답을 가로채서 일련의 행동을 수행하니까 인터셉터로 구현하는 것도 괜찮겠다는 생각이 들었다. 그래서 이번에는 스프링 인터셉터를 활용해서 API 로그를 기록해보려고 한다. 스프링 인터셉터는 어떻게 구성되는가? 스프링 인터셉터는 보통 HandlerInterceptor를 구현하는 별도의 클래스를 작성해서 구현한다. HandlerInterceptorAdapter를 상속받는 방법은 스프링부트 2.4(스프링 5.3)부터 De.. 2024. 3. 1.
[Spring Boot] AOP를 이용해서 DB에 API 로그를 남겨보자 목차 들어가기 전에 현재 운영중인 서비스는 API 로그를 파일로 기록하고 있다. 그런데 서버가 이중화되어 있고 그 외에도 몇가지 불편한 점이 있어서 DB에 로깅을 해보면 어떨까 하는 생각이 들었다. 서버가 이중화되어 있다보니 특정 로그를 확인하려면 양쪽 서버 모두 확인해야 한다. → 사실상 가장 불편했던 점 특정 요청건에 대한 로그를 찾아보기 어렵다. 요청 일자가 모호할 경우에 여러 파일을 열어서 확인해야하는 경우 등 일자별, 시간대별 요청 건수 확인이 어렵다. 특정 요청이 처리되고 있는 도중에 다른 요청이 들어오면 로그에 혼선이 생겨서 어떤 요청에 대한 응답인지 파악하기 어려워진다. 이런 이유들로 인해 파일 대신 DB에 API로그를 남겨보려고 했는데 어차피 모든 API의 중복 로직이니까 AOP를 사용해.. 2024. 2. 6.
[Spring Boot] @Value 대신 생성자 바인딩을 통해 프로퍼티 값을 바인딩하고 관리해보자 목차 들어가기 전에 스프링부트 프로젝트를 개발하다 보면 운영/개발 등의 환경에 따라 코드에 들어가야 하는 값이 달라지는 경우가 있다. 단순히 현재 서버가 어떤 서버인지를 확인해줄 문자열이 될 수도 있고, 다른 API를 통해 서비스를 제공하는 프로젝트라면 해당 API를 제공하는 서버 호스트가 될 수도 있다. 이렇게 구동 환경에 따라 달라지는 값들은 yml파일 또는 properties 파일에서 프로파일을 나눠서 관리하고 실제 코드에서는 @Value로 값을 바인딩해서 사용하게 된다. 그런데 @Value로는 final 변수에 값을 바인딩하려면 롬복으로 생성자를 선언하는 방식을 사용할 수 없기 때문에 변경사항이 발생했을 때 굉장히 귀찮아진다. 이 경우 생성자 바인딩이라는 방식을 통해 프로퍼티 설정 값을 수월하게 .. 2023. 12. 21.
[Spring Boot] H2 DB Embedded Mode 사용하기 목차 들어가기 전에 H2는 굉장히 작고 가벼운 RDBMS로, 그 특성상 제공되는 기능은 제한적이지만 속도가 빠르고 별도의 프로그램 없이 웹브라우저 기반의 DB 콘솔을 사용할 수 있다는 장점도 있다. 이러한 특징으로 인해 다양한 기능이 필요하지 않은 소규모 서비스나 단위 테스트에서 많이 사용된다. H2는 별도의 엔진을 설치하지 않고 사용할 수 있는 In-memory Mode와 Embedded Mode를 지원하는데 이 글에서는 Embedded 방식을 사용하는 방법과 In-memory 방식과의 차이에 대해 정리하려고 한다. H2의 여러 모드들이 갖는 특징 H2는 Server Mode, In-memory Mode, Embeded Mode라는 세가지 방식으로 사용할 수 있다. 각 방식의 특징은 다음과 같다. Se.. 2023. 10. 4.
[Spring Boot] 스프링이 제공하는 다양한 어노테이션을 통한 유효성 검사와 응답 처리 목차 들어가기 전에 요청값이 유효한지 검사하는 것은 굉장히 중요한 일이다. 아무 요청값이나 마구잡이로 받아들이면 오류나 비정상적인 동작을 유발할 수 있기 때문이다. 스프링에서는 유효성 검사 중, 입력값의 형태가 유효한지 쉽게 확인할 수 있도록 다양한 어노테이션을 제공한다. 스프링에서 제공하는 유효성 검사를 위한 어노테이션의 종류와 사용방법에 대해 알아보자. 의존성 라이브러리 추가 스프링부트 2.3 이상의 버전부터는 빌드 환경에 따라 아래 의존성 라이브러리를 추가해줘야 한다. Gradle implementation 'org.springframework.boot:spring-boot-starter-validation' Gradle(Kotlin) implementation("org.springframework.. 2023. 8. 28.