목차
지금까지 구현했던 코드는 4주차의 요구사항들을 보며 절대 좋은 코드가 아니었음을 느꼈습니다.
지금까지 고려하지 못했던 부분은 아래와 같습니다.
BridgeRandomNumberGenerator
와 BridgeNumberGenerator
등과 같은 예시위와 같이 느낀 이유를 설명해보겠습니다.
첫번째로 이전까지 메소드를 사용할 때 static을 붙여 정적으로 사용하여 객체를 생성하지 않아도 메소드를 사용할 수 있게끔 하였습니다. 그렇게 하다보니 언제 객체를 생성해서 사용해야 하며 객체의 주입, 제어의 역전등의 개념이 왜 필요한지도 이해하기 어려웠습니다. 자바는 객체지향 언어 입니다. 그 특징을 잘 활용해야하지만 자바를 사용하며 객체지향적으로 코드를 구현하였다고 할 수 있습니다.
아래와 같이 static으로 메소드를 생성하지 않고 필요한 부분에서 객체를 생성해보았습니다.
InputView inputView = new InputView();
int BRIDGE_SIZE = inputView.readBridgeSize();
두번째로 BridgeRandomNumberGenerator
와 BridgeNumberGenerator
를 활용하여 코드를 구현할때 객체 주입을 왜 해야하는지 알 수 있었습니다. 이렇게 구현하게 되면 객체간의 의존성이 적어지고 이는 단위 테스트를 할때 좋은 테스트를 작성할 수 있게 해주기 때문입니다.
만약 랜덤한 수를 생성시 메소드를 사용할 때 BridgeNumberGenerator
인터페이스 없이 BridgeRandomNumberGenerator
구현체를 그대로 받아와서 사용한다면 이후 테스트 케이스를 작성할 때 의존성이 너무 커지기 때문에 단위테스트를 작성하기가 어려워집니다.
여기서 객체지향과 추상화 개념이 사용됨을 알 수 있습니다.
추상화를 얻는 것을 PSA (portable service abstraction) 라고 합니다.
생성자 주입 BridgeMaker
생성자 에서 구현체인 BridgeRandomNumberGenerator
가 아닌 인터페이스 BridgeNumberGenerator
를 주입받으므로써 구현체에 의존하지 않고 역할인 인터페이스에 대해 의존적이게 한 것이 요구사항의 포인트라고 생각합니다. 이렇게 되면 해당 클래스는 구현체에 의존적이지 않게 되고 이는 곧 단위테스트를 하기 용이하게 할 수 있다고 생각합니다.
하지만 이 개념들을 코드에 적용시키며 구현하기에는 쉽지 않았습니다.
위 개념은 자동차가 바뀌어도 운전자는 동일하게 운전할 수 있는 것과 같은 원리라고 생각합니다.
의존성에 대해서 자동차와 운전자 예시를 든다면 기존에는 자동차가 바뀌게 되면 각각의 자동차에 의존하고 있으므로 자동차 명을 다 바꿔줬었어야 하지만 위와 같이 역할로 구분하여 구현하게 되면 역할인 인터페이스를 주입받았기 때문에 자동차가 바뀌어도 구현체만 바꾸어주면 되므로 다른 코드에는 아무런 변경 없이 테스트가 가능하게 됩니다.
세번째로 도메인(역할)을 나누어 구현할 때 Game이라는 클래스를 핵심 비즈니스 로직으로 두고 기타 IO 클래스들(InputView, OutputView)은 핵심 비즈니스 로직과 분리하여 구현하는 것 입니다.
이는 이후 유지보수시 아주 중요한 역할을 합니다.
만약 도메인을 나누지 않는다면 모든 동작들이 어디에 위치하는지 알 수 없으므로 수정할때 매우 곤란해지는 상황이 오게 됩니다.
따라서 처음부터 코드를 작성할때 도메인을 명확히 하여 가독성이 좋고 유지보수를 하기 좋게 코드를 구현해야 함을 알 수 있었습니다.
이번 4주차의 문제 풀어가며
어떻게 하면 객체지향적인 자바 코드를 PSA, IOC, DI를 활용하여 작성할 수 있는지 명확히 알려주는 해결책이 되었습니다.
이 개념들은 스프링, 객체 지향 언어를 구현하는데에 그대로 사용될 수 있는 것을 알 수 있었습니다. 객체를 사용한다는 것은 로직을 분리한다는 것이고 이는 도메인 분리와도 연결이 될 수 있습니다. 도메인을 분리해야하는 이유는 유지보수를 용이하게 하기 위함이고 또한 테스트코드 작성과도 연관이 있습니다. 이렇듯 이번 프리코스를 통해 배운 모든 개념들이 곧 좋은 코드를 작성하기 위함이라는 것을 깨달을 수 있었습니다.
위 개념들이 개발을 하는데 사용이 됨에 따라 얼마나 많은 장점들을 가져오는지 이해하며 명확히 사용할 수 있도록 앞으로 학습하며 적용해야 한다는 것을 알 수 있었습니다.