본문 바로가기

전체 글88

테스트 더블과 mock 객체 사용 시 주의점 그동안 프로젝트를 진행하고 테스트 코드를 작성하면서 협력하는 객체들은 주로 목킹(mocking)을 했습니다. 실제 구현체 대신 목 객체를 사용하면서 개인적으로 느끼는 바가 있었습니다. 이번 글에서는 테스트 더블 4가지와 느낀 점에 대해 한 번 정리해보려 합니다. 테스트 더블(Test Double) 테스트 더블(테스트 대역)은 프로덕션 코드에서 실제 상호작용하는 객체 대신 테스트 코드에서 사용하는 가짜 객체들을 뜻합니다. 영화의 스턴트맨처럼 테스트 코드에서 실제 객체 대신 활약하는 스턴트맨의 역할을 수행합니다. 목(Mock) 목은 객체가 기대한 대로 상호작용하는지 확인하기 위한 객체입니다. 자바에서는 Mockito를 이용하면 쉽게 목 객체를 생성할 수 있습니다. @ExtendWith(MockitoExten.. 2024. 1. 27.
오브젝트와 함께 한 객체 지향 스터디 마무리 회고 지난 6월 중순에 시작한 객체 지향 스터디가 종료되어 회고를 작성해보려 합니다. 사실 스터디가 종료된 것은 지난 11월 중순이나 그동안 프로젝트를 진행하고 배운 내용을 정리하면서 조금씩 미루다 보니 무려 한 달이 지나서야 작성을 하게 되었습니다. 지난 1차 스터디에서 이어지는 이번 스터디의 방식과 짧은 내용 정리, 생각보다 길어진 스터디 기간동안 느낀점에 정리하며 마무리하겠습니다. 스터디 방식 기간: 7월 18일 ~ 11월 14일 사용한 자료: 오브젝트 초기에는 스터디원이 돌아가면서 그 주 챕터에서 대해서 요약하여 발표하고 각자 어려웠던 점에 대해서 공유하는 시간을 가졌습니다. 그러나 어느정도 진행했을쯤 어차피 모두 읽고 오는 내용인데 정리는 각자 진행하고 어려웠던 부분, 각자 프로젝트를 진행하면서 고민.. 2023. 12. 18.
프로젝션, 인덱스로 조회 성능 개선하기(feat.ngrinder) 이전 일대다 페이지네이션 최적화하기에서 애니프렌즈 프로젝트의 코드 일부를 예로 들며 BatchSize와 프로젝션을 이용한 일대다 컬렉션 페이징 쿼리를 최적화하였습니다. 이후 QA를 진행하던 중 보호 동물 목록 조회에서 1000ms 이상의 시간이 소요되는 것을 인지하였습니다. 보호 동물 서비스는 애니프렌즈 프로젝트에서 메인에 노출되는 기능이기 때문에 사용자에게 최대한 빠른 응답을 돌려줄 수 있어야 합니다. public record FindAnimalResponse( Long animalId, String animalName, String shelterName, String shelterAddress, String animalImageUrl ) { public static FindAnimalResponse .. 2023. 12. 16.
일대다 페이지네이션 최적화하기 일대다 컬렉션에 대한 페치 조인과 페이지네이션을 함께 사용하는 경우 다음과 같은 로그를 확인할 수 있습니다. 일대다 조인을 수행하는 경우 다 쪽의 데이터만큼 결과 row가 증가하기 때문에 DB에서 페이지네이션을 수행할 수 없습니다. 하이버네이트는 메모리 상에서 페이징을 시도하게 되면서 applying in memory라는 경고 로그를 남깁니다. 이러한 페이지네이션을 개선하기 위해서는 다음 2가지 방법을 사용할 수 있습니다. BatchSize 프로젝션 + IN절 쿼리 -> 애플리케이션 상에서 조인 수행 BatchSize BatchSize를 사용하기 위해서는 hibernate.default_batch_size를 이용해 글로벌로 설정하거나 @BatchSize를 일대다 컬렉션에 추가하여 개별적으로 설정할 수 있.. 2023. 12. 13.
낙관적 락, 데드락, 비관적 락 애니프렌즈 프로젝트는 봉사 모집 기능을 통해 봉사자들이 봉사 신청을 수행할 수 있습니다. 이 때, 각 봉사는 제한 인원이 정해져 있기 때문에 여러 인원이 한 번에 봉사 신청을 수행할 경우 제한 인원보다 많은 인원이 봉사 신청을 수행할 수 있습니다. 이러한 동시성 문제를 해결하기 위해서는 낙관적 락 또는 비관적 락을 이용해서 적절하게 처리해 줄 필요가 있습니다.저희 팀은 봉사 신청이 몰리는 인기 보호소가 있을 것으로 가정하였습니다. 따라서 빈번한 트랜잭션 충돌이 발생할 것이고, 낙관적 락을 사용하는 경우 서로 다른 트랜잭션이 공유락과 배타락을 획득하는 과정에서 데드락이 발생할 것이다라고 예측하였습니다. 다만 아직 데드락이 발생하는 상황을 직접 확인해 본 적이 없었기에 직접 두 눈과 손으로 확인해보고.. 2023. 12. 10.
로그 세팅하기 2탄. 프롬테일, 로키, 그라파나 애니프렌즈 프로젝트에는 AOP와 로그백을 이용해서 클라이언트 요청과 예외를 로깅하고 로그 레벨 별로 파일을 출력하도록 설정하였습니다. 개발 환경에서 클라이언트와 통신하면서 발생하는 문제를 좀 더 쉽게 파악할 수 있을 것이라고 기대했지만 여전히 문제가 되는 부분이 있었습니다. 다음과 같이 로그 파일을 확인하기 위해서는 몇 번의 단계를 거쳐야 했는데 이것이 쌓이면서 피로감이 점점 커져갔습니다. 1. 문제 발생 2. ec2 연결 3. 로그 파일 출력 경로 이동 4. 레벨 별 로그 파일 확인 터미널을 통해 로그를 확인하는 것도 쉬운 일이 아니었습니다. 적어도 지금보다 더 쉽게 로그를 확인 할 수 있는 방법이 필요했습니다. Loki Loki는 Grafana에서 만들어진 로그 수집 시스템입니다. Prometheus.. 2023. 12. 2.