본문 바로가기

분류 전체보기

(42)
Apple Silicon Oracle Docker (M1, M2, M3) 1. 문제 정의로컬 환경에서 oracle을 실행할 일이 생겼습니다.하지만 Oracle의 경우 공식적인 oracle image를 제공하지 않기 때문에 oracle 로컬 구축에 어려움이 있습니다.심지어 apple sillicon의 경우 docker-desktop을 이용해서는 컨테이너를 실행할 수 없습니다.2. 해결 방법2-1 colima 설치가장 많이 나오는 해결 방법입니다.oracle을 x86-64 환경에서 실행할 수 있도록 docker 의 새로운 context를 생성해줍니다.해당 방법은 다른 블로그 글이 많이 때문에 생략하도록 하겠습니다.2-2 oracle linux를 이용한 oracle db 생성해결방법은 oracle 깃헙을 통해서 찾을 수 있었습니다.https://github.com/oracleora..
데코레이터 패턴 데코레이터 패턴이란?기존에 있는 코드를 변경하지 않으면서 부가적인 기능을 추가할 수 있는 패턴이다.데코레이터 패턴 적용 전예시로 댓글 서비스를 확인해보자public class CommentService { public void addComment(String comment) { System.out.println(comment); }}여기서 댓글의 특정 키워드를 trim 하는 기능을 추가해보자 .public class TrimmingCommentService extends CommentService { @Override public void addComment(String comment) { System.out.println(trim(comment)); ..
레거시 코드 전략패턴 적용기 기존 코드 (회사 코드중 일부를 추출해서 간단한 예시로 변형한 코드입니다.) 기존 코드는 id를 조회하기 위해 여러 Repository에 의존적이고 if-else 문이 반복되고 있습니다. 이는 코드의 가독성을 저하시키며, 새로운 type 혹은 value가 추가될 경우 다시 else문이 추가되어야 한다는 단점이 존재합니다. public long getCustomerId(String type, String value) { long id = 0; if (type.equals("TypeA")) { id = aRepository.readId(value); } else if (type.equals("TypeB")) { id = bRepository.readId(value); } else if (uniqueValue..
어떻게 JVM은 메모리를 관리할까 1. GC란? C 와 같은 언어로 프로그래밍을 한다면 메모리를 할당 후, 사용하지 않는 대상에 대해서는 메모리 해제를 해주어야만 메모리 누수현상을 방지할 수 있습니다. 하지만 Java를 포함한 많은 언어에서는 메모리를 해제하는 작업을 해주지 않는데도 메모리 부족현상 없이 잘 작동합니다. 그 이유는 GC(Garbage Collector) 덕분입니다. GC는 메모리 관리기법중 하나로, 프로그램이 동적으로 할당했던 메모리 영역(Heap 영역) 중 필요 없게된 영역을 알아서 해제 해주는 것입니다. 1 - 1 GC의 장단점 장점 GC가 메모리를 관리해주기 때문에 개발자가 메모리 걱정 STOP 메모리 누수 STOP 단점 GC 작업은 순수 오버헤드 (STOP THE WORLD) 개발자는 언제 GC가 작동하는지 모른다..
쿠폰 발급 동시성 제어 1. 문제 정의 연세대학교 골프동아리 웹사이트는 회원들의 참여 유도를 위해 무료 커피 쿠폰 , 스크린 골프 할인 쿠폰등을 지급하고 있습니다. 이러한 선착순 쿠폰 이벤트의 경우 순간적으로 사용자가 몰려 쿠폰 발급의 동시성을 제어하는 것이 관건이라고 할 수 있습니다. 동시성을 고려하지 않은 채 코드를 작성한 후 어떤 것이 문제가 되는지 살펴보겠습니다. public void createCoupon(Long couponId, Long userId, Long quantity) { Coupon coupon = couponRepository.findById(couponId).orElseThrow(); coupon.decrease(quantity); couponRepository.save(coupon); userCou..
Spring 처리율 제한 장치 (Rate Limiter) 1. 문제 정의 현제 연세대학교 골프동아리 웹사이트는 t2.micro에서 운영되고 있습니다. 사용할 수 있는 CPU는 한정적이기 때문에, 동아리 지원자가 몰리는 지원 마지막날에 대비해야 할 필요가 있습니다. 이번 포스팅에서는 t2.micro 에서 현재 웹 사이트가 버틸 수 있는 vUser의 지원서 작성 한계에 대해 알아보고, 어떻게 문제를 해결할 수 있는지 알아보도록 하겠습니다. 2. 트래픽 한계점 평균 동아리 지원자 200여명을 기준으로, vUser 200을 기준으로 테스트를 해보겠습니다. CPU 사용률이 50%에 이르며, 218번의 트랜잭션이 발생했지만, 이 중 성공한 트랜잭션은 70개에 불과합니다. 즉 트래픽이 몰릴 경우 테스트의 30%만이 성공하는 것을 확인할 수 있습니다. 이러한 에러가 발생할 ..
CloudFront 403 / 404 에러 해결 1. 문제 정의 업브렐라 프로젝트를 배포했음에도 불구하고 구글에서 검색되지 않는 문제가 있었습니다. 색인이 생성되지 않는 페이지를 확인해보니 아래의 페이지들에 문제가 있었습니다. 2. EC2 VS CloudFront 개발 서버의 경우, 인프라 구축의 비용을 줄이기 위해 EC2 + Nginx + React 로만 배포했습니다. 개발 서버의 웹 페이지 응답을 보면 정상적인 것을 확인할 수 있습니다. 똑같은 페이지이지만, 배포 서버의 경우 404 에러가 발생하는 것을 알 수 있습니다. 404 에러가 발생했지만, 페이지는 정상적으로 보여지기 때문에 더욱 원인을 찾기 어려웠습니다. 3. 문제 원인 이러한 문제는 클라이언트 사이드 라우팅을 사용하는 React 애플리케이션의 특성과 CloudFront의 동작 방식 간에..
Upbrella 버그 수정기 1. 문제 정의 운영상에 심각한 버그가 발생했다. 협업지점에 대여 가능한 우산이 없을 경우 협업지점 소개 페이지에 로딩이 되지 않는 것이다. 어디갔어…. 해당 기능 담당자가 현재 바쁘기 때문에 코드를 분석해보기로 결정했다. 2. 문제점 @Override public List findAllStoresByClassification(long classificationId) { QStoreMetaWithUmbrellaCount storeMetaWithUmbrellaCount = new QStoreMetaWithUmbrellaCount( storeMeta, umbrella.id.countDistinct().as("rentableUmbrellasCount") ); return queryFactory .select(..
Email 성능 개선기 1. 문제 정의 현재 연세골프 서비스는, 싱글 스레드로 지원 대기자, 합격 불합격 메일을 전송하고 있습니다. 대기자 명단이나, 지원자 수가 적을 경우 문제가 되지 않지만, 매 학기 100여명이 지원하는 동아리를 운영하기에는 큰 부담이 될 수 있습니다. 이번 포스팅에서는 이러한 문제를 해결하는 방법에 대해서 알아보도록 하겠습니다. 2. 해결 방법 2 - 1 멀티 스레드 가장 먼저 생각한 방법은 멀티 스레드로 메일을 전송하는 것이었습니다. Java에서 스레드 풀을 사용하여 이메일 전송을 빠르게 처리하려면 ExecutorService를 사용하여 병렬 처리를 구현할 수 있습니다. private ExecutorService emailExecutorService = Executors.newFixedThreadPoo..
모니터링 with Docker 1. 문제 정의 컨테이너로 어플리케이션을 관리하면 다음과 같은 장점이 있습니다. 게시글 링크하기 “전투에서 실패한 지휘관은 용서할 수 있지만 경계에서 실패하는 지휘관은 용서할 수 없다”는 말이 있습니다. 이 말을 서비스를 운영하는 개발자에게 비춰 보면 장애는 언제든지 발생할 수 있더라도 그만큼 모니터링을 잘 해야 한다는 뜻입니다. 김영한님 스프링 강의 중 기존에는 EC2에 직접 Grafana와 Loki를 설치하였으나, 이번 포스팅에서는 컨테이너로 Loki, Grafana, Promtail을 관리하는 방법을 알아보도록 하겠습니다. 2. 로그 관리 현재 프로젝트에서 스프링 설정은 application.yml로 관리하고 있습니다. yml 설정에서 로그를 어디에 저장할 지 설정해보도록 하겠습니다. logging..