오늘은 코드카타 SQL 69번 문제를 풀고, 팀 프로젝트를 얼추 마무리했다!
오늘은 1개의 SQL 문제를 풀었는데, 총 횟수가 일정 수준 이상인 데이터들에 한해서 월별, 아이디별 개수를 카운트하는 것이었다.
'총 횟수가 일정 수준 이상'을 만족하기 위해서 서브쿼리를 사용해야 했다.
조건 중에 기간에 대한 조건이 있었는데, 서브쿼리에서만 그 조건을 지키고, 메인 쿼리에서는 그 조건을 지키지 않아서 초반에 오류가 많이 났었다.
하지만, 비교적 빠르게 어디에서 오류가 생겼는지를 알아차려서 금방 해결할 수 있었다.
오늘 푼 문제와 풀이는 깃허브를 통해 업로드해두었다.
GitHub 보러가기
오늘! 사실 영업일 기준(?) 제출 하루 전이지만.. 드디어 프로젝트를 얼추 마무리했다!
사실 아직 테스트 커버리지도 못 채웠고, 발표 준비도 하나도 못해서 주말에도 작업을 해야하는 상황이다..
그리고 사실 우리가 예정했던 version 3의 일부 기능도 해결하지 못하고 끝났다.
그래도 필수로 구현해야 하는 부분들에 대해서는 모두 구현했고, 프론트엔드와 연동이 잘 되는 것도 확인했다!
그래서 이번 프로젝트도 성공적이라고 생각한다.
일단, 오늘 나는 로깅에 대해 구현하지 못했던 부분들을 마무리지었다.
어제 AOP가 작동하는 것까지만 확인하고, 실제로 로그를 구현하지는 못하고 마무리지었었는데, 오늘은 기능 요구사항대로 모든 기능을 다 구현하고 마칠 수 있었다!
먼저, 나는 커스텀으로 Loggable이라는 어노테이션을 만들었고, 이 안에 로그 타입을 기록하면, 각 타입에 맞는 로그가 생기도록 했다.
그래서 기존에 작업했던 내용들에서 크게 변경할 필요 없이 어노테이션 하나 붙이는 것으로 해결될 수 있도록 했다.
로깅은 실행 시간, 호출 메서드와 입력한 파라미터 등을 콘솔에 출력하는 '활동 로그'와 프론트엔드에서 조회할 목적으로 DB에 저장하는 로그로 2가지 요구사항이 있었다.
사실 호출한 메서드와 입력한 파라미터 등 정보를 가져오는 부분을 한 번도 해본 적이 없어서 걱정했었지만, 검색해보니 결과가 매우 빠르게 나왔다.
그래서 행동 로그에 대한 부분은 굉장히 빠르게 해결할 수 있었다.
문제는 요구사항에 맞게 DB에 로그를 기록하는 부분이었는데, 이 로직을 구현하면서는 컨트롤러에서 받은 response를 반드시 열어봐야만 했다.
하지만, 각각의 Response마다 응답 객체 DTO가 달랐기 때문에, 로그 타입별로 각각 다른 Response를 만들어서 필요한 값들을 꺼내와야 했다.
심지어는 Response가 null인 경우도 있었기에 그런 경우에는 Request URL을 찾아와서 URL에서 정보를 가져와야 했다.
이렇게 로그 타입별로 다른 내용을 진행해야 했기에, 이 부분의 로직들이 너무 복잡하게 느껴졌다.
하지만.. 너무 오래 내 코드들만 바와서 그런지 리팩토링할 방법이 도저히 생각나지 않았다.
그래서 일단 오늘은 여기에서 마무리짓고, 나중에 다시 리팩토링을 해보려고 한다.
이렇게 로그는 비교적 간단하게 마무리 되었고!!
이제부터는 프론트엔드와 연결하면서 이런저런 오류들을 수정해야 했다.
먼저, 댓글을 만들 때 댓글과 대댓글을 만들 수 있는데, 댓글을 정렬할 때 나는 그 종류와 상관없이 모두 시간 순서대로 정렬을 했다.
그래서 이상하게 정렬이 되었는데, 이 부분을 부모 댓글 기준으로 정렬할 수 있도록 수정하였다.
그런데.. 수정하는 과정 중에 task 아이디별로 댓글을 찾아오는 내용을 빠뜨려서 이 부분도 나중에 다시 추가해주었다.
또, 우리는 편의를 위해 각각의 엔티티에 @Where(clause = "is_deleted = false")라는 조건을 추가해줬었다.
하지만, 이렇게 작업하니 User 생성 부분에서 닉네임과 이메일의 존재 여부를 확인할 때 삭제인 유저의 닉네임과 이메일로는 조회하지 않았고, 그러니 unique 조건이 걸려있는 DB에서 충돌이 생겼다.
어차피 유저가 생성되지 않는 것은 같지만, 그래도 500 에러보다는 409 에러가 뜨는 것이 낫겠다는 생각에 이 부분을 수정하려고 했다.
처음에는 저 어노테이션이 쿼리문에 추가해주는 것이기에 내가 직접 쿼리문을 작성하면 될 것이라고 생각했다.
하지만, 알고보니 저 어노테이션이 붙어있으면 내가 어떤 쿼리를 작성하든 그 쿼리의 끝에 저 내용이 무조건 붙게 된다고 한다.
그래서인지 쿼리문을 아무리 작성해도 계속 SQL 오류만 생겼었다..
그래서 결국은 User는 엔티티에 저 어노테이션을 붙이지 않고, 저 내용이 필요한 부분들을 수동으로 작업해주었다.
이 외에도 자잘자잘하게 수정해야 할 부분들이 많더라.
그래서 그런 내용들을 모두 수정하고, 이번 프로젝트를 일단 마무리할 수 있었다.
아직까지 발표에 대한 준비가 안 되었기 때문에, 이제 주말 동안 발표 준비를 해야하고,
테스트 커버리지도 30%를 넘기라는 조건이 있었기에 주말 동안 테스트코드를 열심히 작성해야 한다.
그래도 이번 프로젝트에서 요구했던 사항들을 모두 만족했고, 프론트엔드와의 연동도 성공적으로 끝냈음에 매우 만족한다!
이번 프로젝트도 모두 마무리된 후에 다시 한번 정리해봐야겠다.
우리 팀이 진행한 내용들은 깃허브를 통해 업로드해두었다.
GitHub 보러가기
사실 더 구현하고 싶었던 내용들이 많았지만, 이번에는 시간 조절을 제대로 하지 못해서 결국 중간에 멈추게 되었다.
아직 코드 리뷰도 받지 못해서.. 발표가 마무리된 이후에 코드 리뷰도 진행해야 할 것 같지만,,
사실 지금 아직도 뇌가 제대로 돌아가지 않고 있다. 일단 오늘의 TIL은 여기에서 마무리짓고 다시 정리해보도록 해야겠다.