Backend (49) 썸네일형 리스트형 프로젝트에서 레디스를 사용하며 한 고민들 RDB 레디스는 인메모리 기반의 데이터베이스이다. 따라서 서버가 꺼지면 데이터는 모두 휘발된다. 만약 레디스의 데이터를 영구 저장하고 싶으면 레디스가 제공하는 AOF와 RDB 기능을 사용하면 된다. 두 기능에 대한 설명은 https://olsohee.tistory.com/115 이 글에 나와있다. 간략히 두 방식을 비교하면 데이터 손실이 없어야 하면 AOF를, 어느정도의 데이터 손실이 발생해도 괜찮으면 RDB를 사용하면 될 것 같다. 나의 경우, 레디스에 있는 인기글과 사용자 정보를 백업해야 하는 상황인데, 이는 어느정도의 데이터 손실이 발생해도 괜찮기 때문에 그 대신 적은 데이터 크기와 빠른 복구의 이점을 얻을 수 있는 RDB를 사용했다. RDB를 사용하면 일정 시간마다 스냅샷을 찍어 데이터 백업이 진.. RabbitMQ 메시지 브로커가 필요한 이유RabbitMQ는 AMQP(Advanced Message Queuing Protocol)라는 표준 프로토콜을 사용하는 메시지 브로커로, 송신자로부터 전달받은 메시지를 수신자로 전달해주는 중간 역할을 한다. 즉, 메시지 큐를 관리하고 애플리케이션 간에 메시지를 송수신할 수 있게 해준다. 그런데 이러한 메시지 브로커가 필요한 이유가 뭘까? 즉, 애플리케이션 간에 직접적인 통신이 아니라, 굳이 중간에 메시지 브로커를 두는 이유가 뭘까?비동기 처리를 통해 애플리케이션 간 결합도를 낮출 수 있다. 만약 메시지 브로커를 사용하지 않고 송신 측과 수신 측이 직접적으로 통신한다면 어떻게 될까? 동기적 통신의 경우, 송신 측은 수신 측에게 작업을 요청하고 요청에 대한 응답이 돌아올 때까지 블로.. 깃허브 액션, 도커, EC2, RDS를 통해 배포하기 도커를 처음 사용해보며 3일 간 많이 헤맸지만 그만큼 많이 배운 거 같다. 다음에 같은 실수를 반복하지 않기 위해 이번에 도커를 사용한 과정을 기록하고자 한다.배포 과정1. RDS 생성, EC2 서버 구축 및 설정우선 AWS의 RDS와 EC2를 생성해야 한다. 그리고 EC2 서버에 도커 컨테이너를 통해 자바 프로그램을 실행시킬 것이기 때문에 EC2 서버에 도커를 설치해야 한다. ssh를 통해 EC2 서버에 접속한 다음, 이 블로그를 따라 서버에 도커를 설치하면 된다. 설치 후에는 docker --version을 통해 설치된 도커 버전을 확인할 수 있다. 이어서 자바 프로그램 외에도 redis도 도커 컨테이너로 띄워야 하므로, docker pull redis 명령어를 통해 redis 이미지를 pull 받.. 도커(Docker) 사용하기 도커를 통해 프로젝트 구동시키기1. 서버에 Docker 설치하기다음 블로그 (https://everydayyy.tistory.com/121)를 따라 서버에 Docker를 설치하면 된다.2. 이미지 생성하기도커에는 스프링부트 프로젝트, MySQL, Redis가 각각 컨테이너로 생성되어야 한다. 그리고 컨테이너를 실행시키기 위해서는 도커 이미지가 필요하다.2-1. 스프링부트 프로젝트 이미지 생성우선 스프링부트 프로젝트를 기반으로 도커 이미지를 생성해보자. 이를 위해서는 프로젝트 내에 도커 파일을 생성해줘야 한다. 도커 파일은 도커가 이해할 수 있는 설정 파일로, 도커 이미지를 만드는데 필요한 정보를 담고 있다. 따라서 어떤 자바를 사용할 것인지, 어떤 jar 파일을 사용할 것인지 등을 설정해줘야 한다. 내가.. 스프링부트에서 Redis 사용하기 Redis와 직렬화/역직렬화 레디스의 데이터 저장 형식은 byte array 형태이며, 사용하는 쪽에서 포맷을 지정하여 저장 및 조회할 수 있다. Spring Data Redis는 자주 쓰는 포맷을 편리하게 사용할 수 있도록 미리 Serializer 클래스를 정의해뒀다. 대표적인 Serializer 클래스를 살펴보자. JdkSerializationRedisSerializer 디폴트 Serializer이며 다른 Serializer를 지정하지 않으면 기본으로 사용된다. JdkSerializationRedisSerializer가 사용되면 레디스에는 바이너리 형태로 데이터가 저장된다. StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSer.. Redis 알아보기 Redis 캐시로 사용하기캐시란 데이터의 원래 소스보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소이다. 이때 자주 액세스되고, 자주 변하지 않는 데이터가 캐시로 적합한 데이터이다. 레디스는 캐시로 적합한데 그 이유는 다음과 같다.레디스는 인메모리 기반의 데이터 저장소로, 처리 속도가 빠르다. 따라서 단순한 Get/Set 명령어의 경우 초당 10만 TPS를 갖는다(1초당 10만개의 명령 처리 가능). (*인메모리: 데이터를 메인 메모리(=랜덤 액세스 메모리(RAM))에 저장하여 처리하는 방식)레디스는 다양한 자료구조를 지원한다. 따라서 적절한 자료구조를 사용하여 데이터를 용이하게 관리할 수 있다.캐싱 전략읽기 전략 - Look Aside데이터를 찾을 때 우선 캐시를 조회한다(Cache Hi.. JPA의 낙관적 락과 비관적 락 JPA의 낙관적 락과 비관적 락 JPA에서 @Transactional(isolation = Isolation.DEFAULT) 로 설정하면 DBMS에 설정한 격리 수준을 따른다. MySQL은 REPEATABLE READ가 기본 설정이다. 그리고 JPA는 영속성 컨텍스트와 1차 캐시를 통해 REPEATABLE READ 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공한다. 그런데 일부 로직에서 더 높은 격리 수준이 필요할 때가 있다. 따라서 이때 JPA가 제공하는 낙관적 락과 비관적 락 옵션을 사용하면 된다. 낙관적 락: 대부분의 트랜잭션이 충돌이 발생하지 않을 것이라고 낙관적으로 가정하는 방법이다. 따라서 데이터베이스가 제공하는 락 기능을 사용하지 않고, JPA가 제공하는 버전 관리 기능을 사용한.. 준영속 상태에서의 지연 로딩 문제와 그 해결법인 OSIV 트랜잭션 범위의 영속성 컨텍스트 전략 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 이름 그대로 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다는 뜻이다. 즉, 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다. 스프링 프레임워크를 사용하면 보통 비즈니스 로직을 시작하는 서비스 계층에서 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다. @Transactional 어노테이션이 있으면 해당 클래스의 메소드 호출시 메소드 실행 직전에 스프링의 트랜잭션 AOP가 먼저 동작한다. 트랜잭션 AOP는 대상 메소드를 호출하기 직전에 트랜잭션을 시작한다.. 이전 1 2 3 4 5 ··· 7 다음