주특기 플러스 주차 개인 과제 트러블슈팅 목록
1) QueryDSL 적용 시에 build > ... > domain > entity 패키지 내의 엔티티 클래스들의 Q클래스가 생성이 되지 않는 문제가 발생함
2) 매니저 저장 요청 시 Log 테이블에 요청 시각과 그 외 추가적인 정보들을 저장할 때 AOP 코드를 사용하게 됨. 이 과정에서 요청한 사용자의 id도 저장하기 위해 joinPoint에서 userId를 가져오려고 했으나 getUserId() 등의 메서드가 존재하지 않아 사용할 수 없었음.
Long user = (Long) joinPoint.getArgs()[0].getUserId();
위와 같은 형태로 작성하고자 했는데, 이러한 코드에는 타입 관련 문제가 생김.
메서드 체이닝의 한계로 joinPoint.getArgs()[0]
의 타입을 AuthUser로 캐스팅해주어야 getUserId()로 사용자의 아이디를 추출할 수 있는데, 이 경우 AuthUser 클래스에 getUserId() 메서드가 존재하지 않는 경우에는 위의 형태로 코드를 작성할 수 없음.
Object[] args = joinPoint.getArgs();
AuthUser authUser = (AuthUser) args[0];
Long user = authUser.getUserId();
위와 같이 각 변수의 명확한 타입을 구분하고 필요한 데이터를 사용할 수 있도록 해결했으며, 가독성과 디버깅 시 용이하도록 코드를 변경하였음.
3) QueryDSL을 적용하여 일정 다건 조회 시에 쿼리문에서 where절의 사용에 대해 고민함.
.where(titleContain(title)
.where(createAtBetween(startDate, endDate))
.where(nicknameContain(nickname))
)
위 코드의 경우에는 타이틀, 기간 검색, 닉네임 중 한 조건이라도 만족하는 결과가 있다면 그 결과를 출력함. 그러나 요구 사항은 타이틀과 기간 검색, 닉네임을 모두 받지만 그 값이 없는 경우에는 무시하는 결과를 출력하기를 원하고 있기 때문에 아래와 같이 AND 조건으로 결합된 쿼리로 수정함.
.where(
titleContain(title),
createAtBetween(startDate, endDate),
nicknameContain(nickname)
)