분류 전체보기 (67) 썸네일형 리스트형 내 테스트 코드는 몇 점짜리? Jacoco를 통한 커버리지 관리 이 포스팅은 UPbrella 프로젝트의 기술 블로그에 작성한 내 테스트 코드는 몇 점짜리?, Jacoco를 통한 커버리지 관리 포스팅을 옮겨온 것입니다. 안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 업브렐라의 테스트 코드를 작성하면서 어떻게 하면 더 퀄리티 좋은 테스트 코드를 작성할 수 있을지에 대해 고민했습니다. 토스 팀의 이응준님의 코드 커버리지 100% 달성하기 영상을 보면서 많은 영감을 얻을 수 있었습니다. 다음은, 영상에 나오는 로버트 마틴의 클린 코더(2016) 책 속 인용구인데요. 저도 이 책을 읽어보지는 못했지만 커버리지의 중요성에 대해 많은 생각을 하게 되었습니다. 얼마만큼의 코드를 자동화한 단위 테스트로 커버해야할까? 대답할 필요조차 없다. 모조리 다 해야 한다. 모.. 테스트 코드 작성 반복 노동으로부터 해방, Fixture Monkey 이 포스팅은 UPbrella 프로젝트의 기술 블로그에 작성한 테스트 코드 작성 반복 노동으로부터 해방, Fixture Monkey 포스팅을 옮겨온 것입니다. 안녕하세요, 저는 업브렐라에서 백엔드 개발을 담당하고 있습니다. 업브렐라의 테스트 코드를 작성하면서 드러났던 문제점과 이를 Fixture Monkey라는 오픈소스 라이브러리로 어떻게 개선했는지 적어보려합니다. 기존 방식의 문제점 단순한 API에서는 괜찮았지만, 여러 테이블과 얽힌 복잡한 API의 경우 테스트 코드 작성에 점점 많은 시간을 소요하게 되었습니다. 이 중 꽤 많은 비중을 테스트 검증을 위한 Mock 객체 작성이 차지했습니다. 저희 팀은 Service Layer와 Controller Layer 테스트를 BDDMockito를 이용해서 BDD(.. @OneToMany Fetch Join 시 데이터 중복과 주의점 오늘은 JPA를 사용하면서 발생했던 OneToMany와 Fetch Join을 같이 사용할 때의 주의할 점과 발생하는 데이터 중복 해결 방법에 대해서 작성해보겠습니다. 참고자료는 김영한님의 자바 ORM 표준 JPA 프로그래밍 책입니다. 1. @OneToMany Fetch Join은 중복 데이터가 발생된다? 첫 번째로, @OneToMany 연관관계에서 Fetch Join으로 데이터를 가져오는 경우 중복 데이터가 생길 수 있습니다. 중복 데이터가 발생하는 원인은 fetch Join을 하면, 연관된 데이터를 모두 가져오기 때문에, 아래 같은 경우 team에 대해서 fetch join을 하면 Team의 레코드 개수는 6개가 될 것입니다. Team Id는 중복되지만, 연관된 Member ID는 다르기 때문에 다른 .. Real MySQL 8.0 읽기 - 아키텍처 본 포스팅은 Real MySQL 8.0 개정판을 읽고 정리한 내용입니다. 잘못된 내용이 있다면 편하게 댓글로 지적 부탁드립니다. 감사합니다. 아키텍처 MySQL 아키텍처 구조 MySQL 아키텍처 구조는 크게 MySQL 엔진과 스토리지 엔진으로 구분된다. MySQL 엔진 커넥션 핸들러, SQL 파서 및 전처리기, 옵티마이저 스토리지 엔진 실제 데이터를 스토리지에 저장, 스토리지로부터 데이터를 읽어온다. InnoDB와 MyISAM 스토리지 엔진이 존재하는데, 8.0 이후로부터 MyISAM 엔진은 거의 장점이 없어졌다. 따라서 앞으로는 InnoDB에 대해서만 언급한다. MySQL에서는 요청을 어떻게 처리할까? 가장 먼저 MySQL과 사용자가 커넥션을 맺는다. SQL문을 처리하고, SQL을 최적화한 후 스토리지.. 라우팅 알고리즘과 프로토콜 본 포스팅은 이석복 교수님의 네트워크 수업과 성공과 실패를 결정하는 상위 1%의 네트워크 원리를 참고하여 작성한 포스팅입니다. 라우팅 알고리즘이란? 라우팅 알고리즘이란 출발 라우터에서 도착 라우터로 패킷을 보낼 때 최적의 비용으로 보낼 수 있는 라우팅 경로를 결정하는 알고리즘입니다. 네트워크를 아래 그림의 그래프로 추상화한다고 생각해볼 수 있습니다. 위 그림의 예에서, u라는 라우터에서 z라는 라우터까지 가는 경로를 결정해야하는 문제가 발생합니다. 이를 결정하는 알고리즘을 구체화하기 전에, 알고리즘의 분류를 먼저 생각해보겠습니다. Q. Global(전역적인 공통의 정보를 이용) 알고리즘인가? 혹은 decentralized(각 지역의 정보를 종합) 알고리즘인가? Global 모든 라우터가 전체 라우터의 t.. 네트워크 계층 - IP, CIDR, NAT 본 포스팅은 이석복 교수님의 네트워크 수업과 성공과 실패를 결정하는 상위 1%의 네트워크 원리를 참고하여 작성한 포스팅입니다. 우리가 네트워크에서 요청을 보내면 HTTP 요청이 작성이 되어서 네트워크를 구성하는 계층들을 거쳐 Multiplexing, De-multiplexing이 일어나면서 데이터를 주고받게 됩니다. 이번 포스팅에서 어플리케이션 계층인 HTTP 프로토콜과 Transport 계층인 TCP 프로토콜에 대한 자세한 내용은 생략하겠습니다. 대략적으로 TCP 프로토콜의 도움으로 데이터의 신뢰성 있는 전송, 네트워크 혼잡 제어, 네트워크 흐름 제어 등이 가능해졌습니다. 사용자의 입장에서 네트워크 속으로 패킷을 보내면 신뢰성있게 잘 전달되고 응답이 잘 돌아온다는 것은 이해했는데, 상대의 호스트까지 어.. MySQL 쿼리 최적화 - Covering Index https://porolog.tistory.com/54 슬로우 쿼리 모니터링 - AWS CloudWatch https://porolog.tistory.com/53 DB Bulk Insert, Jmeter 부하테스트 안녕하세요, 오늘은 Issue Tracker 프로젝트를 진행하면서 10만건 이상의 데이터에서 비정상적으로 느린 API 응답을 어떻게 개선했는지 기록을 porolog.tistory.com 슬로우 쿼리 개선하기 이전 포스팅에서 슬로우 쿼리를 AWS CloudWatch를 통해서 로깅하도록 설정해보았습니다. 이번에는 로그된 슬로우 쿼리를 확인하고 개선해보겠습니다. 저번 포스팅의 로깅을 통해서 슬로우 쿼리를 찾았습니다. 놀랐던 점은 저는 당연히 아래 쿼리의 페이지네이션, 필터로 이슈 목록을 조회하는 쿼.. 슬로우 쿼리 모니터링 - AWS CloudWatch https://porolog.tistory.com/53 DB Bulk Insert, Jmeter 부하테스트 안녕하세요, 오늘은 Issue Tracker 프로젝트를 진행하면서 10만건 이상의 데이터에서 비정상적으로 느린 API 응답을 어떻게 개선했는지 기록을 공유하고자 포스팅을 작성합니다. Spring Data JDBC로 Bulk I porolog.tistory.com 저번 포스팅에서 메인 페이지의 GET 요청을 보냈을 때 200회의 요청을 보내면 평균적으로 36초의 시간이 걸리는 것을 확인했습니다. JDBC Connection Timeout이 발생하여, DB에서의 슬로우 쿼리 발생을 원인으로 추정하였는데요. 이번 포스팅에서는 AWS CloudWatch로 슬로우 쿼리를 찾아보고 개선하는 과정을 기록해보겠습.. 이전 1 2 3 4 5 ··· 9 다음