플러스 주차 트러블 슈팅

dereck·2025년 3월 20일

TIL

목록 보기
21/21

들어가기 전에

벌써 최종 프로젝트가 눈 앞까지 왔다. 아직도 배워야 할 것이 많은데 벌써 최종 프로젝트라니.. 걱정이 조금 앞선다. 심지어 과제를 끝내고 난 뒤부터는 프로젝트만큼 열심히 하지 않는 것 같다. 마음만 급해지는게 아닌가 싶다.

개인 과제를 진행하면서 확실히 query 작성을 잘 못한다는 것을 깨닫게 되었다. 아무래도 팀 프로젝트마다 항상 유저 관련 도메인을 맡아서 하다보니 상대적으로 복잡한 쿼리를 만들 일이 없어서 그런 것 같다. 지금이라도 알아차렸으니 알고리즘 문제 풀이를 하면서 틈틈히 sql 문제도 풀어야 겠다고 느꼈다.

특히 기술도 기술이지만 기술을 원활하게 배우고 적절하게 사용하기 위해선 기반이 잘 되어 있어야 한다고 생각한다.. 지금까지 기술을 사용하기 위해서 열심히 달렸으니 프로젝트 이후부턴 비어있는 기본 지식들을 채워 넣는 것에 집중해야할 것 같다.

트러블 슈팅

코드 개선 퀴즈 - JPA 이해

JPQL을 사용해서 동적 쿼리를 만드는 문제였다. 생각보다 이 문제를 푸는 데 시간이 오래 걸렸다. 특히 LocalDateLocalDateTime으로 만드는 것과 JQPL 자체 로직 문제로 인해 대부분의 시간이 걸렸다.

결국 다음과 같이 해결했다.

LocalDate -> LocalDateTime으로 변환

LocalDateTime startDateTime = startDate != null ? startDate.atStartOfDay() : null;
LocalDateTime endDateTime = endDate != null ? endDate.atTime(23, 59, 59) : null;

request에서 빈 값이 들어오면 null로 보내고, 아니라면 해당 날짜의 시작과 끝으로 설정해서 보낸 뒤에 처리하게 했다.

JPQL 문제

여긴 그냥 JPQL 자체를 잘못 작성해서 발생했다. 특히 괄호를 적절하게 사용하지 못해서 예외가 발생한 적도 있고, 값이 존재하는지 존재하지 않는지에 대해서 확인하는 로직은 null일 경우가 더 먼저(=왼쪽)있어야 한다는 것도 알게 되었다.

Spring Security 적용 후 테스트 코드 실패

시큐리티를 적용한 뒤에 같은 문제가 반복해서 발생했었다. 의존 주입에 대한 문제였고, @Value를 적은 곳에서 동시에 발생했다.

@Import 사용

테스트 클래스에 @Import({PropertyConfig.class, JwtUtil.class, JwtAuthenticationFilter.class})를 추가해줬다.

여담으로 JwtAuthenticationFilter.class는 없어도 잘 돌아갔다..

test 안의 resources 제거

Import를 적용했는데도 같은 이유로 실패해서 또 삽질을 했다. @Import에 클래스를 넣었다가 뺐다가...

@Import를 했는데도 같은 예외가 발생했었다. 결국 test 안에 만들어 둔 resources 폴더를 전부 삭제했었다.

의외로 그랬더니 성공했다.

아마 Config 주입에서 충돌이 일어난 것이 아닐까..

QueryDSL 설정 문제

// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0'

querydsl 내부 클래스들을 읽어오지 못했다. jakarta로 되어있던 것까지 확인했는데도 문제가 생겨서 검색을 해보니 위의 의존성 주입이 잘못되어 있던 것이었다.

// querydsl
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'

뒤에 버전을 명시하는 것처럼 jakarta를 붙여줬더니 해결됐다.

대용량 데이터 처리

배치를 돌려서 값을 넣고 for 문으로 뒤에 현재 i 값을 뒤에 붙여서 닉네임과 이메일등을 만들도록 하면 된다는 것까진 알고 있었지만 막상 구현하려니 손이 움직이질 않아서 검색을 했다. 값을 넣는 방법은 많았지만 내가 원하는 답이 없어서 배치 설정을 하고 for 문을 돌려서 값을 넣었다.

하지만 1시간이 지나도 완료가 안돼서 확인해보니 로직이 꼬여서 백만 건 * 백만 건 그 이상이 발생하게 된 것이었다!

로직 정상화 이후 9분 32초만에 끝나게 되었다.

여담으로 인덱싱만 했는데도 300ms에서 12ms로 줄어든 것을 보고 인덱싱에 대한 중요성을 느꼈다.

References

깃허브 내 issue에 references를 최대한 작성했습니다.

0개의 댓글