반응형
REQUIRES_NEW에 대한 오해REQUIRES_NEW를 사용하면 물리적으로 트랜잭션이 분리되어 분리한 트랜잭션의 예외가이 트랜잭션을 호출한 상위 트랜잭션에 전파되지 않는다고 이해하고 있었다. 결론부터 말하면 아니였다.어떤식으로 트랜잭션 흐름이 진행되는지 한번 알아보자.@Service@RequiredArgsConstructorpublic class MeetingService { private final MeetingRepository meetingRepository; private final MemberService memberService; @Transactional public void save() { meetingRepository.save(new Meeting(..
분산락이란?분산된 서버에서 공유 자원에 동시에 접근 시 발생할 수 있는 문제를 제어하기 위해 사용되는 방식이다.Lock에 대한 정보를 분산된 서버가 접근 가능한 공통적인 저장소에 저장하고 분산 서버들은 저장된 Lock을 보고 접근 여부를 판단한다.이 공통적인 저장소는 Redis, Mysql, Zookeeper를 활용하여 분산 락을 적용할 수 있다. 분산락 적용 계기...현재 우리 서비스의 주 기능인 출발 알림 시간, 도착 예정 시간 목록 기능은 외부 API를 사용하고 있다.현재 사용하는 외부 API는 호출 횟수에 따라 정지, 과금 될 수 있어 정확한 호출 횟수가 필요하다.그렇기 때문에 API 호출 시 마다 호출 횟수를 카운팅해 DB에 저장하고 이를 관리자 페이지에서 확인하고 있다. 현재 우리 서비스의 핵..
강결합 되어 있던 외부 API...현재 진행하고 있는 약속 관리 프로젝트 '오디'는 약속에 참여한 참여자들 별로 도착 예정 시간 (ETA) 목록을 주고약속 장소에 늦지 않으려면 언제 출발해야할지를 알려주는 출발 알림 기능을 제공하고 있다.해당 기능을 구현하기 위해 참여자의 출발지 위, 경도와 약속 장소 위,경도를 받아 '오디세이'라는 외부 API를 사용해 소요 시간을 계산하고 있었다. 문제 상황하지만 여기서 문제가 발생한다.우아한테크코스에서는 각 프로젝트 팀들이 만든 서비스를 체험하기 위한 ‘런칭 페스티벌 행사’가 있다.이 날 너무 많은 약속방을 만들고 참가하는 바람에 Odsay API의 일 제한량인 1,000건을 초과해버렸다.이게 끝이면 좋겠지만 오디세이 API는 일 제한량을 초과할 경우 3일간 이용할..
테스트 코드로 Redis를 테스트하고 싶은데 어떻게 테스트할 수 있을까?꼭 로컬에서 Redis를 실행시켜놔야지만 테스트가 가능할까? Redis도 H2처럼 Embedde로 테스트할 수 잇는 Embedded Redis 라이브러리가 있긴하다.하지만 최근 커밋이 너무 오래된걸 봐선 관리가 되지 않고 있다.kstyrc/embedded-redis : 6년 전ozimov/embedded-redis : 4년 전사용해보진 않았지만 많은 오류들이 발견되어 개선하지 않고 있다 알고 있다. 우리에겐 TestContainers로 테스트시에만 Redis 컨테이너를 테스트할 수 있는 방법이 있다.TestContainers란?우선 테스트 컨테이너에 대해 간단히 설명하고 넘어가보려 한다.https://testcontainers.com..
현재 진행하고 있는 "오디"프로젝트는 다음과 같이 3가지 환경으로 구성되어 있다.각 환경에 대해 간단히 설명하자면Local 환경은 각자 기능을 개발 해 PR을 보내는 용도.Dev 환경은 EC2로 애플리케이션이 실행되고 있어 Local 환경에서 개발된 PR을 Merge하면 Dev 서버로 배포하여 클라이언트와 서버가 기능 동작을 테스트하는 용도.Prod 환경도 EC2로 애플리케이션이 실행되어 있고 실제 운영을 위한 아키텍처로 구성이 되어 있으며Dev에서 테스트한 기능들이 문제가 없을 때 배포하여 실제 서비스를 하는 용도로 사용하고 있다. 문제 상황그리고 각 환경들은 다음과 같이 각자 다른 DB를 사용하고 있다.현재 필자의 프로젝트는 배포 전 로컬에서도 스키마에 대한 에러를 빠르게 캐치하고자 ddl-auto를..
현재 오디 프로젝트는 다음과 같이클라이언트가 요청을 보내면 BationEc2를 거쳐 Application이 실행되는 Ody EC2로 연결돼 작업을 처리하고,DB 접근이 필요할 때 쓰기 작업, 읽기 작업을 구분해 적절한 DB에 요청을 보내고 응답을 받는 구조로 되어 있다.그렇다면 애플리케이션에서 어떻게 쓰기 작업, 읽기 작업을 구분해 적절한 DB에 요청을 보내고 응답을 받을 수 있을까 ?@Transactional 어노테이션으로 write, read DB를 구분해 연결하기@Transactional 어노테이션의 readOnly 옵션으로 쓰기, 읽기 작업을 구분해 적절한 DB에 요청을 보내는 방법을 알아보자.application.yml에 WRITE / READ DB 주소 설정우선 다음과 같이 datasource..