우아한테크코스 4주차 회고

리브리버·2022년 11월 22일
0

우테코회고

목록 보기
4/4
post-thumbnail

목차

  • 요구사항을 보고 느낀 지금까지의(1, 2, 3주차) 나의 코드
  • 스프링에서 활용되는 3대 개념 (IOC, AOP, PSA)
  • 도메인(역할) 별 코드 분리

4주차 요구사항을 보고 지금까지의(1, 2, 3주차) 나의 코드에 대한 느낀 점

지금까지 구현했던 코드는 4주차의 요구사항들을 보며 절대 좋은 코드가 아니었음을 느꼈습니다.

지금까지 고려하지 못했던 부분은 아래와 같습니다.

  • 메소드의 상태변화를 하지 않는다.
  • PSA, IOC 개념을 활용한다. - BridgeRandomNumberGeneratorBridgeNumberGenerator 등과 같은 예시
  • 도메인(역할)을 나누어 구현한다. (bridge Game에서 inputView, outputView 인스턴스를 생성하지 않는다.)

위와 같이 느낀 이유를 설명해보겠습니다.

첫번째로 이전까지 메소드를 사용할 때 static을 붙여 정적으로 사용하여 객체를 생성하지 않아도 메소드를 사용할 수 있게끔 하였습니다. 그렇게 하다보니 언제 객체를 생성해서 사용해야 하며 객체의 주입, 제어의 역전등의 개념이 왜 필요한지도 이해하기 어려웠습니다. 자바는 객체지향 언어 입니다. 그 특징을 잘 활용해야하지만 자바를 사용하며 객체지향적으로 코드를 구현하였다고 할 수 있습니다.

아래와 같이 static으로 메소드를 생성하지 않고 필요한 부분에서 객체를 생성해보았습니다.

InputView inputView = new InputView();
int BRIDGE_SIZE = inputView.readBridgeSize();

두번째로 BridgeRandomNumberGeneratorBridgeNumberGenerator 를 활용하여 코드를 구현할때 객체 주입을 왜 해야하는지 알 수 있었습니다. 이렇게 구현하게 되면 객체간의 의존성이 적어지고 이는 단위 테스트를 할때 좋은 테스트를 작성할 수 있게 해주기 때문입니다.

만약 랜덤한 수를 생성시 메소드를 사용할 때 BridgeNumberGenerator 인터페이스 없이 BridgeRandomNumberGenerator 구현체를 그대로 받아와서 사용한다면 이후 테스트 케이스를 작성할 때 의존성이 너무 커지기 때문에 단위테스트를 작성하기가 어려워집니다.

여기서 객체지향과 추상화 개념이 사용됨을 알 수 있습니다.

스프링에서 활용되는 3대 개념 (IOC, AOP, PSA)

추상화를 얻는 것을 PSA (portable service abstraction) 라고 합니다.

생성자 주입 BridgeMaker 생성자 에서 구현체인 BridgeRandomNumberGenerator가 아닌 인터페이스 BridgeNumberGenerator를 주입받으므로써 구현체에 의존하지 않고 역할인 인터페이스에 대해 의존적이게 한 것이 요구사항의 포인트라고 생각합니다. 이렇게 되면 해당 클래스는 구현체에 의존적이지 않게 되고 이는 곧 단위테스트를 하기 용이하게 할 수 있다고 생각합니다.

하지만 이 개념들을 코드에 적용시키며 구현하기에는 쉽지 않았습니다.

위 개념은 자동차가 바뀌어도 운전자는 동일하게 운전할 수 있는 것과 같은 원리라고 생각합니다.

의존성에 대해서 자동차와 운전자 예시를 든다면 기존에는 자동차가 바뀌게 되면 각각의 자동차에 의존하고 있으므로 자동차 명을 다 바꿔줬었어야 하지만 위와 같이 역할로 구분하여 구현하게 되면 역할인 인터페이스를 주입받았기 때문에 자동차가 바뀌어도 구현체만 바꾸어주면 되므로 다른 코드에는 아무런 변경 없이 테스트가 가능하게 됩니다.

도메인(역할) 별 코드 분리

세번째로 도메인(역할)을 나누어 구현할 때 Game이라는 클래스를 핵심 비즈니스 로직으로 두고 기타 IO 클래스들(InputView, OutputView)은 핵심 비즈니스 로직과 분리하여 구현하는 것 입니다.

이는 이후 유지보수시 아주 중요한 역할을 합니다.

만약 도메인을 나누지 않는다면 모든 동작들이 어디에 위치하는지 알 수 없으므로 수정할때 매우 곤란해지는 상황이 오게 됩니다.

따라서 처음부터 코드를 작성할때 도메인을 명확히 하여 가독성이 좋고 유지보수를 하기 좋게 코드를 구현해야 함을 알 수 있었습니다.

소감

이번 4주차의 문제 풀어가며

어떻게 하면 객체지향적인 자바 코드를 PSA, IOC, DI를 활용하여 작성할 수 있는지 명확히 알려주는 해결책이 되었습니다.

이 개념들은 스프링, 객체 지향 언어를 구현하는데에 그대로 사용될 수 있는 것을 알 수 있었습니다. 객체를 사용한다는 것은 로직을 분리한다는 것이고 이는 도메인 분리와도 연결이 될 수 있습니다. 도메인을 분리해야하는 이유는 유지보수를 용이하게 하기 위함이고 또한 테스트코드 작성과도 연관이 있습니다. 이렇듯 이번 프리코스를 통해 배운 모든 개념들이 곧 좋은 코드를 작성하기 위함이라는 것을 깨달을 수 있었습니다.

위 개념들이 개발을 하는데 사용이 됨에 따라 얼마나 많은 장점들을 가져오는지 이해하며 명확히 사용할 수 있도록 앞으로 학습하며 적용해야 한다는 것을 알 수 있었습니다.

0개의 댓글