🎁[속보] 인프런 내 깜짝 선물 출현 중🎁

인프런 워밍업 클럽 스터디 3기 - 백엔드 클린 코드, 테스트 코드 3주차 발자국

학습 내용 정리

이번 주차에서는

  • Layer에 대한 테스트 코드 학습

  • 테스트 코드 적용 실습

1. Layer에 대한 테스트 코드

통합 테스트

  • 통합 테스트의 목적 여러 모듈이 협력하는 기능을 통합적으로 검증. 서로 다른 두 객체가 협력해서 동작할 때 단위테스트로만으로 예측하기 매우 어렵다

     

  • 풍부한 단위 테스트 & 통합 테스트 두 가지 모두 필요. 단위 테스트는 각 모듈의 정상 작동을 보장, 통합 테스트는 전체 시스템의 흐름을 검증.

레이어를 구분하는 이유

  • 관심사의 분리! 각 레이어는 특정한 역할을 수행하도록 한다. 이를 통해 유지보수성 극대화

  • Presentation Layer

    • 외부 요청을 받고, 최소한의 검증을 수행.

      • 도메인과 관련된 검증은 비지니스 레이어에서 수행

      • 문자열이 문자열 다운지 정도만 검

    • Business Layer, Persistence Layer를 Mocking해서 테스트

  • Business Layer

    • 비즈니스 로직을 구현하며, Persistence Layer와 함께 통합 테스트 진행

  • Persistence Layer

    • 데이터 접근 역할을 수행하며, 비즈니스 로직은 포함X

    • 거의 단위 테스트와 비슷한 성격을 가진다

    • 간단한 경우라도 작성한 메서드 쿼리 보장, 추후에 jpa가 아닌 다른 환경으로 변할 수 도 있다. 이를 보장하기 위해 작성

       

 

테스트시 사용 어노테이션

  • @SpringBootTest

    • 전체 애플리케이션을 로드하여 통합 테스트를 수행

       

  • @DataJpaTest

    • JPA 관련 빈들만 주입하여 가벼운 테스트를 수행.

    • 내부에 @Transactional이 존재하여 롤백이 된다.

       

  • @WebMvcTest

    • Presentation Layer에 대한 단독 테스트를 위해 사용

    • 다른 레이어들은 mocking을 통해 제어

    • JPA관련 빈들을 로드하지 않기 때문에 주의해야 할 점

      • JPA 관련 빈을 로드하지 않는다. 따라서, @EnableJpaAuditing과 같은 JPA 관련 설정이 어플리케이션 클래스에 선언되어 있으면 테스트 시 JPA 관련 빈을 찾지 못해 오류가 발생한다

        • @EnableJpaAuditing을 별도의 @Configuration 클래스로 분리하여 어플리케이션 클래스에서 제거

        • 테스트 클래스에 JpaMetamodelMappingContext@MockBean으로 추가하는 방법도 있다

  • @Transactional

    • 서비스 테스트 시 @SpringBootTest + @Transactional 주의점

      • 테스트 코드에서 @Transactional을 사용하면 비즈니스 로직이 트랜잭션을 포함하고 있는 것처럼 착각할 수 있다.

    • @Transactional(readOnly = true)

      • CQRS : command(CUD)와 query(R)를 분리

      • 쿼리용 서비스와 커맨드용 서비스를 분리할 수 도 있다. -> DB에 대한 엔드포인트 구분

      • Master/Slave DB를 나눔으로써 부하를 줄임

 

동시성 이슈

  • 낙관적 락 (Optimistic Lock)

    • 데이터를 읽을 때는 락을 걸지 않고, 데이터를 업데이트할 때 충돌이 발생하지 않았는지 확인하는 방식

    • 주로 읽기 작업이 많은 환경에서 사용, 데이터의 버전을 관리하여 충돌을 감지

    • 장점: 데드락 가능성이 적고 성능이 비교적 좋다

    • 단점: 충돌이 발생하면 롤백이나 재시도가 필요할 수 있다.

  • 비관적 락 (Pessimistic Lock)

    • 데이터를 읽을 때부터 락을 걸고, 업데이트가 완료될 때까지 락을 유지하는 방식입니다

    • 주로 수정 작업이 많은 환경에서 사용, 데이터의 일관성을 유지하기 위해 미리 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다.

    • 장점: 데이터 무결성을 잘 유지할 수 있다.

    • 단점: 락 경합으로 인해 성능 저하가 발생할 수 있다.

 

2. 테스트 코드 적용 실습

 

실습 진행 시 가장 중요하게 생각했던 부분

댓글을 작성해보세요.


채널톡 아이콘