이 글은 정보성 글 보다는 저의 성장 과정이 담긴 글 입니다.
안녕하세요! 벌써 3주차 미션이 끝났네요!! 🎉🎉 다들 3주차 미션 잘 마무리 하셨나요?
저는 이번 주 목표 중 하나인 도메인 로직에 단위 테스트 작성이 저에게 너무 큰 난관 이여서 정말 힘든 한 주를 보냈어요 😂😂.
제가 이번 미션에서 겪은 난관, 이 난관을 어떻게 극복했는지, 난관을 극복하며 어떤 점을 느꼈는지를 순서로 오늘 포스팅을 통해 공유해보도록 하겠습니다!
저는 이번 주 목표 중 하나인 도메인 로직에 대한 단위 테스트 작성 연습이라는 문장을 이해하는게 가장 힘들었습니다. 왜냐하면 도메인 로직에 대한 개념이 정확히 자리를 잡고 있지 않았거든요,,, 😭. 그래서 이 목표를 보면서 이해가 되지 않는 부분에 대해서 스스로에게 많은 질문을 던졌어요.
❓ 도메인 로직이 뭐지?
❓ 왜 도메인 로직에 대한 단위 테스트를 작성하라고 하는 거지?
❓ 모든 로직에 대한 단위 테스트를 작성하는 것은 비효율적인가?
스스로에게 이런 질문을 던지다보니 모르는 게 정말 많구나 라는 생각과 동시에 미션을 진행하기가 두려웠어요. 그러나 고작 이 정도에 포기할 수 없다는 마음 가짐을 가지고, 도메인 로직에 대해 먼저 공부하기 시작했어요.
도메인 로직에 대한 개념을 이해하기 velog, tistory, 기술 블로그, 유튜브 등 수많은 곳을 돌아다녔지만, 제가 얻을 수 있는 정보는 도메인 로직은 현실 문제에 대한 의사결정을 하는 코드이다 가 끝이였고 도메인 로직과 비즈니스 로직 등 오히려 더 머릿속이 어지러워지게 되었어요.
사실 도메인 로직에 대한 개념 자체를 몰랐던 것 아니였어요. 그러나 도메인 로직과 비즈니스 로직에 대한 확실한 구분이 머릿속에 없었기에 명확히 이해하고 있지 못했던 것 같아요.
시간이 얼마 남지 않아서, 도메인 로직에 대한 이해를 뒤로 넘긴 채 우선 코드를 작성하기 시작했어요.
코드 작성을 완료하고, LottoController 를 시작으로 테스트 코드를 작성하기 시작했어요.
describe('로또 컨트롤러 클래스 테스트', () => {
describe('로또 발급 테스트', () => {
// test
});
describe('로또 비교 테스트, 보너스 번호 불일치', () => {
// test
});
describe('로또 비교 테스트, 보너스 번호 일치', () => {
// test
});
});
Controller에서 수행하는 역할에 대한 테스트 코드를 작성하면서 문득 이런 생각을 가지게 되었어요.
로또 발급은 LottoShop 클래스가 가지는 기능인데?
로또 비교 후 결과를 반영하고, 반환해주는 건 Statistics 클래스가 가지는 기능인데?
그렇게 LottoShop, Statstics에 대한 테스트 코드를 하나씩 작성하다 보니, Controller에 대한 테스트 코드가 다른 클래스들에 대한 테스트와 중복되어 필요가 없다는 사실을 알게 되었어요.
이제서야 저는 LottoController의 단위 테스트가 필요없는 이유와 이번 주의 목표 중 하나인 도메인 로직에 대한 단위 테스트 작성 연습에 대해 이해하게 되었어요.
도메인 로직이라는 것은 객체가 어떠한 행위를 하기 위한 의사결정 코드(객체가 가지는 기능)를 말하는 것이였고, LottoController는 도메인 로직을 가지는 객체들을 연결해주는 역할을 한다는 것을 말이죠!
그리고 이번주 미션에서 제공해주는 Lotto 클래스와 LottoTest 를 다시 확인해보며, 처음에 제공해주는 이유에 대해 알게 되었어요.
// LottoTest.js
describe('로또 클래스 정렬 테스트', () => {
test('로또 번호가 오름차순으로 정렬된다.', () => {
const lotto = new Lotto([1, 26, 16, 18, 2, 8]);
expect(lotto.getNumbers()).toStrictEqual([1, 2, 8, 16, 18, 26]);
});
});
// Lotto.js
class Lotto {
#numbers;
constructor(numbers) {
LottoValidator.validate(numbers);
this.#numbers = this.#sorted(numbers);
}
#sorted(numbers) {
return numbers.sort((a, b) => a - b);
}
getNumbers() {
return this.#numbers;
}
}
export default Lotto;
LottoTest 에서 로또 번호 오름차순 정렬 테스트는 사용자에게 정렬된 로또 번호를 보여주기 위한 의사결정 코드로 도메인 로직에 대한 단위 테스트에 대해 미리 알려주는 것을 알 수 있었어요.
이번 미션은 정말 큰 교훈을 얻을 수 있는 미션이였던 것 같아요.
처음에는 도메인 로직이 전혀 이해가 되지 않았고, 이번 미션에서 주어진 목표가 왜 이것인지 의문만 생겨서 처음에는 포기할까도 생각했었습니다,,
하지만 포기하지 않고 이번주 요구 사항을 지키기 위해 노력하면서 코드를 작성하다 보니 도메인 로직에 대해 이해할 수 있었고 클래스로 분리하는 이유와 도메인 로직을 분리하는 이유에 대해 알 수 있었어요.
이 뿐만 아니라 핵심 기능들에 대한 단위 테스트를 작성함으로써 핵심 기능이 안전하고, 효율적으로 동작하는지를 확인할 수 있었던 것 같아요.
이번 미션을 진행하면서 그만할까, 포기할까, 하지말까 등 수 많은 부정적인 생각을 가졌지만, 결국 미션에 도전했고 완료한 코드를 보니 정말 큰 성취감이 느껴지는 것 같아요. 🎉🎉
시작이 반이다. 라는 말이 있듯이 힘든 일이 있더라도, 한번 부딪혀 본다면 어제와는 다른 성장한 나를 확인할 수 있을 거에요!! 그러니 다들 포기하지 말아요! 🔥🔥