Spring 6

쓰기, 읽기 전용 Multiple DataSource 설정하기

들어가며소스코드는 깃허브에서 확인가능합니다.기본세팅우선 Write, Read 데이터베이스가 필요합니다. 해당 게시글을 통해 간단하게 Write, Read 전용 데이터 베이스를 설정할 수 있습니다. application.propertieswrite, read 데이터베이스를 각각 지정합니다. 실제 운영환경에서는 RDS 레플리케이션을 통해 복제된 데이터베이스의 호스트 등이 될 수 있습니다.spring.datasource.hikari.write.jdbc-url=jdbc:mysql://localhost:33061/mydb?createDatabaseIfNotExist=truespring.datasource.hikari.write.username=mydb_userspring.datasource.hikari.write..

Spring 2024.06.04

Use Redis to Session Storage

들어가며분산 시스템 환경에서 세션 인증방식의 문제 해결방법 중 하나인 세션 스토리지를 스프링 환경에서 간편하게 구현합니다.분산 시스템 환경에서 세션 관리 방법분산 시스템에서 세션을 이용하게 되면 각 서버마다 관리하는 세션 아이디가 다르기 때문에 유저는 로그인이 풀리는 경험을 하게 됩니다.이러한 상황을 방지하기 위한 세 가지 방법이 존재합니다.Sticky SessionSession ClusteringSession Storage이 중 스프링에서 제공하는 기능을 통해 Redis를 Session Storage로 이용해 봅니다.의존성 추가implementation 'org.springframework.session:spring-session-data-redis'implementation 'org.springfra..

Spring 2024.05.19

IP 기반 API 호출 횟수 제한

배경AI 서비스인 Naver Clova Studio를 개발하며 문제가 발생했습니다.만들고 있던 서비스는 유저 텍스트 입력 기반 AI 영화추천 앱입니다. 영화추천을 진행할 때마다 NCP의 토큰을 사용하는데, 비정상적으로 많은 추천을 받아 다량의 비용이 청구된 것을 확인하였습니다.따라서 유저별로 호출을 제한할 수 있는 장치를 만들어야 했고 해당 경험을 포스팅합니다.아이디어고유 유저별로 호출을 제한Rate Limit 시스템을 구현 (Bucket4j Library)IP 기반으로 호출을 제한이 중 비로그인 유저도 api를 이용할 수 있어야 했기에 1번은 제외합니다. 또 rate limit 시스템은 충분히 알지 못했기에 2번도 제외합니다. API의 총 호출횟수를 기록하고 싶고, 비로그인 유저도 어느정도 대응을 할 ..

Spring 2024.05.17

스프링에서 관리하는 세션의 생성구조와 키의 암호화

들어가며토이 프로젝트의 유저 인증방식을 세션으로 선택한 후 내부동작을 탐색하며 작성하는 포스팅입니다.세션 관리의 내부동작을 왜 찾아봤을까?오해는 여기에서 시작되었습니다. 아래와 같은 코드를 작성 후 브라우저를 확인해 보았습니다.public ResponseEntity demo(HttpServletRequest request) { HttpSession session = request.getSession(); session.setAttribute("JSESSIONID", 1234); return ResponseEntity.ok().build();} 스프링에서 제공하는 `HttpServletRequest` 객체에 세션을 설정만 하면 브라우저에서 사진과 같이 쿠키가 설정되어 있는 모습을 확인할 수 있습니다...

Spring 2024.05.16

Caching In Spring With Multiple Redis Server

들어가며평소 즐겨보는 에디의 기술블로그에서 캐싱이야기를 보게 되어 스프링을 이용하여 캐싱하는 방법에 대해 기술합니다.캐싱이란? 참고글캐싱은 자주 사용되는 데이터를 원본 데이터 소스보다 빠르게 액세스 할 수 있는 임시 위치에 저장하는 기술입니다. 이렇게 하면 데이터를 검색하는 데 걸리는 시간을 줄여 애플리케이션 및 웹사이트의 성능을 크게 향상할 수 있습니다. 캐싱을 사용하면 다음과 같은 몇 가지 이점이 있습니다.향상된 성능: 캐시된 데이터는 디스크 드라이브에 저장된 데이터보다 훨씬 빠르게 액세스 할 수 있으므로 애플리케이션 및 웹사이트 성능이 크게 향상될 수 있습니다.비용 절감: 데이터베이스 및 기타 백엔드 시스템의 부하를 줄임으로써 캐싱은 비용을 절감하는 데 도움이 될 수 있습니다.확장성 향상: 캐시된 ..

Spring 2024.04.24

분산 시스템 환경에서 Scheduler 단일 동작시키기

배경외부 API를 활용해 데이터를 적재하는 기능을 개발하였습니다. 해당 로직은 스케줄러를 통해 특정한 시각에 동작하도록 개발되었습니다. 하지만 데이터가 중복으로 적재되는 문제가 발생하였습니다. 원인을 파악해 보니 ecs를 통해 다중서버가 동작하고 있어 해당하는 서버에서 스케줄러가 모두 동시에 동작하여 데이터가 중복으로 적재되고 있었습니다.아이디어데이터베이스에 Lock을 걸어 여러 스케줄러에서 해당 테이블에 대한 접근 방지여러 서버에서 스케줄러를 한 개만 동작시키기해당 테이블에 실시간으로 접근할 수 있는 데이터조차 대기상태로 만들어버릴 수 있기 때문에 1번 방법은 제외하였습니다.ShedLockShedLock 라이브러리를 사용하면 스케줄러가 실행하기 전 ShedLock 테이블을 먼저 조회해 Lock을 획득한..

Spring 2024.04.24