티스토리 뷰

사다리 타기 미션

레벨 1의 두 번째 미션은 위와 같이 사다리 타기를 구현하는 것입니다. 결정이 필요한 상황에서 무작위로 결정하고자 할 때 사다리 타기를 많이 사용하는데 저 또한 많이 사용해 보았기에 도메인을 이해하는데 큰 어려움이 없었습니다. 이해하고 있는 사타리 타기를 바탕으로 요구사항을 정리해 보았습니다.

  1. 플레이어
    • 이름을 설정할 수 있습니다.
    • 이름은 최대 5글자인 영문자로 중복될 수 없습니다.
    • 2명 이상, 10명 이하로 구성됩니다.
  2. 사다리
    • 2개 이상, 10개 이하의 라인으로 구성됩니다.
    • 라인의 각 지점에서 지정된 방향으로 움직입니다.
    • 움직이고 아래 라인으로 내려갑니다
  3. 당첨 항목
    • 공백이 될 수 없고 5글자 이하로 작성합니다.
    • 개수는 플레이어 수와 동일합니다.

사다리 설계

도메인 관계도

이전 미션과 마찬가지로 mermaid를 사용하여 도메인 관계도를 작성해 보았습니다. 도메인 관계도를 작성하게 되었을 때 각 도메인이 가져야 할 역할에 대해 구체적으로 떠올릴 수 있었습니다. 세부 기능 작성할 때 어려움을 겪고 계시다면 사용해 보는 것을 적극적으로 추천해 드립니다.

TDD

사다리 미션에서는 다음과 같은 요구사항이 추가되었습니다.

모든 기능을 TDD로 구현해 단위 테스트가 존재해야 한다.

TDD라는 용어는 자주 들어보았지만, 구체적으로는 알지 못했었습니다. 한 번쯤은 학습하고 적용해보고 싶은 개발 방법이었는데 이번 미션을 통해 TDD와 친해지기 위해 노력했던 것 같습니다.

TDD란?

TDD는 Test Driven Development의 약자로 테스트 주도 개발을 의미합니다. 테스트 주도 개발이란 기능 개발에 앞서 먼저 테스트 코드를 작성하고, 이를 통과하기 위한 최소한의 코드를 작성 후, 리팩토링을 거쳐 코드를 향상하는 반복적인 개발 방법을 말합니다.

 

TDD는 크게 세 가지 단계로 나눌 수 있습니다. 첫 번째는 테스트 코드 작성 단계로, 개발자는  테스트 대상이 되는 기능에 대한 테스트 코드를 작성합니다. 이때, 테스트 코드는 실패하는 코드로 작성됩니다.

 

두 번째는 테스트 통과 단계로, 개발자는 최소한의 코드를 작성하여 테스트를 통과시킵니다. 이때, 코드의 품질은 고려하지 않습니다. 말 그대로 최소한의 노력으로 돌아가도록 만드는 것입니다.

 

세 번째는 리팩토링 단계로, 작성한 코드를 정리하고 품질을 향상합니다. 기존에 작성한 테스트 코드가 모두 통과되어야 하고 기존의 테스트가 수정되어서는 안 됩니다.

왜 하는 걸까?

1. 디버깅 시간을 줄여줍니다.

 

테스트 기반으로 코드를 작성하기에 안정적으로 코드를 작성할 수 있습니다. 테스트 코드를 통과하는 코드를 작성하면서 생각하지 못했던 예외를 미리 잡을 수 있기 때문에 코드 작성 시간도 줄여줄 수 있습니다.

 

2. 동작하는 문서의 역할을 합니다.

 

테스트 코드가 기능을 설명할 수 있는 하나의 문서처럼 동작하게 됩니다.

 

3. 변화에 대한 두려움을 줄여준다.

 

코드의 변경이나 수정이 필요할 때 테스트를 통해 코드를 검증할 수 있습니다. 따라서 코드의 유지보수성이 높아지고 버그 발생 가능성이 낮아집니다.

 

👾 TDD 경험 후 나의 생각

더보기

점진적으로 설계를 개선해 나갈 수 있다고 설명하고 있는데, 직접 해보았을 때는 어느 정도 설계가 틀이 잡혀 있어야 된다는 생각이 들었다. 클래스에 대한 테스트를 작성하기 위해서는 역할이 알맞게 분리되어 있고, 어떤 기능을 수행하는지에 대한 정의가 필요하다. 점진적으로 설계를 해나가다 보면 놓친 부분이 발생해 다른 클래스의 수정이 발생할 수도 있는데 설계 변경으로 인해 테스트가 깨지는 경우도 생길 것 같다.

 

TDD를 극찬하는 사람도, TDD를 극혐 하는 사람의 의견도 들어보았는데 충분히 의견이 갈릴 수 있는 개발 방법이라고 생각한다. 직접 해보았을 때 개발에 드는 시간적 비용에서 많은 차이가 발생한다. 하지만 많은 시간을 사용하는 만큼 메서드도 필요한 기능만 갖추도록 만들 수 있었고, 안정적으로 보기 이쁜 코드를 작성해서 기분은 좋았다.

 

