[Spring Boot] CH 4 개인 프로젝트 요구사항 정리 (Lv1 ~ Lv3)

박화랑·2025년 4월 16일

1. 프로젝트 개요

  • Spring Boot + MySQL 기반 일정 관리 시스템
  • 기능 확장보다는 코드 리팩토링, 성능 개선, 테스트 안정성 확보 중심
  • 요구사항 기반으로 세부 문제 수정 및 테스트 코드 검증

2. 리팩토링 & 개선 핵심 요약

레벨개선 항목설명
Lv.1불필요한 로직 제거- 회원가입 시 중복 인코딩 제거
- 날씨 응답 처리에서 if-else 제거 (early return 패턴 적용)
Lv.2성능 개선- @EntityGraph로 N+1 문제 해결
- JPQL 제거
Lv.3테스트 코드 보완- 테스트 실패 원인 분석 및 예외 메시지 정비
- 테스트 메서드명 컨텍스트 일치화

3. 커밋 내역 기반 개선 상세

Lv 1 - 불필요한 로직 제거 및 역할 분리

  • PasswordEncoder.encode() 중복 인코딩 제거
  • 날씨 조회 시 응답 처리에 early return 적용
  • 비밀번호 유효성 검사 로직을 서비스로 이동 (DTO 책임 분리)

Lv 2 - 성능 개선

  • N+1 문제 → @EntityGraph로 해결
  • 직접 작성한 JPQL 제거 → Repository 메서드 네이밍 전략 활용

Lv 3 - 테스트 코드 수정 및 리팩토링

  • CommentServiceTest: ServerException → InvalidRequestException 예외 타입 정정 및 메시지 일치화
  • ManagerServiceTest: 메시지 "Manager not found"로 변경, 메서드명 컨텍스트 반영
  • PasswordEncoderTest: passwordEncoder.matches(raw, encoded) 순서 오류 수정

4. 변경된 테스트 코드 예시

CommentServiceTest

@Test
void comment_등록_중_할일을_찾지_못해_에러가_발생한다() {
    given(todoRepository.findById(anyLong())).willReturn(Optional.empty());

    InvalidRequestException exception = assertThrows(
        InvalidRequestException.class,
        () -> commentService.saveComment(authUser, 1L, request)
    );

    assertEquals("Todo not found", exception.getMessage());
}

ManagerServiceTest

@Test
void manager_조회_중_할일_없으면_InvalidRequestException_발생() {
    given(todoRepository.findById(anyLong())).willReturn(Optional.empty());

    InvalidRequestException exception = assertThrows(
        InvalidRequestException.class,
        () -> managerService.getManagers(1L)
    );

    assertEquals("Manager not found", exception.getMessage());
}

PasswordEncoderTest

@Test
void matches_메서드가_정상적으로_동작한다() {
    String rawPassword = "password123";
    String encodedPassword = passwordEncoder.encode(rawPassword);

    boolean matches = passwordEncoder.matches(rawPassword, encodedPassword);

    assertTrue(matches);
}

5. 변경된 파일 요약 (총 4개)

파일설명
CommentServiceTest.java예외 메시지 및 예외 타입 수정
ManagerServiceTest.java메시지 및 테스트 메서드명 수정
PasswordEncoderTest.java테스트 로직 오류 수정
UserAdminService.java권한 변경 로직 추가 (changeUserRole())

6. 마무리

  • 예외 메시지와 테스트 결과를 통일하여 신뢰성 확보
  • 성능 병목 요소 제거 (N+1 쿼리)
  • 비즈니스 책임 분리로 구조 개선
profile
개발자 희망생

0개의 댓글