홈페이지의 네비게이션 메뉴를 구현해야 하는데 대/중/소별 카테고리가 다 분리되어 있고, 검색바를 통한 도서 리스트 출력도 해야 해서... 머리가 너무 너무 복잡했었다. 내 자신의 능력을 하찮게 여기고 싶지 않았지만 같은 팀원 분들이 빨리 빨리 결과물을 내는 것을 보고 자꾸만 불안감이 밀려왔다.
할 수 있다고 마음을 500번 되뇌이고 일단은 메모장에 해야하는 것들을 적어두었다.
- 검색바 옵션(통합검색, 저자명, 도서명) 넘기기
- 카테고리 id (ex. cs_1, cs_2, ...) 넘기기
궁극적으로 필요한 정보는 다음과 같다.
- 도서 리스트에서 해당 조건에서의 도서 개수
- 해당 조건에 맞는 도서 리스트
우리는 하나의 도서가 하나의 소분류와 연결되어서 전체 카테고리 경로를 확인하려면 소-중, 중-대로 타고 올라가야 했는데, 프론트 단에서는 카테고리를 하나만 묶어두어서 고민이었다. (프론트에서 모든 정보를 전달할까, db에서 가져올까 고민하다 해당 부분의 id만 남겨두기로 결정했다. 필요한 부분만 프론트에서 제대로 입력하고 나머지 카테고리는 db에서 가져온다.) 일단 대/중/소분류 중 어느 카테고리에 속하는지를 파악하기 위해 category의 접두어를 조건절로 두어 각 조건에 맞게 처리했다. id의 접두어를 cs, cm, cl로 두었기에 이 점은 편했다.
- 프론트에서 category id를 넘기기 위해 submit 시 <button> 태그의 name 속성으로쿼리스트링이 넘어가도록 했다.
위에서 언급했다시피 대/중/소 카테고리가 분리되어 있어서 일단 3개의 테이블을 조인해야겠다고 생각했다. 그리고 이걸 도서 테이블과 조인해야 했는데, 조건에 맞는 도서가 없는 경우에도 조인해서 가져오는 게 비효율적이라고 판단해서 경우에 따라 나누어서 처리했다.
// 1. 도서 테이블에서 특정 카테고리에 속한 도서 개수 파악
int count = bookService.selectByCategoryCnt(sc.getCategory());
// 2-1. 개수가 0이면 카테고리만 조인한 테이블에서 카테고리 정보만 반환
CategoryDto categoryInfo = bookService.selectCategoryInfo(sc.getCategory());
// 2-2. 개수가 1 이상이면 도서 테이블에서 특정 카테고리에 속한 도서 개수 및 도서 리스트, 카테고리 정보 반환
list = bookService.selectByCategory(sc);
이 논리로 나는 구현에 성공했다.
이 방법이 객관적으로 좋은 사고였는지 알 수 없지만 적어도 내 논리에서는 최선이었다. sql 문을 작성할 때도 단순히 쿼리 문을 작성하는 것이 아니라, 중복을 피하고 유지보수하기 좋은 쿼리 문을 작성하려 한줄한줄 애.썼.다. (쿼리 문 짜는 건 누구나 할 수 있다고 생각했으니까!) 하지만 같은 팀원이 내가 짠 코드를 이해할 수 없다고 할 때 당황스러우면서도 인정할 수밖에 없었다. 중복되거나 조건에 따른 코드를 많이 분리했기 때문에 분리된 코드를 찾아 한번 다시 이해해야 했기 때문이다. 이 과정에서 가독성과 중복에 대한 트레이드 오프를 자주 생각했다. 내 머릿속에는 중복이 가장 안 좋지만, 가독성을 놓친 코드는 더 나쁘다고 자리 잡고 있다. 적절한 선에서 코드를 분리해야겠다고 생각했고, 코드 분리나 주석에 대해서 더 공부해 보고 싶다.
+ 다시 한 번 확인하는 SELECT 문 작동 순서
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. DISINTCT
7. ORDER BY
8. ** LIMIT/OFFSET **
(생각을 바로바로 메모에 쏟아내느라 글씨가 이상합니다....🥲)
'패스트캠퍼스 백엔드 부트캠프 3기 > Project' 카테고리의 다른 글
[프로젝트] 홈페이지 캐러셀 슬라이더 및 주간 랭킹 구현 (0) | 2025.03.31 |
---|---|
[프로젝트] CSS - display 속성 (0) | 2025.03.26 |
[프로젝트] 홈페이지 설계도 및 네비게이션 메뉴 구현 (0) | 2025.03.19 |