Conversation
getPendingReservationStatuses에서 조회자(userId)가 아닌 메일 발신자 계정 기준으로 OAuth 토큰을 갱신하도록 수정합니다. 특권 유저/HR이 팀원 예약을 조회할 때 각각의 발신자 계정 상태가 정확히 반영되도록 합니다. Made-with: Cursor
getUserMailReservation에서 isPrivilegedUser 결과를 캐싱해 특권 유저의 불필요한 팀 이메일 계산을 방지합니다. 특권 유저는 항상 접근 허용, 일반 유저는 같은 팀 발신자 이메일인지 여부로만 접근을 결정하도록 분기 구조를 단순화합니다. Made-with: Cursor
|
@claude 이 릴리즈에 대해 정리하고 리뷰해줘. |
|
Claude finished @seulnan's task in 2m 42s —— View job 릴리즈 PR 코드 리뷰 (release-260311.01)작업 목록
📋 릴리즈 변경 내용 요약이번 릴리즈는 크게 두 가지 기능 영역의 변경을 포함합니다.
변경된 파일 (16개):
🔴 중요 이슈1. 빈 이메일 목록에서 IN 쿼리 에러 발생 가능성
val senderEmails = memberPrivacyService.getActiveTeamMemberEmails(userId).toList()
mailReservationReader.readAllBeforeBySenderEmails(now, senderEmails)
2. 프로덕션 코드에 개인 이메일 하드코딩 (보안)
private val privilegedEmails: Set<String> = setOf(
"umi.urssu@gmail.com",
"feca.urssu@gmail.com",
...
)실제 팀원 이메일이 소스코드에 하드코딩되어 있습니다. 이는 다음 문제를 야기합니다:
🟡 주의 이슈3. N+1 쿼리 문제 —
val activeMembers = memberReader.readAllActive()
// 내부적으로 멤버 수만큼 findAllPartsByMemberId() 쿼리 실행
4. JPQL 암시적 조인 사용
"SELECT r FROM MailReservationEntity r, MailEntity m WHERE r.mailId = m.id ..."Cartesian product 후 WHERE로 필터하는 암시적 조인 방식입니다. JPQL 표준의 명시적 5.
val senderEmail = user.getEmailAddress()
if (mail.senderEmailAddress != senderEmail) {
throw MailReservationAccessDeniedException(...)
}
6. 예약 시간 초과 취소/수정 시 예외 타입 불일치
// 예약 시간이 지난 경우 → MailReservationAlreadyProcessedException 사용
throw MailReservationAlreadyProcessedException("예약 시간이 지난 메일은 수정할 수 없습니다...")"예약 시간이 지남"과 "이미 발송됨"은 의미상 다른 케이스인데 동일한 예외 타입을 사용하고 있습니다. 클라이언트 측에서 errorCode로 구분 가능하다면 괜찮지만, 그렇지 않다면 별도 예외 클래스로 분리하는 것이 명확합니다. 🟢 긍정적인 부분
📝 코드 품질 코멘트SQL 파일 관리
미사용 메서드 확인
|
📄 작업 내용 요약
📎 Issue 번호