프록시 객체와 지연 로딩으로 DataSource 분기 처리 실패 해결하기 Overview 저번 글에서는 부하 분산을 위해 MySQL Replication 구성을 사용했고, 어플리케이션에서는 쿼리 요청에 따라 마스터 서버와 슬레이브 서버로 분기하도록 코드를 작성했습니다. 그러나 작성한 코드를 실행해보면 AbstractRoutindDataSource 에서 올바른 DataSource 와 Connection 객체를 얻어오지 못합니다. 이번 글에서는 DataSource 의 분기 처리가 실패하는 이유에 대해서 알아보고 이를 해결할 수 있는 방법을 살펴봅니다. 왜 분기 처리가 실패하는 걸까? 분기 처리가 실패하는 이유를 알아보려면 먼저 스프링의 트랜잭션 동기화에 대해서 알아야 합니다. 트랜잭션 동기화란 트랜잭션을 시..
부하 분산을 위한 MySQL Replication 구성 및 쿼리 요청 분기 Overview 내가 진행하고 있는 SNS 프로젝트를 보면 Service Layer에 속해있는 거의 모든 메소드가 데이터베이스에 쿼리 요청을 보낸다. 나의 프로젝트 뿐 아니라 대부분 웹 서비스 프로젝트를 보면 사용자 데이터를 처리하기 위해 혹은 이를 기반으로 다양한 서비스를 제공하기 위해 데이터베이스에 무수히 많은 요청을 보낸다. 현재 사용하고 있는 MySQL 서버가 고사양이더라도 서버 한 대가 웹 서버로부터 오는 모든 트래픽을 견뎌내기에는 분명히 한계점이 드러나기 마련이다. 그로 인해 데이터베이스에 장애가 발생한다면 운영 중인 서비스에 바로 큰 타격을 줄 것이다. 따라서, Replication을 사용하여 MySQL의 환경을 구축..
Redis 성능 향상을 위한 Redis 세션 저장소와 캐시 저장소의 분리 Overview 현재까지 진행된 프로젝트 상황을 살펴보면 세션과 캐시를 Redis에서 관리하고 있다. 세션을 Redis에서 관리하는 이유 캐시를 Redis에서 관리하는 이유 지금은 세션과 캐시 구분없이 하나의 Redis 서버에서 관리가 되고 있다. 그러나 앞으로 프로젝트 규모가 커지고 캐싱되는 데이터가 많아질수록 서버 한 대가 많은 요청을 처리해야 할 것이다. 이에 따라 응답 속도가 저하될 것으로 예상이 되기 때문에 부하 분산의 필요성을 느끼게 되어 용도에 따라 Redis 서버를 분리하기로 했다. 세션 저장소와 캐시 저장소를 분리하면 어떤 점이 좋을까? 위에서 언급한 것처럼 세션 저장소와 캐시 저장소를 분리하면 서버 한 대에 집중되..
Redis Eviction 정책을 적용하여 효율적인 캐시 띄우기 Overview 저번 글에서 Redis를 캐시 저장소로 선택하고 Spring Cache를 도입하여 읽기 작업의 성능을 높인 것을 확인할 수 있었다. 그러나 성능을 높이는데 많은 역할을 하는 캐시라도 데이터를 제대로 관리하지 못하면 문제가 발생할 수 밖에 없다. 예를 들어, 내가 개발하고 있는 SNS 서비스를 많은 사람들이 이용한다고 가정했을 때, 짧은 시간 안에 Redis 서버에는 다양한 캐시 데이터들로 가득 차게 될 것이다. 이때 메모리 사용에 대한 어떠한 제한이 없다면 캐시 데이터가 메모리를 계속 차지하게 되므로 어플리케이션의 전체적인 성능까지도 영향을 끼칠 수 있다. 이러한 상황을 막기 위해 Redis에서는 다양한 Eviction 정책..
Spring Cache로 읽기 작업의 성능 향상시키기 Overview 현재 진행하고 있는 SNS 프로젝트에서 게시물 관련 기능을 개발하고 테스트를 하면서 서버에 동일한 요청을 여러 차례 보내게 되었다. 이 과정에서 동일한 결과를 얻기 위해 매번 데이터베이스와 연결하여 같은 연산을 수행하는 것이 비효율적이라고 생각했다. 저번 글에서 잠깐 언급한 것처럼 RDB에서는 연산을 처리할 때마다 디스크 I/O가 발생하기 때문이다. 버퍼로 디스크 I/O를 최소화하고 처리 능력을 강화해도 DB 연산 처리 시간 외에 디스크에서 데이터를 찾을 때 발생하는 대기 시간, 디스크에서 버퍼로의 데이터 전송 시간 등이 발생하기 때문에 방대한 I/O 작업을 처리하는 경우 결국 병목 현상이 생기게 된다. 또한, RDB는 데이터 정합성의..
프로퍼티 파일을 이용한 외부 설정 주입과 운영 환경에 따른 프로퍼티 파일 분리 Overview 현재 진행하고 있는 sns 프로젝트에서는 회원 프로필 이미지를 수정하거나 게시글에 사진을 첨부하는 등 이미지 파일을 다루는 기능들이 많다. 서버로 넘어오는 파일들을 받아 저장하는 기능을 구현하기 위해 파일 경로를 지정했다. 이는 회원 아이디 별로 달라지기 때문에 공통적으로 사용되는 기본 경로를 따로 분리하여 관리하기로 하고 다음과 같이 기본 경로를 지정했다. @Service @RequiredArgsConstructor public class LocalFileService implements FileService { private String baseDir = "C:\\Users\\myId\\Desktop\\Pr..
AOP를 적용하여 부가 로직 제거하기 (feat. MethodHandlerArgumentResolver) Overview 현재 내가 진행하고 있는 sns 서비스 개발 프로젝트는 '전체 서비스를 이용하기 위해서는 회원가입을 해야한다.' 는 비즈 니스 룰이 정해져있다. 그렇기 때문에 대부분의 기능이 로그인된 상태로 진행되어야 했다. 그래서 각 기능을 실행하기 전 에 다음과 같이 로그인 여부를 확인하는 로직이 꼭 포함되어야 했다. @PutMapping("/my-account") public ResponseEntity updateUser(UserUpdateParam userUpdateParam, @RequestPart("profileImage") MultipartFile profileImage, HttpSess..
4. 세션 스토리지로 어떤 것이 더 적합한가?2 - Redis VS Memcached 저번 글에서는 Disk Based Database와 In Memory Database, 두 가지 방식의 데이터베이스를 비교해보았고 내가 진행하 는 SNS 서비스 프로젝트에서는 빠른 요청 처리, 저장할 데이터인 세션의 특징 등의 이유로 인메모리 데이터베이스가 세 션 스토리지에 적합하다고 판단했다. 이제 마지막으로 인메모리 데이터베이스 중에서도 어떤 종류의 데이터베이스가 좋 을지 알아보도록 하자. 왜 사람들은 Redis와 Memcached를 선호할까? 구글 검색창에 Redis만 치면 Memcached가 자동 완성이 될 정도로 사람들은 이 두 데이터베이스를 놓고 어떤 것을 인메 모리 데이터베이스로 선택할 지 많이 고민한다. ..
- Total
- Today
- Yesterday
- Django 로그아웃
- Django 업로드
- Django 인스타그램
- Django User
- Django
- Redis Cache
- Django 해시태그
- 파이썬
- java
- Django 댓글
- query parameter
- Django 비밀번호 수정
- Redis
- Django 프로젝트 생성
- Django 어플리케이션
- Django 검색
- 장고
- MySQL
- Django Instagram
- Django application
- Django 컬렉션
- Django 회원 정보 수정
- Django 북마크
- Django 로그인
- Django 팔로우
- 서점 어플리케이션
- python
- 북마크 어플리케이션
- Django 좋아요
- Django 회원가입
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |