전체 글 65

JPA 동시성 문제 해결하기 (feat. JMeter)

(해당 글은 온전히 학습을 위한 부분이라는 점 참고 부탁드립니다. Pessimistic Lock을 사용하면 성능 상 좋지 않습니다.) 사용자가 컨텐츠 상세페이지에 방문할때마다 조회수가 1씩 증가되도록 로직을 구현하려고 합니다. 그런데 만약 1000명의 사용자가 동일한 상세페이지에 동시에 접근하면 어떻게 될까요? 동시성 고려하기 전 (로직 구현 및 테스트) 1. 조회수 증가 로직 위 코드를 참고하면, contentsRepository를 통해 contentEntity를 조회한 후 hits를 1씩 증가시키고 있습니다. 2. JMeter를 이용한 동시성 테스트 JMeter에 Thread Group을 생성하고 Number of Threads를 1000으로 설정한 후, 실행해보겠습니다. 먼저 DB를 통해 정상적으로..

JPA. 2022.09.13

Kafka Consumer 관련 Trouble Shooting 정리

이번 글에서는 '100만개 이상 LAG이 쌓인 이슈를 해결한 과정'에 대해 정리하고 공유하려고 한다. 로직 처리가 지연되고 있어 Kafka Consumer가 제대로 동작하고 있는지 확인하기 위해 LAG을 조회했는데, 100만개 이상의 LAG이 쌓여있었다. 1. Consumer Rebalancing 및 Duplicate Message 이슈 Kafka를 사용하다보면 Consumer가 리밸런싱 되는 과정에서 중복 메시지가 발생한다. 리밸런싱이 발생하는 원인은, Consumer가 Message를 소비하기 위해 Broker에 poll() 요청을 보낸 후, Consumer는 가져온 메시지를 처리한 후, 해당 파티션의 offset을 커밋하게 된다. poll 요청을 보내고 다음 poll을 요청을 보내는데 까지의 시간이..

Kafka 2022.08.19

SpringBootTest vs WebMvcTest

@SpringBootTest 는 기본 구성 클래스를 찾고 Spring Application Context를 시작하도록 명령한다. @SpringBootTest public class SmokeTest { @Autowired private HomeController controller; @Test public void contextLoads() throws Exception { assertThat(controller).isNotNull(); } } HomeController는 @Autowired를 통해 테스트 메소드가 실행되기전에 의존성을 주입받는다. Spring Test의 좋은 기능은 Application Context가 테스트 간에 캐시된다는 것이다. 그렇게 하면 테스트 케이스에 여러 메소드가 있거나 동..

Spring Framework. 2022.02.06

Mockito vs BDDMockito

