Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
📌 관련 이슈
🛠️ 작업 내용
🎯 리뷰 포인트
🤔 문제점
😳 선택지
1. 로컬에 직접 MySQL을 직접 실행한다
장점
단점
2. DockerFile이나 Docker-Compose를 이용해서 MySQL을 도커로 띄운다.
장점
단점
3. Testcontainers 라이브러리를 이용해서 DB를 띄운다.
장점
단점
‼그래서 뭘하지?
일단은 Testcontainers를 사용해보았습니다.
제 생각엔 테스트를 세팅하기 위해서 테스트 컨테이너 한번을 띄우는 것은 테스트 속도에 엄청나게 영향을 끼치지 않는다고 생각했습니다.
그리고 1번에서의 설명한 단점들이 전부 치명적이라고 생각해서
코드로 설정을 공유할 수 있는 3번을 선택했습니다!!
👍 적용
위에서 다룬 문제점 말고 저희가 H2를 사용할 때 추적하지 못하는 부분이 있을것이라 생각했습니다.
그래서 운영 환경과 같은 환경을 구성하기 위해서 MySQL을 이용한 테스트를 DB를 사용하는 테스트에 모두 적용하기로 했습니다.
그래서 현재는 위에서 보이는
MySqlContainerServiceTest
와MySqlContainerControllerTest
를 테스트들에 상속해놨습니다.코드 내용은 복잡하지 않아 간단히 설명하면
이 클래스만 보면되는데요.
이것은 mysql:8.0.35버전을 통해서 컨테이너를 구성한는 것이구요.
컨테이너를 실행하겠다는 의미입니다. 이미지를 풀 받고 컨테이너를 실행하는 작업을 하겠죠.
포트번호를 따로 설정해두지 않았는데요. 그럼 이때마다 포트번호가 동적으로 바뀌고 url도 바뀔 수 있겠죠?
그래서 스프링에서 제공하는 동적으로 프로퍼티를 주입해주는 방법을 이용해서 컨테이너에서 url, username, password, drive-class-name을 읽어와서 주입해줍니다.
참쉽죠?
😳 다시 고민
처음에는 MySQL 환경에서 테스트를 필요로하는 테스트만 골라서 적용하려했는데요.
하다보니까 모든 테스트를 동일한 환경에서 돌려야겠다는 생각이 들어서 적용범위를 모두로 넓혔습니다.
하지만 테스트 성능이 매우매우 저하됐는데요.
제 로컬 환경이 좋지 않아서 그런것도 있겠지만 테스트 속도가 5초에서 40초 가까이 저하됐습니다.
이번 CI 파이프라인에서도 테스트 속도를 체크해보고 적용범위를 같이 고민해봐야될 것 같아요!!
⏳ 작업 시간
추정 시간: 30분
실제 시간: 2시간
이유: 어떤 방법을 선택할지와 공부를 조금 했어용
🔗 참고자료
공식 문서
공식 예시 레포
딜리셔스 기술 블록