[TIL 55일 차] Sprint Mission7 - Controller 계층에서 주요 메서드 슬라이스 테스트
오늘의 성취
- Controller 계층에서 슬라이스 테스트를 작성
@WebMvcTest를 활용해 테스트를 구현- WebMvcTest에서 자동으로 등록되지 않는 유형의 Bean이 필요하다면
@Import를 활용해 추가 - 주요 컨트롤러(User, Channel, Message)에 대해 테스트 케이스 작성
ChannelController작업완료UserController작업 중
- MockMvc를 활용해 Controller를 테스트
- Service 계층을 mock하여 Controller 로직만 테스트
- JSON 응답을 검증하는 테스트를 포함
프로젝트 요구 사항
2. 기본 요구사항
//...
2-7. 슬라이스 테스트
//...
- [진행 중] 컨트롤러 레이어의 슬라이스 테스트를 작성하세요.
@WebMvcTest를 활용해 테스트를 구현하세요.WebMvcTest에서 자동으로 등록되지 않는 유형의 Bean이 필요하다면@Import를 활용해 추가하세요.- 예시
@Import({ErrorCodeStatusMapper.class})
- 예시
- 주요 컨트롤러(User, Channel, Message)에 대해 최소 2개 이상(성공, 실패)의 테스트 케이스를 작성하세요.
- MockMvc를 활용해 컨트롤러를 테스트하세요.
- 서비스 레이어를 모의(mock)하여 컨트롤러 로직만 테스트하세요.
- JSON 응답을 검증하는 테스트를 포함하세요.
2-8. 통합 테스트
- 통합 테스트 환경을 구성하세요.
@SpringBootTest를 활용해 Spring 애플리케이션 컨텍스트를 로드하세요.- H2 인메모리 데이터베이스를 활용하세요.
- 테스트용 프로파일을 구성하세요.
- 주요 API 엔드포인트에 대한 통합 테스트를 작성하세요.
- 주요 API에 대해 최소 2개 이상의 테스트 케이스를 작성하세요.
- 사용자 관련 API (생성, 수정, 삭제, 목록 조회)
- 채널 관련 API (생성, 수정, 삭제)
- 메시지 관련 API (생성, 수정, 삭제, 목록 조회)
- 각 테스트는
@Transactional을 활용해 독립적으로 실행하세요.
- 주요 API에 대해 최소 2개 이상의 테스트 케이스를 작성하세요.
3. 심화 요구사항
3-1. MDC를 활용한 로깅 고도화
- 요청 ID, 요청 URL, 요청 방식 등의 정보를 MDC에 추가하는 인터셉터를 구현하세요.
- 클래스명:
MDCLoggingInterceptor - 패키지명:
com.**.discodeit.config - 요청 ID는 랜덤한 문자열로 생성합니다. (UUID)
- 요청 ID는 응답 헤더에 포함시켜 더 많은 분석이 가능하도록 합니다.
- 헤더 이름:
Discodeit-Request-ID
- 헤더 이름:
- 클래스명:
WebMvcConfigurer를 통해MDCLoggingInterceptor를 등록하세요.- 클래스명:
WebMvcConfig - 패키지명:
com.**.discodeit.config
- 클래스명:
- Logback 패턴에 MDC 값을 포함시키세요.
-
로그 출력 예시
# 패턴 {년}-{월}-{일} {시}:{분}:{초}:{밀리초} [{스레드명}] {로그 레벨(5글자로 맞춤)} {로거 이름(최대 36글자)} [{MDC:요청ID} | {MDC:요청 메서드} | {MDC:요청 URL}] - {로그 메시지}{줄바꿈} # 예시 25-01-01 10:33:55.740 [main] DEBUG o.s.api.AbstractOpenApiResource [827cbc0b | GET | /v3/api-docs] - Init duration for springdoc-openapi is: 216 ms
-
3-2. Spring Boot Admin을 활용한 메트릭 가시화
- Spring Boot Admin 서버를 구현할 모듈을 생성하세요.
-
IntelliJ 화면 참고

-
모듈 정보는 다음과 같습니다.

-
의존성

-
-
admin모듈의 메인 클래스에@EnableAdminServer애너테이션을 추가하고, 서버는 9090번 포트로 설정합니다.import de.codecentric.boot.admin.server.config.EnableAdminServer; @SpringBootApplication @EnableAdminServer public class AdminApplication { public static void main(String[] args) { SpringApplication.run(AdminApplication.class, args); } }# application.yaml spring: application: name: admin server: port: 9090 admin서버 실행 후 localhost:9090/applications 에 접속해봅니다.- discodeit 프로젝트에 Spring Boot Admin Client를 적용합니다.
- 의존성을 추가합니다.
dependencies { ... implementation 'de.codecentric:spring-boot-admin-starter-client:3.4.5 } - admin 서버에 등록될 수 있도록 설정 정보를 추가합니다.
# application.yml spring: application: name: discodeit ... boot: admin: client: instance: name: discodeit ...# application-dev.yml spring: application: name: discodeit ... boot: admin: client: url: http://localhost:9090 ...# application-prod.yml spring: application: name: discodeit ... boot: admin: client: url: ${SPRING_BOOT_ADMIN_CLIENT_URL} ... - discodeit 서버를 실행하고, admin 대시보드에 discodeit 인스턴스가 추가되었는지 확인합니다.
- 의존성을 추가합니다.
- admin 대시보드 화면을 조작해보면서 각종 메트릭 정보를 확인해보세요.
- 주요 API의 요청 횟수, 응답시간 등
- 서비스 정보
3-3. 테스트 커버리지 관리
-
JaCoCo 플러그인을 추가하세요.
plugins { id 'jacoco' } test { finalizedBy jacocoTestReport } jacocoTestReport { dependsOn test reports { xml.required = true html.required = true } } - 테스트 실행 후 생성된 리포트를 분석해보세요.
- 리포트는
build/reports/jacoco경로에서 확인할 수 있습니다.
- 리포트는
com.sprint.mission.discodeit.service.basic패키지에 대해서 60% 이상의 코드 커버리지를 달성하세요.
GitHub Repository 주소
https://github.com/JungH200000/10-sprint-mission/tree/sprint7
Leave a comment