Mockito 와 BDDMockito를 비교하기 전에 간단하게 Mockito 개념에 대해 알아보자. 단위 테스트를 작성할 때 해당 객체에 대한 기능만 테스트 하고 싶은데 의존성을 갖는 다른 객체에 의해 테스트 결과가 영향을 받을 수 있다. 이렇게 의존을 가지는 객체를 우리가 원하는 동작만 하도록 만든 것이 Mock 객체다. 그리고 이런 Mock 객체를 직접 만들고 관리하기가 쉽지 않은데, Mockito는 이를 편리하게 사용하도록 지원해주는 대표적인 테스트 프레임워크다. 그러면 Mockito 이용하여 간단하게 작성한 테스트코드 예제를 살펴보자. @Test @DisplayName("주문정보 생성 성공") void createOrderUsingMockito() { // given when(orderReposi..

Spring Framework. 2022.02.04

[Spring] JPA 동작 방식

엔티티란 데이터베이스의 테이블에 대응하는 클래스라고 생각하시면 됩니다. @Entity가 붙은 클래스는 JPA에서 관리하며 엔티티라고 합니다. 데이터베이스에 item 테이블을 만들고, 이에 대응되 는 Item.java 클래스를 만들어서 @Entity 어노테이션을 붙이면 이 클래스가 엔티티가 되는 것입니 다. 클래스 자체나 생성한 인스턴스도 엔티티라고 부릅니다. 엔티티 클래스를 설계하는 방법은 예제 를 진행하면서 알아보겠습니다. 엔티티 매니저 팩토리는 엔티티 매니저 인스턴스를 관리하는 주체입니다. 애플리케이션 실행 시 한 개만 만들어지며 사용자로부터 요청이 오면 엔티티 매니저 팩토리로부터 엔티티 매니저를 생성합니다. 엔티티 매니저란 영속성 컨텍스트에 접근하여 엔티티에 대한 데이터베이스 작업을 제공 합니다. ..

JPA. 2022.02.02

[Kubernetes] Secret

Secret이란? 패스워드, API Key, SSH Key 등 민감한 정보를 컨테이너에 주입해야 한다면? 시크릿 (Secret) 컨피그맵과 사용법 비슷 시크릿은 사용 목적에 따라 몇 가지 종류로 나누어 짐 쿠버네티스는 기본적으로 시크릿 값을 저장할 때 Base64 인코딩 Secret의 종류 1. Opaque (generic) — 일반적인 용도의 시크릿 2. dockerconfigjson — 도커 이미지 저장소 인증 정보 3. tls — TLS 인증서 정보 4. service-account-token — ServiceAccount의 인증 정보 kubectl Secret 생성 명령어 (generic) my-secret 이름의 generic 타입 Secret 생성 $ kubectl create secret g..

DevOps./Kubernetes 2022.02.02

[Kubernetess] ConfigMap

ConfigMap이란? 어플리케이션의 설정 값을 컨테이너에 주입하고 싶다면? 컨피그맵 (ConfigMap) 설정 정보를 환경변수 혹은 볼륨의 형태로 파드에 전달하기위한 목적으로 사용 파드에서 직접 환경변수를 관리하지 않고 ConfigMap을 분리하여 목적에 따라 설정 데이터를 다르게 주입 가능 kubectl ConfigMap 생성 명령어 my-config 이름의 ConfigMap 생성 $ kubectl create configmap my-config my-config 이름의 ConfigMap 생성 - 로컬의 config.yaml 파일을 키에 저장 $ kubectl create configmap my-config --from-file config.yaml my-config 이름의 ConfigMap 생성 -..

DevOps./Kubernetes 2022.02.02

[Kubernetes] Service (서비스)

서비스란? Deployment를 통해 파드를 수평확장 하면 트래픽은 어떻게 분산시키지? 외부로부터의 요청을 받으려면 어떻게 해야하지? 서비스 (Service) 여러 파드에 대해 클러스터 내에서 사용 가능한 고유 도메인 부여 여러 파드에 대한 요청을 분산하는 로드 밸런서 기능 수행 파드의 IP는 항상 변할 수 있음에 유의. 일반적으로는 ClusterIP 타입의 Service와 함께 Ingress를 사용하여 외부 트래픽을 처리합니다. 서비스의 종류 (총 4가지) 1. ClusterIP와 서비스 디스커버리 ClusterIP Service API 리소스의 가장 기본적인 타입 쿠버네티스 클러스터는 Pod에 부여되는 Pod IP를 위한 CIDR 대역과 Service에 부여되는 Cluster IP CIDR 대역이 독..

DevOps./Kubernetes 2022.02.02

[Kubernetes] Deployment (디플로이먼트)

디플로이먼트란? 서비스 버전이 업데이트되어 파드를 새로운 버전의 이미지 파드로 교체해야 한다면? 새 버전에 이슈가 발견되어 롤백을 진행해야 한다면? 디플로이먼트 (Deployment) 파드의 이미지 버전이 갱신될 때 배포 전략을 설정 디플로이먼트 오브젝트를 생성하면 대응되는 ReplicaSet과 Pod 자동 생성 기본적으로 Recreate 전략과 RollingUpdate 전략 지원 사용자는 특수한 목적이 아니라면 파드와 레플리카셋이 아닌 디플로이먼트로 워크로드 관리 디플로이먼트의 배포전략 재생성 (Recreate) 기존 레플리카셋의 파드를 모두 종료 후 새 레플리카셋의 파드를 새로 생성 롤링 업데이트 (Rolling Update) 세부 설정에 따라 기존 레플리카셋에서 새 레플리카셋으로 점진적으로 이동 m..

DevOps./Kubernetes 2022.02.02