BackEnd262 [쿠링] 테스트 서버의 간헐적 다운 현상 (feat, Prometheus & Grafana) 1. 문제가 되는 상황 테스트 서버가 새벽에 지속적으로 다운되는 현상이 발생하고 있다.... 로그만으로는 정확한 원인을 파악하기 힘들어... prometheus와 grafana를 통해 메트릭을 정확하게 측정하게 되었다. 총 3부분을 살펴보았다. 1) CPU 사용량 2) JVM 메모리 사용량 초과 3) 커넥션 풀 고갈 4) vmstat 확인 2. 모니터링 2 - 1) CPU 사용량? 우선 다음 지표를 살펴보자 정기적으로 새벽 2기에 작동하는 작업이 있기 때문에 0시 ~ 4시 의 지점을 살펴보게 되었다. 다행히 터진시각 또한 대략 3시 15분경인데, 그래프에 보이듯 System CPU 사용량이 정상대비 급증하다 다운된 것 같다. 평균값이 0.00939인 상황에서 CPU 사용량이 0.0682 까지, 약 7배가.. BackEnd/쿠링 2023. 7. 17. [쿠링] 홍보 부스 후기 (feat 건국대 일감호 축제) 건국대 일감호 축제에서 2일간 "쿠링 홍보 부스"를 운영하면서 경험한 내용을 기록해볼까 한다! 1. 부스 신청부터 ~ 준비까지 1.1) 일단 신청부터 사실 신청 당일까지만 하더라도 내가 부스 대표자가 될 거라는 생각은 1도 하지 못하고 있었다.... 하지만 눈떠보니 부스 대표자가 되어 있었다랄까? 하지만 대표자가 된 이상, 성공적으로 끝까지 부스를 완주시키고 싶었다! 일단 부스 이름은 "쿠리의 공지 단속"으로 정하게 되었다. 요즘 인기있는 영화 제목을 이용한 "우영" 님의 아이디어 였는데, 가장 마음에 드는 이름이라 좋았다! iOS개발자 이시지만, 디자인까지 함께 해주신 "재성"님께 감사의 인사를 다시 한번 전한다! 1.2) 팀원들과 거침 없는 회의 팀원 대부분이 직장인이기 때문에, 회의 시간 동안 많은.. BackEnd/쿠링 2023. 5. 20. [쿠링] 검색 쿼리에 Full Text Index 적용하기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 문제 되는 상황 현 쿠링은 검색어를 입력받으면 like절을 사용하여 원하는 text를 필터링하고 있다. SELECT * FROM notice WHERE notice.contents LIKE '%장학금%' explain을 통해 실핼계획을 보면 다음과 같다. 예상했듯.... full scan을 하고 있다... 그래도 스토리지 엔진에서 데이터를 불러온 후, 100% filtering 하고있는걸 보면 조건절이 스토리지 엔진에 전달되어 필요한 데이터만 가져왔음을 알 수 있다. 이러한 방식은 검색한 text의 내용이 많아지면 어마어마하게 성능이 저하된다. 몇년치 데이터에서 like로 검색을 한다 생각하면.... 과부하가 발생하고, respo.. BackEnd/쿠링 2023. 5. 11. [쿠링] Multi thread를 활용한 공지 조회속도 개선 (feat 동기화) 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 쿠링에서는 학교의 전체 공지를 주기적으로 scrap해와야 한다. 하지만 이를 동기 처리 하다 보니 특정 학과의 scrap 속도가 늦어지면, 자연스럽게 전체 작업 속도가 늦어지는 문제가 발생하였다. 문제는 학교의 API를 사용하는 방식이 아니라, 직접 scrap을 통해 정보를 긁어오는 형식이기 때문에 주기적으로 신규 공지를 확인해줘야 하는데, 단일 코어상의 싱글 스레드로 처리하기에는 작업이 너무나 오래 걸렸다. 내가 생각한 공지 확인 간격보다, 한번 업데이트하는 시간이 더 길어지는 문제가 발생한 것이다! 나는 이를 해결하기 위해 Multi Thread를 도입한 비동기 처리를 해야겠다 생각하게 되었다! 2. 사전에 예상되는.. BackEnd/쿠링 2023. 4. 28. [쿠링] SonarCloud와 CI 도입 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 기존의 쿠링의 배포 과정에서 CI 과정이 없다는 점이 아쉬웠다. 따라서 이번에는 SonarCloud를 통한 정적분석과 코드 커버리지 측정을 위한 CI과정을 추가해야겠다는 생각이 들었다! SonarCloud공식문서를 보면서 하나하나 해결해봅시다~ https://docs.sonarcloud.io/advanced-setup/ci-based-analysis/github-actions-for-sonarcloud/ GitHub Actions To configure analysis of your project using GitHub Actions you should follow the in-product tutorial. docs... BackEnd/쿠링 2023. 4. 21. [쿠링] 형상관리를 위한 Flyway 도입기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 도입 배경 이번 쿠링 전 학과별 공지 지원 과정에서 기존의 Notice 테이블이 아닌, DepartmentNotice가 추가적을 발생하게 되었다. 새로운 테이블을 기존의 Notice테이블에 Dtype으로 구분하기 시작하면서, 추가된 속성들이 있고, 새로운 값들이 추가되었다. 물론 나야 내가 변경했으니 해당 의미들 을 빠르게 파악 가능하지만, 과연 다른 이가 봐도 이를 빠르게 이해할 수 있을까? 란 의문이 들었다. 또한 서로 다른 환경(local, test, prod)간에 통일된 스키마를 가지기 위해서 많은 리소스가 사용된다. 그러한 과정 속에서 다음 3가지 목표가 생기게 되었다. 업데이트마다 운영 DDL과 개발 DDL을 하나하나 .. BackEnd/쿠링 2023. 3. 31. [쿠링] 중복코드를 Template Method Pattern으로 Refactoring 하기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 현 상황 (개선하기 전의 코드) 우선 다음 코드는 Notice를 Scarp 하는 코드입니다. 문제는 (scarp, scarpAll), (requestWithDeptInfo, requestAllPageWithDeptInfo) 간의 중복 코드가 너무나 많다는 점입니다. scarp : 최근 공지 조회 scarpAll : 모든 공지 조회 이렇게 2개의 메서드를 구분하다 보니 발생한 중복 코드였습니다. 템플릿 메서드 패턴, 함수형 인터페이스, 람다식을 통하여 중복을 제거할 생각입니다! 우선 개선하기 전의 코드는 다음과 같습니다! @Slf4j @Component @NoArgsConstructor public class DepartmentNo.. BackEnd/쿠링 2023. 3. 27. [Spring] @Async와 ThreadPoolTaskExecutor 1. ThreadPoolTaskExecutor 스레드 풀을 사용하는 Executor java.util.concurrent.Executor를 Spring에서 구현한 것 이다. org.springframework.scheduling.concurrent 패키지에서 제공 주로 spring에서 비동기처리를 위해 사용 스레드풀을 사용하여 멀티스레드 구현을 손쉽게 해준다. Default 생성자 하나만 존재 2. Configuration 2 - 1) Pool size configuration @Bean public ThreadPoolTaskExecutor shineTaskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); ta.. BackEnd/Spring 2023. 3. 26. [쿠링] Spring에서 Custom Annotation을 사용하여 객체를 Map에 등록시키기 해당 글은 개인 프로젝트를 개선해 나가면서 내용을 정리하는 글입니다. 1. 현 상황 (개선하기 전의 코드) 우선 쿠링에서는 DepartmentName이라는 enum값과, 해당 학과의 정보를 저장하고 있는 DeptInfo객체를 저장하고 있다. 이를 통해 map을 필요한 곳에서 전달받아 enum을 key로 사용하여 해당 학과의 정보를 사용하는 코드이다. 우선 코드는 대략 다음과 같다. 이 정도만 보면 몇 개 안돼서 수동 등록할 수도 있을 것 같지만... 무려 학과가 75개.... 이걸 수동으로 다 등록하는 건 진짜 무리다... (물론 지금 코드는 그렇게 구현된 있긴 한데...) 나는 Custom Annotation을 만들어서 Reflection을 통해 configuration에서 등록하여 bean객체로 만들.. BackEnd/쿠링 2023. 3. 21. [RabbitMQ] RabbitMQ 기본 개념 1. RabbitMQ의 기능과 장점 오픈소스 Pivotal의 소프트웨어이며, Mozilla Public 라이선스로 배포되고 있다. erlang으로 작성된 RabbitMQ는 오픈소스의 유연함에 안정성까지 갖췄다고 한다. 플랫폼과 업체 중립성 AMPQ(Advanced Message Queuing Protocol)스펙을 구현한 메시지 브로커 이다. 경량성 관리자 UI플러그인과 함께 코어 애플리케이션을 구동하는데 40MB 미만의 메모리만 사용한다. 이후에 Queue에 메시지 양이 증가하면 메모리 사용량이 증가하게 된다. 다양항 클라이언트 라이브러리 RabbitMQ는 다양한 언어와 운영체제, 환경에서 서로 데이터를 공유할 수 있는 유용한 다리 역할을 한다. 유연한 성능과 안정성 절충 제어 안정적인 메시지 전달과 .. BackEnd/RabbitMQ 2023. 3. 12. [쿠링] QueryDsl을 활용한 키워드 검색 쿼리 구현 개인적으로 작업하고 있는 프로젝트에서 검색쿼리를 리팩토링 해야 하는 상황이 발생하였다. 우선 이전 방식의 코드를 살펴본 후, 이를 리팩토링 해 나가는 과정을 남겨보자! 1. 리팩토링 전의 코드 우선 keywords를 전달받아 처리하는 이전의 코드는 다음과 같다. ▶ NoticeServce.handleSearchRequest() public List handleSearchRequest(String keywords) { keywords = keywords.trim(); String[] splitedKeywords = keywords.split("[\\s+]"); // 키워드 중 공지 카테고리가 있다면, 이를 영문으로 변환 for (int i = 0; i < splitedKeywords.length; ++i).. BackEnd/쿠링 2023. 3. 7. [RestAssured] Multiparts 테스트 작성시 Json데이터와 File을 함께 보내기 (Cannot serialize because cannot determine how to serialize content-type multipart/form-data) 1. 문제의 상황 이번 문제는 기존의 Json만 전달하면 RestAssured 테스트 코드에서 multiparts를 전달하다 보니 발생한 문제였다. 우선 다음과 같이 (Json데이터 + multipart form data)를 함께 보내려 한다. 이를 받는 컨트롤러는 다음과 같다. @PostMapping("/api/sessions") public ResponseEntity createNewSession( @RequestPart @Valid SessionRequest request, @RequestPart List files) { SessionDto session = toDto(request); long currentGenerationId = generationService.getActiveGeneratio.. BackEnd/TDD 2023. 2. 28. 이전 1 2 3 4 5 ··· 22 다음