분류 전체보기(109)
-
MySQL 데이터베이스 복구 실패: 실험에서 배운 교훈과 데이터베이스 관리 전략
? DB 가 죽어버렸다. 껐다 켜면 되겠지라는 생각으로 다음 명령어를 쳤는데 brew services restart mysql 여전히 안된다. 원인 분석 그래서 로그를 확인하기 위해 ‘/usr/local/mysql/data/mysqld.local.err’ 을 까보기로 마음을 먹었다. 근데 파일이 자그마치 12MB 나 되는 파일을 일일이 읽는다는 건 비효율적이 판단했다. ERROR 관련 키워드(ex. ‘ERROR’, “Assertion Failure’, ‘crash’) 만 따로 추출해 분석해 보기로 했다. # 로그 파일에서 특정 키워드를 포함하는 부분을 찾아냅니다. keywords = ["ERROR", "Assertion failure", "crash"] matching_lines = [] for line..
2024.01.23 -
애자일 방법론 도입과 우아한남형제들 프로젝트의 변화
애자일 도입 배경 사실 우아한 남형제들 프로젝트는 시작한 지 벌써 근 2달은 되어갑니다. MSA 고민할바엔 일단 시작해보자라는 말과 함께 시작한 게 작년 12월이니깐요. 팀은 현재 백엔드 4명이고, 필자를 제외하곤 전원 취업후 바쁘게 살아가고 있고, 필자는 현재 취업을 위해 해축갤 이라는 프로젝트를 진행하고 있습니다. 다들 회사나 개인 프로젝트에 치중하느라 우아한 남형제들 프로젝트는 뭔가 진행이 되긴 하지만 사실상 잠정 중단 상태나 다름 없었습니다. 진전은 거의 없었고, 뭘 하긴 하더라도 서로 뭘 하는지 전혀 트래킹이 되지 않았기 때문에. 2023 연말에 주변 정리를 하다 이렇게 하다가는 서로의 시간만 버리겠다고 생각해 서로의 솔직한 프로젝트 회고 및 회의가 필요하다고 느껴 신년 기념 1월 1일에 모이자..
2024.01.21 -
Gradle에서 조건부 Jacoco 적용하기: CI/CD 파이프라인 최적화
최근에 우테크 블로그를 읽고, 코드의 품질을 관리하기 위해 Jacoco라는 도구를 도입했습니다. Jacoco는 코드 커버리지를 측정하는 도구로, 제가 작성한 테스트가 얼마나 코드를 잘 커버하는지 알려줍니다. 이를 통해 놓친 테스트 케이스를 찾아내고, 더 견고한 코드를 작성할 수 있었죠. 하지만, 실제 업무 중 급박한 상황을 겪으며 '긴급할 때는 코드 커버리지를 잠시 무시하고 버그부터 고쳐야 한다'는 생각이 들었습니다. 그래서 Jacoco 검사를 상황에 따라 선택적으로 실행하도록 설정하는 방법을 모색했습니다. Jacoco 설정 과정과 브랜치 변경 1. 첫 시도 - 우테크 블로그의 기본 설정: test { finalizedBy 'jacocoTestReport' } 설명: 이 설정은 Gradle의 test 태..
2024.01.10 -
JaCoCo와 애노테이션: 자바 테스트 커버리지의 한계 이해하기
JaCoCo 란? JaCoCo는 Java 코드의 커버리지를 체크하는 라이브러리입니다. 여기서 코드의 커버리지란 내 테스트 코드가 내 코드의 몇 퍼센트를 보증하냐!라고 생각하시면 편합니다. 테스트코드를 돌리고 그 커버리지 결과를 눈으로 보기 좋도록 html이나 xml, csv 같은 리포트로 생성합니다. 그리고 테스트 결과가 내가 설정한 커버리지 기준을 만족하는지 확인하는 기능도 있습니다. 최근 이러한 JaCoCo를 활용해 코드의 품질을 높이려는 노력을 하던 와중에 특이한 점을 찾았습니다. 특이점 JaCoCo 를 통해 테스트의 커버리지를 측정하던 와중 테스트 코드를 작성했는데도 커버리지가 카운팅이 되지 않는 부분을 발견했습니다. 다음은 문제의 코드입니다. @Test @DisplayName("updatePo..
2024.01.08 -
JUnit5 테스트 메서드는 왜 public 이면 안될까?
최근 코드 품질을 올리고 싶어 IDE에 SonarLint을 설치했더니 다음과 같은 경고를 받게 됐다. 요는 테스트 메서드에서 public 접근 제어자를 없애라라는 경고이다. 필자가 아는 지식은 JUnit 이 실행시에 테스트 메서드를 Reflection API로 뜨기 위해서 public 접근 제어자가 필수라고 알고 있었다. JUnit 5 제작자 왈 public 일 필요는 없지만, private 이면 안된다! 일반적으로 public 제어자는 기술적인 모종의 이유가 아닌 이상 쓰지 말아라 [출처] : https://junit.org/junit5/docs/current/user-guide/#writing-tests-classes-and-methods 요약하자면 우리 JUnit 5 팀은 "Less is more"..
2024.01.08 -
JDK 21과 Gradle 호환성 에러: 원인 분석과 실질적 해결 방안
문제 상황 최근 Oracle OpenJDK 21을 사용하여 프로젝트를 구축하던 중, 예상치 못한 에러가 발생했습니다. 아래는 해당 에러의 스크린샷입니다. Unsupported class file major version 알고 가는 기본 개념 1. Gradle 이란 무엇인가? Gradle helps teams build, automate and deliver better software, faster. [출처] : https://gradle.org Gradle은 "Build 자동화 도구"로 정의될 수 있습니다. 간단히 말해, 소프트웨어 개발 과정에서 반복되는 빌드 작업을 자동화하여 개발자가 더 빠르고 효율적으로 소프트웨어를 제작할 수 있게 돕습니다. 2. 그렇다면 Build 란? build is the p..
2023.12.21 -
EC2 메모리 문제 해결과 Elastic IP 적용: 인스턴스 유형 변경 후 IP 문제 극복기
상황 어제 EC2에 Spring Boot와 MySQL을 실행시키려 하니 다음과 같은 에러가 나왔습니다. 이유는 OOM(Out Of Memery) Killer 가 mysql.service를 죽였다는 것. 사실 이럴만도 한 게 기존에 쓰던 EC2의 스펙이 t4g.nano였습니다. 이 EC2 인스턴스의 스펙은 대략 다음과 같습니다 AWS Gravition Processor(CPU) 2 개와 메모리 500MB짜리입니다. 여기서 주요 문제는 메모리 용량입니다. 현재 지금 돌아가고 있는 EC2의 RSS(실제 사용하는 물리 메모리양)를 보면 mysql 은 396MB, Spring Boot는 222MB 인걸 확인할 수 있습니다. (상황 종료 후의 spring boot, mysql을 확인한 것입니다.) 심지어 mysql..
2023.12.20 -
Java @Scheduled: 매시 정각에 실행되는 Cron 표현식 테스트하기
배경 @Transactional @Scheduled(cron = "0 0 * * * *") public void updatePopularPosts() { // 새로운 상위 10개 게시물 추출 List top10Posts = postRepository.findTop10Posts(); // 기존의 data 삭제 popularPostRepository.deleteAllInBatch(); // 변환 후 새로운 data 삽입 List popularPosts = convertToPopularPost(top10Posts); popularPostRepository.saveAll(popularPosts); } 위 함수에 대한 테스트 코드를 작성해보려 하다 이런 글을 쓰게 되었습니다. 테스트의 목적은 매 정시에 함수가 실..
2023.12.20 -
테스트 띠띠ㅣ디ㅣ디ㅣ딛ㄹ딸깍? postman 으로 '띡띡딸깍' 하기
현재 다음과 같은 작업을 진행 중에 있습니다. 💡 데이터베이스에 1억 건이 있을 때 나의 가련한 API의 성능(반응시간)은 어느 정도 나올까? 현재 조회 쿼리는 인덱스도 뭐도 없고 단순한 형태의 CRUD 의 조회용 쿼리이기 때문에 1억 건에서 데이터를 뽑는 데는 실제로 오래 걸릴 것입니다. // 실제 사용하는 오늘의 코드 @Override public List findAllDTOs(Integer offset, Integer limit) { return queryFactory .select(new QPostDbDTO( post.id, post.title, post.content, post.member.name, post.isDeleted, post.reg_date )) .from(post) .orderBy..
2023.11.30 -
장바구니 기능명세서 수정 : 상황을 통한 통한 효율성 증진
최근 작업한 배달의 민족 '장바구니 추가' 기능에 대한 업데이트와 그 배경에 대해 공유하고자 합니다. 설계상의 오류: 불필요한 유효성 검사 초기 설계에서는 메뉴 ID의 유효성, 재고 상태 확인, 가게 ID의 유효성 등 여러 단계의 검증을 포함했습니다. 작성을 할 때부터 처리해야 하는 유효성 검사도 많은 데다가, MSA 환경이라 분리가 되어 있어 네트워크를 타고 해야 하는 유효성 검사면,, 성능이 무자비하게 안 좋을 거라 생각했습니다. 그래서 이에 대해 팀원들과 주간 회의에서 얘기하다 받은 피드백은 프론트엔드가 어차피 해당 가게의 메뉴를 이미 가져오는 상황에서 요청을 보내는 거라 메뉴 ID의 유효성 검증은 중복되고 불필요한 과정이라는 겁니다. 또한, 재고 상태를 DB에서 관리하는 것이 실제로는 의미가 없다..
2023.11.20