트러블슈팅

트러블슈팅

[Spring] Redis 캐시 적용하기 (2/2)

이제 Redis를 이용해 캐시를 적용해보자. 스프링이 제공하는 캐시 추상화 스프링은 AOP 방식으로 메소드에 캐시를 적용하는 기능을 제공하고 있다. 캐시는 @Transactional 어노테이션을 통해 트랜잭션을 제공하는 것과 마찬가지로 AOP를 이용해 메서드 실행 과정에 투명하게 적용된다. 또한 스프링은 특정 기술을 추상화 계층으로 가져가고 개발자에게는 인터페이스를 동일한 형태로 제공한다. 캐시도 마찬가지인데 EhCacheManager, RedisCacheManager등의 다양한 기술들이 모두 CacheManager 인터페이스를 구현하고 있기 때문에 서버의 환경에 맞추어 다양한 캐시 기술들을 선택적으로 적용할 수 있다.. 이렇게 특정 기술에 종속되지 않게 하는 방식을 PSA(Portable Service..

트러블슈팅

[Spring] Redis 캐시 적용하기 (1/2)

프로젝트 개선 중 nGrinder로 부하테스트를 거치며 성능 개선을 위해 캐시를 적용하기로 했다. 캐시 캐시는 데이터를 임시로 저장해준 뒤, 동일한 데이터 요청이 오면 DB에 접근하지 않고 저장된 캐시 데이터를 반환해주는 방식이다. DB 접근 없이 요청을 처리할 수 있기 때문에 성능 개선 측면에서 많은 이점이 있다. 캐시 적용을 위해 고려해야할 사항 1. 어떤 데이터에 캐시를 적용할 것인가 캐시를 적용하는 것이 무조건 성능 개선을 가져오는 것이 아니다. 캐시는 생성, 수정, 삭제 연산보다는 조회 연산이 많은 데이터에 적합하다. 자주 변경되는 데이터에 캐시를 적용하면 데이터 정합성 문제가 발생한다. 💡 데이터 정합성 : 같은 데이터인데 캐시와 DB에 있는 정보가 서로 다른 경우 - 변경이 많은 데이터일수록..

트러블슈팅

[Spring] Redis를 통한 세션 불일치 문제 해결 (2/2)

실제 프로젝트에 Redis를 적용해보자 1. 의존성 추가 및 환경 설정 //레디스 implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.session:spring-session-core' implementation 'org.springframework.session:spring-session-data-redis' spring: data: redis: host: 127.0.0.1 port: 6379 build.gradle에 의존성을 추가해주고 applicaiton.yml 파일에 redis 정보를 추가한다. 2. RedisConfig.java @Configuration..

트러블슈팅

[Spring] Redis를 통한 세션 불일치 문제 해결 (1/2)

세션 불일치 문제 Scale-out을 통해 분산 서버 환경을 구축했을 때 발생할 수 있는 가장 큰 문제점은 역시 세션 불일치 문제이다. 분산 서버 환경에서는 로드밸런서를 통해 트래픽을 분산하여 운영하고, 여러대의 서버는 세션 저장소를 독립적으로 가지고 있다. 만약 클라이언트가 로그인 요청을 하고 로드밸런서를 통해 요청이 A서버로 전달되면 클라이언트의 세션 정보는 A서버에 저장된다. 이후에 클라이언트의 작업 요청이 A서버가 아닌 다른 서버로 전달된다면 해당 서버에는 세션 정보가 존재하지 않기 때문에 문제가 발생한다. 이를 세션 불일치 문제라고 한다. 세션 불일치 문제를 해결하기 위해서 크게 3가지 방법을 적용해볼 수 있다. 1. Sticky Session 방식 해당 클라이언트의 요청과 응답을 처리할 서버를..

트러블슈팅

[Spring] 재고처리 동시성 이슈 해결하기 (2/2)

저번 글에 이어서 데이터베이스 락을 활용하여 동시성 이슈를 해결하는 방법을 정리해보려고 한다. (프로젝트 DB로 MySQL를 사용하고 있음) 해결방법 2. DB에 비관적 락 걸기 비관적 락 (Pessimistic Lock) 트랜잭션 충돌이 발생한다고 가정하고 미리 락을 걸어버리는 방법 데이터베이스의 읽기락, 쓰기락 사용 읽기 락 : 다른 트랜잭션에서 읽기만 가능, 쓰기는 불가능 쓰기 락 : 다른 트랜잭션에서 읽기, 쓰기 모두 불가능 ex. 서버 1 DB에서 데이터를 가져올 때 비관적 락을 걸면, 다른 서버에서는 서버 1의 작업이 끝나서 락이 풀릴때까지 데이터에 접근하지 못함 그림으로 설명하면 아래와 같다. DB에 쓰게에 대한 비관적 락이 걸린 경우, 트랜잭션 A가 커밋되기 전에는 트랜잭션 B의 selec..

트러블슈팅

[Spring] 재고처리 동시성 이슈 해결하기 (1/2)

이커머스 프로젝트를 진행했는데 트러블슈팅 내역을 정리해보려고 한다. 먼저 상품의 재고처리에 대한 동시성 이슈이다. 현재 상품 주문과 주문취소 시 상품의 재고변경로직이 동작하는데 여기서 동시성 이슈가 발생한다. 1. ❓동시성 이슈란❓ 여러 스레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제 여러 스레드가 하나의 자원을 공유하고 있기 때문에 같은 자원을 두고 경쟁상태(Race Condition)가 됨 2. 코드와 테스트 코드는 간단히 아래와 같이 구성되어 있다. // Product.java @Entity public class Product extends BaseEntity { // ... 기타 필드 @Column(nullable = false) private Long stock; priva..

jny0
'트러블슈팅' 카테고리의 글 목록