SpringBoot 24

[SpringBoot] 외부 스토리지를 활용하여 첨부파일 관리하기

안녕하세요. CircuitBreaker, Cache, 외부 스토리지를 활용하여 첨부파일 관리하는 과정을 작성하도록 하겠습니다. 1. 목표 시나리오 첨부파일을 업로드할 때, 두 가지 주요 방법이 있습니다:Client -> Server로 MultipartFile을 업로드:이 방법은 클라이언트가 파일을 서버로 전송하고, 서버가 이 파일을 스토리지에 저장합니다.장점: 서버가 파일 업로드와 저장을 관리하므로 보안과 검증이 용이합니다.단점: 서버에 부하가 증가하고, 대규모 파일 업로드 시 성능 문제가 발생할 수 있습니다.클라이언트가 직접 스토리지에 파일을 업로드:클라이언트가 직접 외부 스토리지에 파일을 업로드합니다.장점: 서버 부하를 줄일 수 있으며, 클라이언트가 직접 스토리지에 접근하여 빠른 업로드가 가능합니다..

SpringBoot 2024.07.02

[SpringBoot] Spring Batch Partition 단위로 병렬 처리하기

안녕하세요. 스프링 배치에서 파티션 단위로 처리하는 과정은 대규모 데이터 처리를 병렬로 분할하여 성능을 최적화할 수 있습니다.특히, 파티션을 독립적으로 처리할 수 있는데, 이는 partiton 혹은 step 단위로 실행 매개변수를 다룰 수 있음을 의미합니다. 파티션 구성 요소는 다음과 같습니다. Partitioner: 데이터를 여러 파티션으로 나누는 역할을 합니다.PartitionHandler: 파티션을 각 replica 스텝에 분배하고 병렬로 실행합니다.Step: step 단위 실행 플로우를 정의합니다.이 세 가지 구성요소를 바탕으로 토이 프로젝트에서 Partition 단위로 병렬 처리한 과정을 정리하도록 하겠습니다. 1. 목표 아키텍처 2. 목표 플로우 순서제목설명1Job 실행Batch Job..

SpringBoot 2024.06.29

[SpringBoot] Kotest 멀티모듈 컨트롤러 테스트