현업에서도 모든 곳에 적용하지 않고 중요한 도메인에 대해서는 TDD를 진행한다고 한다. 현실적으로 모든 테스트를 꼼꼼하게 작성할 수 없는 한계도 존재하기에 중요도에 따라 적절한 방법을 선택하면 좋을 것 같다.

 

추후 팀 프로젝트에서도 중요한 도메인을 개발할 때 TDD를 사용해서 개발을 진행해보고 싶다.

학습한 부분

생성자 역할

public class Ladder {

    private final List<Line> lines;

    public Ladder(final LineGenerator lineGenerator, final Players players, final Height height) {
    	this.lines = generateLines(lineGenerator, players, height);
    }

    //...
}

라인을 가지는 사다리를 생성하기 위해 생성자에 생성 로직을 작성하였습니다. 하지만 생성자에 너무 많은 역할을 가지게 하는 좋지 않은 방법입니다.

 

생성자는 객체를 생성할 때 호출되는 특별한 메서드로, 일반 메서드와 달리 반환형이 없으며 클래스와 같은 이름을 가집니다. 객체를 생성할 때 필요한 초기화 작업을 수행하며, 인스턴스 변수의 값을 초기화하거나 메서드를 호출하여 객체를 사용하기 위한 준비를 하게 됩니다. 생성자는 객체 생성 과정에서 반드시 호출되어야 하는 메서드이기 때문에 클래스 내부에서 해당 객체를 사용하기 전 필요한 초기화 작업이 수행되도록 보장합니다. 기본 생성자는 매개변수 없는 생성자이며, 클래스 내부에 정의된 생성자가 없으면 컴파일러에 의해 자동으로 생성됩니다. 그렇기 때문에 너무 많은 역할을 생성자에서 수행하는 것은 좋지 않습니다.

 

생성자는 필드로 가지는 인자를 제공받아 인자를 검증하는 역할 정도만 가지고 있어야 합니다. 추가로 생성 로직이 필요한 경우 정적 팩토리 메서드나 팩토리 클래스를 고려해 볼 수 있습니다. 생성 로직을 다른 메서드나 클래스에 위임함으로 생성자는 온전히 자신이 가져야 할 책임만 수행할 수 있습니다.

마치며

사다리 미션의 페어는 로건과 진행하였습니다. 같은 데일리조에 있는 크루라서 모두가 같은 데일리조에 있는 크루와 매칭된다고 생각하였는데, 우연히 랜덤으로 매칭되게 되어 정말 신기했습니다. 로건은 우테코에 소문이 나있을 만큼 💎 알고리즘 고수였습니다. 사다리 기능 중 알고리즘적 기능이 필요한 순간이 있었는데 알고리즘 문제 해결하듯이 쉽게 구현하는 것을 보고 많이 배울 수 있었습니다.

 

우테코 프리코스부터 알고리즘을 놓고 있었는데, 필요성을 느끼게 되었고 현재 우테코 크루 8명과 꾸준함을 목표로 알고리즘 스터디를 개설하게 되었습니다.

로건은 배우고자 하는 열정이 강한 크루입니다. 해결하지 못한 문제가 있다면 잠을 줄여서라도 해결방법을 고민하고, 개발하고 싶은 부분이 있으면 적극적으로 하고 싶다고 표현했습니다. 열정적으로 고민하고 소통하면서 좋은 결과물을 만들어 낼 수 있었다고 생각합니다.

이번 미션을 진행하면서 개인적으로 많이 흔들리기도 하였습니다. 혼자서 진행했던 리팩토링 결과물이 마음에 들지 않았고, 리뷰 내용을 긴 시간 고민해도 만족스러운 방법을 찾지 못했었습니다. 그런 과정을 리뷰어분에게 말씀드렸고, 다음과 같은 답변을 들을 수 있었습니다.

많이 힘든 과정이라고 생각합니다. 하지만 교육은 잘한다/못한다를 가르는 것이 아닌, 성장하기 위한 방법을 알아가는 과정이기에, 천천히 방향을 가지고 진행해 보시면 좋을 것 같습니다.

조언을 듣고 나니 처음 우테코에 들어왔을 때 스스로의 방향을 잡고 성장하자라는 다짐과 다르게 주변과 비교하며 나의 방향을 잃은 채 헤매고 있다는 것을 느끼게 되었습니다. 다시 한번 스스로 나아갈 방향에 대해 생각할 수 있었고, 천천히 나만의 정답을 찾아 리팩토링을 마칠 수 있었습니다.

 

힘들었지만 개발 성장 외에도 많은 인사이트를 얻을 수 있었던 미션이었습니다. 스스로 많은 생각을 할 수 있게 도와주신 리뷰어분에게 다시 한번 감사드립니다.

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday