본문 바로가기

반응형

전체 글

(32)
내가 만든 Docker Image가 ARM 아키텍쳐에서 실행되지 않을 때 개요Ticketing 프로젝트 진행 중, 서버의 업스케일링을 위해서 AMD/linux기반의 아키텍쳐에서 ARM/linux 기반의 아키텍쳐로 마이그레이션 할 일이 생겼습니다. 그런데 Docker Image로 빌드해놓은 Ticketing 어플리케이션이 ARM 아키텍쳐에서 실행되지 않는다는 오류를 발견했습니다.no matching manifest for linux/arm64/v8 in the manifest list entries 현재 상황현재 Ticketing Application이 배포되는 과정은 다음과 같습니다.개발자가 Github main Branch에 PushGithub Actions Script가 실행되어 Spring Build → Docker Image 생성생성된 Image를 Docker hub에..
공연 정보 조회 API 쿼리 분석하고 개선하기 개요티케팅 어플리케이션의 개발 및 배포가 완료되어서, 이제 성능 측정을 해보려 합니다.이번에 성능 개선을 할 API는 공연 정보 API 입니다.지금 아래와 같이 Performance가 검색 조차 되지 않는데, 쿼리 분석을 하고 정상적으로 검색이 되도록 수정해보고자 합니다.[LdrxyZMp]|||-> PerformanceReader.searchPerformanceSummaryDto [LdrxyZMp]||| PerformanceReader.searchPerformanceSummaryDto [Sldi1Gc3]||| PerformanceReader.searchPerformanceSummaryDto [NztCOAr_]||| PerformanceReader.searchPerformanceSummaryDto [wnv..
Spring + Grafana, Loki, Prometheus로 모니터링 시스템 구축하기 개요Spring + ELK Stack으로 로그 모니터링 시스템을 구축하려 했지만, ElasticSearch가 서버에 너무 무거워서 정상적으로 동작하지 않았습니다. 이에 대한 대안으로 ELK 대신 Loki와 Grafana로 로그 시각화 툴을 구축하고, 추가적으로 Prometheus를 도입해 메트릭또한 수집해 보고자 합니다.먼저 Grafana, Loki, Promtail을 필요로 하는데, 각 서비스의 역할은 다음과 같습니다.Grafana: 로그 시각화Loki: 로그 데이터 저장 및 인덱싱Prometheus : Spring, MySQL, Nginx등의 매트릭 수집Grafana와 Loki는 별도의 모니터링 서버에 구축하고, Promtail은 Application 서버에 구축하려 합니다.Grafana + Loki..
비동기 환경에서 Request를 유지하려면 어떻게 해야할까? 개요Spring Web MVC 환경에서 request 마다 유지되는 값이 존재할 때, 고민해야할 점이 하나 생겼습니다. 바로 비동기 환경에서 request 마다 유지되는 값을 전달해 줄 수 있을까? 만약 잘 동작하지 않는다면 어떻게 해야할까? 에 대한 고민입니다. 상황 설명상황은 아래와 같습니다. 아래와 같이 Logging을 찍는 AOP 코드가 있다고 가정해보겠습니다.@Component@Scope(scopeName = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)class RequestId( val id :String = createId()){ companion object{ fun createId() : String{ ..
Database Unique Constraint를 활용한 중복 예약 방지 로직 구현하기 개요공연 티케팅 예매 프로젝트 진행 중, 공연의 좌석에 대해 중복된 예약을 제한해야하는 요구사항이 존재했습니다. 이를 Database의 Unique Constraint를 사용하여 구현하였는데, 어떻게 구현하였는지 공유하고자 합니다.요구사항, Entity 설명먼저 요구사항은 아래와 같습니다.로그인된 사용자는 공연의 자리를 선택하여 장바구니에 추가할 수 있습니다. 이 때, 다른 사람이 이미 예약한 좌석은 예매할 수 없습니다.다음으로 엔티티를 보겠습니다. 엔티티는 아래와 같습니다.class Cart( @Column(unique = true, updatable = false) val uid: String, @ManyToOne @JoinColumn(name = "seat_id") val..
락을 활용한 동시성 처리 개요쇼핑몰 프로젝트 개발 중, Database 락을 활용하여 동시성 처리를 해결한 사례에 대해 소개하고자 합니다.재고 감소 로직 동시성 처리하기첫번째로 소개할 사례는 비관적 락을 활용하여 재고 감소에 대한 동시성 처리를 한 로직입니다. 코드는 다음과 같습니다.private int decreaseProductStock(List productDtoList) throws CannotFindEntityException, InvalidStockQuantityException { int totalPrice = 0; for(OrderDto.OrderProductRequestInfo productOrderInfo : productDtoList){ Product product = productRe..
MySQL에서 문자열 다루기 개요MySQL에서 문자열을 다루는 방법으로는 여러가지가 존재합니다. 먼저 컬럼을 정의할 수 있는 데이터 타입으로 CHAR, VARCHAR, TEXT 등이 있고, Collation을 통해 문자열 정렬이나 비교 연산이 달라질 수 있습니다. 이번에는 MySQL에서 문자열을 어떻게 다룰 수 있는지 알아보겠습니다.목차CHAR과 VARCHAR, TEXT란?CHAR과 VARCHAR 뒤에 붙는 숫자의 의미Collation이란?CHAR과 VARCHAR, TEXT란?앞서 언급했듯 컬럼을 정의하는 데이터 타입으로 CHAR, VARCHAR, TEXT가 있습니다. 이 3가지 타입을 비교해보겠습니다.CHAR고정형의 크기를 가지며, 추가적인 연산이 필요하지 않아 검색 속도 및 읽히는 속도가 VARCHAR에 비해 빠릅니다.최대 25..
캐시 전략 정리 캐시의 읽기 전략Look-Aside : 먼저 캐시에 데이터 조회 -> 없으면 DB에서 조회후 캐시 저장하는 방식입니다.장점 : 캐시에 장애가 발생해도 DB에서 데이터를 읽어올 수 있으므로 전체에 치명적인 영향을 주지 않습니다.단점 : 동시에 여러 요청이 같은 키에 대해 캐시 미스가 발생할 경우, 데이터베이스에 중복 쿼리가 발생할 수 있습니다.Read-Through: 캐시에 데이터 조회, 없으면 DB에서 조회해와서 캐시에 저장 -> 캐시의 값을 반환하는 방식입니다.장점: 어플리케이션이 캐시에만 값을 참조하므로 어플리케이션의 일관성이 존재합니다.단점: 어플리케이션이 무조건 캐시 서버에서 데이터를 조회하므로 캐시서버가 다운되면 문제가 될 수 있습니다.요약 : 캐시 미스시 어플리케이션이 DB에 접근하면 Look..

반응형