-
[Solitour] 성능 vs. 코드 가독성의 갈림길개발 ing 2024. 8. 21. 12:05
프로젝트 개발 하면서 고민사항에 대한 글이다
https://www.solitourist.com/Solitour - 새로운 나를 찾는 여행
Solitour(솔리투어)는 사용자들이 여행한 정보를 기록하고 공유하여 정보나 팁 같은 것들을 이미지와 함께 제공하거나, 사용자들이 모임 기간, 모임 마감일, 성별, 나이, 장소, 참여 인원 등을 설정
www.solitourist.com
solitour 프로젝트를 하고 있다
solitour 나는 solitour 프로젝트의 백엔드 개발을 맡아서 하고 있는데
어제 8월 20일에 큰 문제점을 마주하였다
드디어 올게 왔구나 라는 느낌으로 마주하였고 현재 글 쓰면서도 고민을 하고 있다
어떤 문제일까?
어쩌면 이러한 문제는 개발을 하다가 필연적으로 마주치는 일 중 하나인 것 같다
그건 바로 성능을 중요시 하냐 코드를 중점을 두고 할 거냐 등의 여러가지를 고려하면서 코드 설계를 해야 하는 점이다
문제점을 한번 알아보자
문제
가장 위의 현재 프로젝트의 url에 접속해보면 모임 기능이 있다
모임을 보면 페이지네이션 필트, 정렬 기능이 있다
나는 이부분을 Spring 에서 query dsl 를 이용해서 복잡한 쿼리문을 처리 해주었다
하지만!
하....
이러한 에러 사항이 있었다
그래서 확인을 해보았는데
위 코드가 문제 였다 위 코드는 현재 페이지의 데이터를 리스트 형태로 반환해준다
하지만 total 이 전체 조회 가 아니라 해당 페이지의 데이터의 수를 세는 것이다
그래서 이부분을 수정을 하려고 한다
해결책
1. 해당 페이지의 데이터 가져오는 쿼리, 전체 데이터 갯수 구하는 쿼리 각각 쿼리 보내는 방법 즉, 쿼리를 2번 날림
- JPA QueryDSL에서 fetchResults() 메소드가 더 이상 사용되지 않는다 그래서 전체 결과수와 페이지 데이터를 함께 가져오는 쿼리를 작성하는게 아니라 쿼리 두개를 작성한다
2. 더 복잡한 쿼리를 만들어서 쿼리 한번만 날리는 방법
- Hibernate의 @Query 어노테이션을 사용하거나 Native SQL 쿼리를 통하여 복잡한 쿼리를 작성하여 전체 결과 수와 페이지 데이터를 동시에 가져오는 방법을 사용
일단 이렇게 생각을 하였다
애플리케이션의 성능 요구 사항, 데이터의 규모, 코드 유지 보수성의 용이성 등을 고려하여 결정을 해야 할 때가 온 것 같다
드디어 개발자? 스러운 생각을 하고 선택을 해야한다
일단 하나하나 생각을 해보자
1. 애플리케이션의 규모와 성능 요구사항
- 소규모 일때
- 선택 : 두개의 쿼리 사용
- 이유 : 성능 차이가 크지 않다면 코드의 가독성과 유지보수성이 우선시 된다고 한다
- 두개의 쿼리를 사용하는 방법은 구현이 간단하고 이해하기 쉬워 장기적으로 관리하기 용이하다
- 대규모 또는 성능이 중요한 경우
- 선택 : 단일 쿼리 사용
- 이유 : 성능이 중요한 경우에는 데이터베이스 호출을 줄이는 것이 중요하다 복잡한 쿼리로 필요한 데이터를 한번에 가져오는 방법은 성능 최적화에 기여할 수 있다
2. 팀의 기술 스택과 경험
- 팀이 QueryDSL과 JPA에 익숙한 경우
- 선택 : 두개의 쿼리 사용
- 이유 : 결국 코드의 유지보수를 하는 건 나의 팀이다 그래서 Query DSL 의 장점을 최대한 활요하고 코드의 가독성과 유지보수성을 확보해야한다
- 팀이 SQL 및 데이터베이스 쿼리에 더 익숙한 경우
- 선택 : 단일 쿼리 사용
- 이유 : 성능 최적화를 위해 단일 쿼리를 사용하는것이 유리 할 수 있다 데이터베이스 쿼리 최적화에 대한 경험이 있어 효율적인 쿼리를 작성할 수 있습니다.
3. 장기적인 유지보수와 확장성
- 단기적 프로젝트
- 선택 : 두개의 쿼리 사용
- 이유 : 구현이 빠르고 코드의 복잡성을 줄여서 빠르게 배포가 가능하다
- 장기적인 프로젝트
- 선택 : 단일 쿼리 사용
- 이유 : 장기적인 성능과 유지보수를 고려하여 성능 최적화를 위해 복잡한 쿼리를 작성, 또한 장기적으로 쿼리 성능 문제를 방지 할 수 있음
결론
두개의 방법 중에 선택을 하자면 일단 결론은 두개의 쿼리를 사용했다
그 이유는
- 가독성 및 유지보수성 : 코드가 더 간단하고 이해하기 쉬워서 장기적으로 유지보수하기 용이하기 때문이다
- 성능 : 일단 아직 개발 초기 단계이기 때문에 배포하고 사용자가 적다 즉, 데이터가 적다 그래서 성능 차이가 크지 않을 것 같다
일단 두개의 쿼리를 사용하여 개발을 하고 추후에 배포를 한뒤 사용자가 많이 몰리거나 트래픽이 많아 지게 되면 다시 고민을 할 것이고 프로젝트가 끝난 뒤 계속 유지보수 하면서 모니터링 후 다시 고민을 하고 개선해야 겠다
'개발 ing' 카테고리의 다른 글
[Agarang] 지금까지 내가 잘 못 알고 있었던 점 (1) - 문제제기 (0) 2025.02.08 [DOSI:RAK] “DOSI:RAK 서비스 개발 : Spring EventListener로 객체지향 설계 문제 해결하기” (1) 2024.12.16 [Backend] application.properties, application.yml 보안 관리와 협업 효율성 높이기 (0) 2024.12.10 [Solitour] 비용과 성능의 트레이드오프 (2) 2024.10.13 [Solitour] Builder 패턴을 써야할까? (0) 2024.09.21