안녕하세요. 이번 포스팅은 Kotest 멀티모듈 컨트롤러 테스트에 대한 글을 작성하고자 합니다.제가 겪은 문제는 멀티 모듈로 스프링을 구성하였을 때,컨트롤러의 WebMvcTest의 entityManagerFactory 의존성 문제가 발생한 것이었습니다. 1. @WebMvcTest를 사용한 테스트 @ActiveProfiles("test")@AutoConfigureMockMvc@WebMvcTest(controllers = [ReviewGroupUpsertController::class])class ReviewGroupUpsertControllerTestV1( private val mockMvc: MockMvc,) : FunSpec() { override fun extensions(): List..

SpringBoot 2023.11.06

[SpringBoot] 리플리카 데이터베이스 연동하기

이번 포스팅은 이전 포스팅에서 작성한 리플리카 서버를 데이터베이스에 연동하는 과정을 정리하고자 합니다. 1. 스프링부트 의존성 주입과 application.yml 설정하기 해당 테스트는 스프링부트 3.1.0, Mysql 8.x로 구성되어 있습니다. 마스터 서버와 슬레이브 서버를 설정하는 과정은 하단 블로그 링크를 첨부하였습니다. https://gose-kose.tistory.com/131 [DB] MySQL8.x 리플리카 서버 적용하기(1)안녕하세요. 기술적 겸손함으로 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 리플리카 서버를 적용하는 일련의 과정을 시도해 보는 글을 작성하고자 합니다. 저는 ubuntu22.04, docker 24.0.2,gose-kose.tistory.com 현재 설..

SpringBoot 2023.06.11

[SpringBoot] 의존성 주입과 Profile로 Filter 설정 동적 변경하기

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 의존성 주입과 profile 설정으로 filter의 설정 정보를 다르게 적용하는 과정을 정리하도록 하겠습니다. 1. 문제 상황 MSA 아키텍처에서 Gateway와 Member 서버는 서로 같은 Redis 서버 (Aws ElasticCache)를 사용하고 있습니다. 다른 서버는 Gateway로부터 라우팅을 수행하지만, 공통의 Redis를 사용하지 않기 때문에 컨트롤러 혹은 핸들러 API 테스트를 진행하는 과정에서 Gateway에서 헤더 정보 인증이 안될 수 있습니다. private boolean validateRequestHeader(String accessToken, String refreshToken, String userId) th..

SpringBoot 2023.04.01

[SpringBoot] SpringWebSocket 활용한 실시간 대기실 기능

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 우리가 흔히 사용하는 카카오톡과 같은 채팅 어플은, 실시간 처리가 매우 중요합니다. 친구가 메세지를 보냈는데 새로고침 하기 전까지 메세지가 전송되지 않는다면 해당 어플은 사용하지 않을 것입니다. 이를 방지하기 위해 사용하는 개념이 '소켓'입니다. 이번 포스팅은 MSA 아키텍처의 Liar-Game의 실시간 대기실 역할을 수행한 wait-server 프로젝트를 정리하며 웹소켓 연결 과정과 예외처리에 대해서 자세하게 정리하도록 하겠습니다. 제 스프링 부트 버전은 3.0.2로 최신 버전입니다. (따라서, 최신 3.x.x에 호환되는 기능으로, 아직 레퍼런스가 많이 부족하여 오픈 소스로 참고하시면 좋습니다!!!!) 1. Socket과 SpringWebSocke..

SpringBoot 2023.03.30

[SpringBoot] 더미 데이터로 실행 계획 살펴보기 (QueryDsl)

안녕하세요. 회사와 함께 성장하고 싶은 KOSE입니다. 스프링은 다양한 데이터 접근 기술을 제공합니다. 주로 사용하는 기술은 jpa, jdbc, mybatis 등이 있습니다. jpa를 사용하는 간단한 crud를 빠르게 사용할 수 있는 장점이 존재하지만 동적 쿼리를 해결하는 데는 많은 어려움이 있습니다. 스프링은 동적 쿼리를 해결하기 위한 수단으로 다양한 기능을 제공합니다. 가장 대표적인 기술은 queryDsl입니다. queryDsl은 자바 언어로 SQL을 작성할 수 있도록 제공하여 컴파일 시점에 에러를 잡을 수 있고, 다양한 동적 쿼리를 빌더 형태로 작성할 수 있습니다. 이번 글은 제가 작성했던 queryDsl 조회 로직을 살펴보고 100만개의 더미데이터에서 성능을 분석하는 시간을 가져보도록 하겠습니다...

SpringBoot 2023.03.24

[SpringBoot] 중복 로그인 처리 (비즈니스 로직과 IP 차단)

안녕하세요 회사와 함께 성장하고 싶은 KOSE입니다. 백엔드 개발에서 보안은 너무나 중요한 문제입니다. 계정 도용 문제가 발생하거나, 인증되지 않은 사용자가 권한이 없는 서버에 접근한다면, 큰 문제가 발생할 수 있습니다. 저는 개인적으로 개발하는 입장에서 보안 관련한 문제는 가장 피하고 싶은 문제이기도 합니다. 제일 어렵기도 하고 걱정되기도 하고 다루기 부담스러운 주제입니다. 하지만 언제까지 미룰 수만 없듯이 코드를 수정하며 보안적으로 위협이 될 수 있는 부분을 처리하고자 글을 작성하게 되었습니다. 이번 주제는 중복 로그인에 관한 포스팅으로 중복 로그인 요청이 발생했을 때, 어떻게 처리하는 게 효율적인지 고민하고 제가 처리한 방법을 공유하고, 항상 마지막은 로직에 대한 테스트로 마무리하도록 하겠습니다. ..

SpringBoot 2023.03.22

[SpringBoot] SpringRestDocs 활용하기

안녕하세요 회사와 함께 성장하고 싶은 KOSE입니다. 이번 포스팅은 API 개발의 마지막 관문이라고 할 수 있는 SpringRestDocs를 발급하는 과정을 정리하려고 합니다. API 문서를 개발하는 과정은 까다로운 점들이 있습니다. 먼저 백엔드에서 개발한 api 명세 규칙을 프론트 개발자 혹은 api를 활용하는 클라이언트가 명확하게 이해하여 활용할 수 있도록 작성되어야 합니다. api의 uri, 전달 방식, 헤더 필수 정보, 필요한 파라미터 와 응답 객체 등 많은 내용을 정확하게 전달해야 합니다. 스프링에서 api docs를 개발하도록 돕는 기술은 여러 가지가 있는데, 제가 소개드릴 수 있는 기능은 Swagger와 SpringRestDocs입니다. 두 가지 방법은 각각 장단점이 존재하기 때문에 간단하게..

SpringBoot 2023.03.19

[SpringBoot] RedisTemplate 분산락/트랜잭션 ThreadLocal 활용하기

안녕하세요 회사와 함께 성장하고 싶은 KOSE입니다. Redis는 인메모리 데이터베이스로 Key-Value 형태로 데이터를 저장하고 조회할 수 있습니다. Spring에서는 CrudRepository나 RedisTemplate 등으로 Redis에 데이터를 저장할 수 있습니다. 저는 토이 프로젝트에서 간편하게 값을 저장 및 조회할 수 있고 어노테이션으로 인덱스를 간편하게 생성할 수 있는 CrudRepository를 사용하였습니다. 하지만 프로젝트 규모가 커지다보니 MSA 아키텍처 간에 객체에 대한 유기적인 사용이 필요하였습니다. 그 예로 AccessToken과 같은 인증 객체가 있습니다. 인증 객체는 회원이 로그인에 성공하면 인증 토큰을 발급합니다. 인증 토큰을 발급하는 주체가 A 서버라고 한다면, 다른 B..

SpringBoot 2023.03.16