<aside>
☁️ Archive
🚀 https://sokdaksokdak.com/
깃허브 : https://github.com/woowacourse-teams/2022-sokdak
[> 데모데이 소개 페이지]
👩💻 개인 트러블 슈팅 기록
🖊 팀 기술블로그
📄 API 문서
💟 팀 인스타그램
속닥속닥 팀 문화
</aside>
https://www.youtube.com/watch?v=J2toMak8g9c
- 코스 인원 120여명 중 80% 이상 가입
- 최대 동접자 수 80명 : 코스 인원의 60%
- 글 540여개 : 인당 평균 4.5개
- 감동크루 등 코스 내 공식 폼 선정
프로젝트 기간
참여 인력
2022.06 - 진행 중
프론트엔드 2명 / 백엔드 5명
⚙️ 기술 스택 .
Backend
Language
| Java 11
Framework
| Spring 5.3.21, Spring Boot, Spring MVC
ORM
| Spring Data JPA 2.7.1, JPA Hibernate 5.6.9
Database
| H2, MySQL 8.0
Build Tool
| Gradle
Test
| Junit 5.8.2, Mockito
Infra/Cowork
Infrastructure
| Nginx, AWS (EC2, S3)
Monitoring
| SonarCube, Grafana, Prometheus
**CI**/**CD**
| Git, Github Action, Jenkins, SornarQube
Docs
| Spring REST Docs
Cooperate Tool
| Slack, Miro, Notion, Figma, Github Project
📝 수행 업무 .
<aside>
💬 업무 관련 작성한 포스트/문서를 링크로 걸어두었습니다.
</aside>
1. 쿼리 카운터 구현
- Spring AOP, 다이나믹 프록시 기반 쿼리 카운터 구현
ThreadLocal
로 스레드 별 쿼리 카운팅
- 10개 이상 쿼리 카운팅 시
warn logging
구현, Slack 알림 연동
[문제상황]
- 쿼리 개수를 모니터링할 필요성을 느끼고 특정 커넥션에서 사용된 쿼리 개수를 세는 쿼리 카운터를 개발했습니다.
[해결과정]
- 하이버네이트 기능 사용하는 대신 직접 AOP 기반 쿼리 카운터를 만들었습니다. 하이버네이트 이외의 구현체에 범용적인 쿼리 카운터를 구현하고 싶었기 때문입니다.
- 이때 등록된 DataSource에서 메소드 호출 시 ‘다이나믹 프록시 커넥션’이 리턴되도록 구현했습니다.
- 쿼리가 실행되는 connection.prepareStatement() 시점에만 쿼리 카운팅이 이뤄질 수 있었습니다.
- 또한 스레드 별 변수 지정 및 개수 초기화가 필요했습니다. ThreadLocal을 사용했습니다. 특정 스레드 별 격리된 변수를 사용함으로써 요청 당 쿼리 개수를 카운팅할 수 있었습니다.
- 추가적으로 10개 이상 쿼리 카운팅 시 warn 레벨의 로그를 남겨 슬랙에 알림이 전송되게 했습니다.
2. 타임머신 테스트를 통한 현재 시각 모킹
- 서비스 추상화가 적용된 타임머신 테스트 구현으로
OOP
실현
SpyBean
을 통한 현재 시간 모킹 방법 포스팅 🔗실전, 🔗이론
[문제상황]
- 프로젝트를 진행하며 현재 시각에 의존하는 코드를 테스트해야 하는 상황이 생겼습니다.
- Java에서 현재시간은 LocalDateTime.now()로 불러옵니다.
- 정적 메소드이기 때문에 모킹을 위해 Mockito의 정적 메소드 모킹 기능을 사용해야 했습니다.
- 정적 메소드를 모킹하는 것에는 문제가 없을까? Mockito 깃허브에서 해당 기능 관련 이슈를 찾아봤습니다.
- 코드를 직접 작성한 개발자와 다른 구성원들의 토론이 포함된 이슈를 찾을 수 있었습니다.
- 정적 메소드 모킹이 안티 패턴이며, 결합도 높은 코드를 생산하게 되는 문제가 있었습니다.
- 테스트 성능 이슈, 라이브러리 호환 문제도 언급되었습니다. 제작자 역시 해당 기능을 ‘되도록 사용하지 않을 것’을 권장하고 있었습니다.
[해결과정]
- LocalDateTime 클래스를 직접 분석해 보았습니다.
- now() 메소드 안에서 clock 객체가 사용되고 있었고, clock 객체를 파라미터로 넣어 테스트가 가능하다는 것을 알았습니다.
- 오라클 공식 문서를 통해 한 번 더 근거를 찾았습니다. 원활한 코드 테스트를 위해 clock 객체의 모킹을 권장한다는 설명을 찾을 수 있었습니다.
- 이에 clock 구현체를 빈으로 등록 후 SpyBean 모킹을 했습니다.
3. N+1 트러블 해결