본문 바로가기
Blog/TIL

2025-02-21 (금)

by 코젼 2025. 2. 21.
728x90
반응형

📌 TIL (Today I Learned) - 2025-02-21

✨ 오늘의 핵심 정리

✔ returnsArgument(0)는 동일 객체 반환이지만, 객체 불일치 시 에러 발생 가능 → match {} 활용 가능

✔ Git 커밋 컨벤션에서 한 줄 코드 추가는 fix: 또는 refactor: 사용이 적절

✔ @Valid는 컨트롤러 DTO 검증용, 서비스에서는 Validator 필요 여부 판단 후 사용

✔ @Auth 인터셉터 테스트가 있다면 컨트롤러 단위 테스트는 생략 가능하나, 통합 테스트는 고려할 필요 있음

✔ match {}를 활용하면 MockK에서 객체 비교 문제를 해결할 수 있음

1. MockK에서 returnsArgument(0)의 의미

  • returnsArgument(0)는 첫 번째 인자로 전달된 객체를 그대로 반환하도록 하는 MockK의 기능이다.
  • 주로 JPA Repository의 save 메서드를 Mocking할 때 사용되며, 엔티티가 변경된 후 다시 저장되는 시나리오에서 활용된다.
  • 하지만, 객체가 다를 경우(동일성 비교가 실패할 경우) 예외가 발생할 수 있음에 유의해야 한다.
    • 이 경우, match { }를 활용해 특정 필드를 비교하는 방식이 유용할 수 있다.

2. Git 커밋 컨벤션: 코드 한 줄 추가 시

  • 코드 한 줄을 추가하는 경우, 커밋 컨벤션을 고민해야 한다.
  • 일반적으로 다음과 같이 정리할 수 있다.
    • feat: 기능을 추가하는 경우 (단순 코드 추가가 아닌, 명확한 기능 변화가 있을 때)
    • fix: 버그 수정 (예: 누락된 코드로 인해 기능이 제대로 동작하지 않는 경우)
    • refactor: 리팩토링 (기능 변경 없이 코드 스타일 개선, 가독성 향상 등)
    • style: 코드 스타일 변경 (예: 포맷팅 수정, 불필요한 공백 제거 등)
    🔹 결론: 단순히 코드 한 줄이 누락된 경우라면, fix: ~ 또는 refactor: ~가 적절하다.

3. Spring의 @Valid와 Validator 사용 여부

  • @Valid는 컨트롤러에서 DTO를 검증할 때 사용되며, 이를 위해 BindingResult 혹은 @Validated와 함께 사용된다.
  • 반면, 비즈니스 로직에서 객체를 수동으로 검증하려면 Validator가 필요하다.
  • 하지만, 컨트롤러에서 단순한 서비스 호출만 진행하는 API에서는 Validator가 불필요할 수도 있다.
  • 🔹 결론: 이번 API(PUT /analytics/toggle)에서는 별도의 DTO 검증이 없으므로, Validator는 필요하지 않다.

4. @Auth 어노테이션 적용 시 추가 테스트 필요 여부

  • @Auth 어노테이션은 인터셉터에서 권한 검증을 수행하는 방식으로 동작한다.
  • 이미 인터셉터에 대한 테스트가 존재한다면, 개별 컨트롤러에서 또다시 인증 관련 테스트를 진행할 필요는 없다.
  • 하지만, 다음과 같은 경우에는 테스트를 추가하는 것이 유용할 수 있다.
    1. 통합 테스트 (MockMvc 등)에서 실제 권한 검증이 제대로 수행되는지 확인
    2. 컨트롤러에서 권한 검증 외에도 추가적인 로직이 포함된 경우
    🔹 결론:
    • @Auth에 대한 테스트가 이미 존재한다면, 중복된 컨트롤러 단위 테스트는 불필요할 수 있음.
    • 그러나 전체적인 흐름을 검증하기 위한 통합 테스트(MockMvc 활용) 추가는 고려할 만하다.

5. MockK의 match {}와 객체 비교 문제

  • every { repository.save(any()) } returnsArgument 0 방식으로 save를 Mocking할 때, 객체 비교가 실패할 수 있다.
  • 이는 테스트 내에서 생성된 객체와 실제 save에 전달된 객체가 다르기 때문이다.
  • 이를 해결하려면, match {}를 사용하여 특정 필드 값만 비교하도록 설정하면 된다.
  • 🔹 예제:
every { repository.save(match { it.id == id }) } returnsArgument 0

🔹 결론:

  • returnsArgument(0)를 사용할 때, 동일한 객체가 전달되는지 주의해야 한다.
  • match {}를 활용하면 특정 필드 값만 비교하여 해결할 수 있다.
728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-02-25 (화)  (0) 2025.02.25
2024-02-24 (월)  (0) 2025.02.24
2025-02-20 (목)  (0) 2025.02.20
2025-02-19 (수)  (0) 2025.02.19
2025-02-18 (화)  (0) 2025.02.18

댓글