전체 글 8

쓰기, 읽기 전용 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

도커로 MySQL Master Slave Replication 만들기

들어가며MySQL는 내부 설정을 통해 Replication을 설정할 수 있습니다. 도커를 이용해 더 편하게 설정하도록 합니다. 더 자세한 데이터베이스 복제 과정은 해당 포스팅을 통해 확인할 수 있습니다.설치 및 실행1. Git Clonegithub으로 이동하여 레포지토리를 클론 합니다.2. 쉘 파일 실행권한 부여chmod 755 build.sh3. 쉘 파일 실행./build.sh위 결과나 나와야 합니다.실제 Replication 확인터미널 1# 컨테이너 진입docker exec -it mysql_master /bin/bash# MySQL 접속 (Master)mysql -u mydb_user -pEnter password: mydb_pwd# 데이터베이스 선택 & Table 생성 & 데이터 삽입use myd..

Programming 2024.06.03

객체지향 5원칙 SOLID 코드로 이해하기

들어가며객체지향 5원칙을 실제 예시를 통해 알아봅니다.S: 단일 책임 원칙 (Single Responsibility Principle, SRP)O: 개방-폐쇄 원칙 (Open-Closed Principle, OCP)L: 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)I: 인터페이스 분리 원칙 (Interface Segregatio Principle, ISP)D: 의존관계 역전 원칙 (Dependency Inversio Principle, DIP)단일 책임 원칙 (Single Responsibility Principle, SRP)요점하나의 객체가 하나의 책임만 가져야 한다.클래스는 단 한 가지 목표만 가지고 작성해야 한다.애플리케이션 모듈 전반에서 높은 유지보수성과 가..

Programming 2024.05.20

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