[Spring] Docker-Compose를 활용한 CI / CD 구축
·
Back-end/Spring
현재 상황캡스톤 프로젝트를 진행하면서 다음과 같은 디렉터리 구조를 가지고 있는 상황이다. Repo- .github- frontend- backend- gpt... 현재 EC2 내에는 Spring Boot Jar file과 Docker Container에서 Redis Image를 pull 받아와야 하는 상황이다. 일일이 Docker 명령어를 입력하여 container image를 pull 받아오는 것보다 docker-compose를 통해 한 번에 Docker Container에서 이미지를 pull 받아오고자 해당 방법을 진행했다. DB는 RDS를 활용하여 구축했기에, Docker-compose에는 담지 않았다.하지만, EC2 내 로컬 DB를 활용한다면 docker-compose.yml에 DB 관련 코드를 ..
[Spring] com.auth0 vs jsonwebtoken.jjwt
·
Back-end/Spring
지금까지 프로젝트를 했던 것들을 짚어봤을 때 JWT 토큰을 사용하기 위해 com.auth0.java-jwt 라이브러리를 사용하거나 io.jsonwebtoken (jjwt) 라이브러리를 사용하는 경우가 있었다. com.auth0가 더 좋다, jjwt가 더 좋다 이런 말들이 많아서 직접 조사해보고 정리해보았다.  1. com.auth0:java-jwt💡 장점가볍고 간결한 API코드가 직관적이며, JWT의 생성 및 검증 과정이 상대적으로 간단함.빌더 패턴을 활용한 사용성 향상JWT 생성 시 JWT.create() 메서드를 사용하여 체인 방식으로 쉽게 설정 가능.JDK 내장 라이브러리만 사용별도의 외부 의존성이 거의 없음. (java.security 및 java.util 기반)토큰 검증 시 Claim을 쉽게 ..
[DataBase] CAP 정리란?
·
Back-end
매일메일을 통한하루 1개 CS 공부하기 CAP 정리Distributed DataBase System이 CAP 중 2개의 속성만을 제공할 수 있다는 이론Consistency(일관성)모든 Client의 요청은 어느 노드에 연결되어도 같은 데이터를 볼 수 있음Availability(가용성)노드 일부에 문제가 발생하여도 시스템은 클라이언트의 모든 요청에 유효한 응답을 전해줄 수 있어야 함Partition Tolerance(분할 내성)노드 사이에 통신이 불가능한 상황(파티션)에서도 시스템이 계속 동작 3가지 속성을 모두 만족하는 분산DB 시스템은 존재하지 않는다 💡 각 속성 별 조합 예시 3개의 분산 DB가 존재한다고 가정해보자. 해당 분산 DB System에서는 특정 서버에 Write 작업이 발생하면, 나머지..
[Back-End] 캐시 스탬피드 현상이란?
·
Back-end
매일메일을 통한하루 CS 공부하기 캐시 스탬피드 현상이란?대규모 트래픽 환경에서 캐시를 운용하는데, Cache Aside (캐시 미스 발생 시 적재) 전략을 사용한다고 가정하자. 수많은 요청들이 동시에 캐시 미스를 확인하고 원본 저장소에서 데이터를 가져와 캐시에 적재는 상황이 발생할 수 있다. 이를, 캐시 스탬피드 현상 또는 Thundering Herd 문제라고 한다. 이 현상은 원본 DB와 캐시의 성능을 저하할 수도 있다.  문제 해결 방안1. Locking 방식한 요청 처리 스레드가 해당 캐시 키에 대한 Lock을 획득한다. 이 때 다른 요청 스레드는 잠시 대기한다. Lock을 가진 스레드는 사용자 request에 응답하는 과정동안 캐시 적재 작업은 비동기 스레드로 처리할 수 있다. Lock을 사용하..
[Back-End] Cache Aside (Lazy Loading)이란?
·
Back-end
매일메일을 통한하루하루 CS 공부하기 Cache Aside (Lazy Loading) 방식Cache hit 시 캐시에서 데이터를 불러오며, Cache miss 시 원본 DB에서 조회하여 반환한다 애플리케이션은 Cache miss가 발생하면 해당 데이터를 캐시에 적재한다. 장점실제 요청된 데이터만 캐시에 저장되므로 불필요한 데이터 캐싱을 줄일 수 있다.캐시에 문제가 발생해도 애플리케이션은 원본 데이터에 직접 접근할 수 있기 때문에 서비스가 계속 작동할 수 있다.단점Cache miss가 발생하는 경우에만 데이터를 캐시에 적재하기 때문에, 원본 데이터와 캐시가 일치하지 않는 Cache Inconsistency가 발생할 수 있다.초기에는 대량의 캐시 미스로 인해 DB 부하 발생 가능 Cache Inconsist..
[DataBase] Transaction - ACID란?
·
Back-end
매일메일을 통한하루 1개 CS 공부하기 ACID는 원자성 (Atomicity), 일관성 (Consistency), 격리성 (Isolation), 지속성 (Durability)의 약자이며, 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질이다. 원자성 (Atomicity)트랜잭션 내부 연산들이 부분적으로 실행되고 중단되지 않는 것을 보장하는 성질 즉, 전체적인 성공 또는 전체적인 실패만을 보장하는 것! ex>1. A에게 1000원 주기2. B에게 1000원 주기위 두 작업에 대해서 B에게 1000원을 줄 수 없는 상황이라면 (실패), A에게 주었던 1000원도 다시 돌려 받아야 한다. 실패 했을 때 다시 이전 상태로 되돌리는 것을 Rollback (롤백)이라고 한다. 일관성 (Consis..
[Spring] JPA 벌크 연산이란?
·
Back-end/Spring
만약, DB에 Member Table이 있고, Salary라는 컬럼이 존재한다고 가정해보자. 연봉 3000 미만의 member들의 Salary를 수정한다고 가정했을 때, JPA 관점에서는 다음과 같은 순서로 진행될 것이다.  em.find() OR select 쿼리를 날려 영속성 컨텍스트에 엔티티 저장 후 반환반환 받은 엔티티의 값을 변경한다. -> 영속성 컨텍스트에 반영된다.Commit 시점에 변경 감지(Dirty Checking)가 일어나며 Update 쿼리를 날려 DB에 반영한다. 만약, salary를 변경할 member가 80만명이라면? 80만번의 더티 체킹이 일어나고, 80만번의 UPDATE 쿼리가 날아갈 것이다... 이를 해결할 수 있는 방안이 바로 벌크 연산이다.  Bulk 연산이란? 벌크 ..
[Back-End] 로드밸런싱 톺아보기
·
Back-end
매일메일을 통한하루 CS 공부하기 로드 밸런싱이란 애플리케이션을 지원하는 리소스 풀에 들어오는 네트워크 트래픽(들어오는 요청)을 균등하게 분산하는 것을 의미한다. 이를 수행하는 로드 밸런서는 애플리케이션 서버 앞단에 위치하며 클라이언트 요청을 지시하고 제어한다. 이를 통해서 애플리케이션의 가용성, 확장성, 보안 및 성능을 확보할 수 있다. 로드밸런싱 알고리즘 1. Round Robin모든 요청이 순서대로 처리되는 방식이다. 모든 서버의 처리 능력이 동등하고, 요청의 고른 분산이 중요한 경우 고려할 수 있음. 장점 : 구현이 쉬우며 고른 분산을 보장할 수 있다단점 : 서버 부하나 response time을 고려하지 않고 서버 처리 능력이 다른 경우 비효율적임  2. Weighted Round Robin각 ..