작년에도 프리코스에 참가를 했었습니다.

 

작년과 비교하여 얼마나 발전했는지 궁금해서 이번에 참여해 봤습니다.

 

작년 코드

 

우선 작년에 구현했던 코드 구조부터 한 번 보겠습니다.

https://github.com/Danden1/java-baseball/tree/Danden1

 

GitHub - Danden1/java-baseball: 숫자 야구 게임 미션을 진행하는 저장소

숫자 야구 게임 미션을 진행하는 저장소. Contribute to Danden1/java-baseball development by creating an account on GitHub.

github.com

 

이렇게 분리했었네요.

 

Model에 숫자를 만들고, 유효성을 검사하고 strike가 몇 개인지 판단하는 등 모든 기능이 들어가 있습니다. 이는 확장성에 별로죠.(SRP 위반) 지금 보니까 진짜 대단하네요....

 

이후에 인턴을 하고 공부를 하면서 엄청나게 발전한 것이 느껴집니다.

 

 

 

어떤 점이 발전했을까요?

 

현재 코드

 

그럼 이번에 작성한 코드 구조입니다.

https://github.com/Danden1/java-baseball-6/tree/Danden1

 

GitHub - Danden1/java-baseball-6: 2번 째 참여

2번 째 참여. Contribute to Danden1/java-baseball-6 development by creating an account on GitHub.

github.com

이런 식으로 설계를 했습니다.

 

domain layer

그리고 domain layer부터 한 번 보겠습니다.

저는 도메인을 이렇게 분석했습니다. 숫자야구 결과를 반환해 주는 심판이 있고, 숫자를 생성해 주는 인터페이스가 있습니다. 그리고 숫자 야구 결과에 대한 클래스도 있습니다. 

 

그리고 BaseballNumber를 만들기 위해 의존성 주입을 이용했습니다.

이렇게 함으로써 유연한 코드를 작성할 수 있습니다.

아래는 이를 이용하여 작성한 테스트 코드입니다.

게임 결과를 테스트하는 코드입니다. 의존성 주입을 사용함으로써 단위 테스트가 가능하게 됩니다. 어떻게 숫자를 만드는지는 크게 관심이 없습니다. 그래서 임의로 123을 반환하는 클래스를 만듦으로써 테스트를 쉽게 할 수 있습니다.

 

infra layer

 

infra layer에는 BaseballNumberGenerator 인터페이스를 구현한 구현체가 있습니다.

왜 이를 infra라고 생각을 했냐면, 컴퓨터의 숫자는 랜덤으로 생성할 수도 있고 특정한 패턴을 가지고 생성할 수도 있다고 생각하여 확장성을 고려해서 설계했습니다. 이 부분은 기술적인 부분이라고 생각합니다. 

Type은 Enum으로 USER, COMPUTER 가 있습니다. 나중에 factory를 이용하여 타입에 맞는 해당 객체를 반환하게 됩니다.

이렇게 해당 타입에 맞는 BaseballNumberGenerator를 반환하게 됩니다. 나중에 난이도에 따라서 computer가 생성하는 숫자가 달라진다면, 여기다가 타입(난이도)만 더 추가해 주면 됩니다. 이는 확장을 하기 쉬워집니다.

그리고 싱글톤을 이용함으로써 객체가 생성되는 데에 드는 오버헤드가 줄어듭니다.

 

Computer에 해당하는 테스트 코드입니다.

아쉬운 점은 Baseball의 BASBALL_NUMBER_LEN에 의존적인 부분입니다. 만약 baseball의 len을 변경하게 되면 이는 실패하게 됩니다. 왜냐하면 baseball.size()가 3이라고 이미 가정을 했기 때문입니다. 이 부분이 많이 아쉽네요.

 

사실 BaseballNumberGenerator의 기능만 테스트한다기보다는 실제로 숫자야구가 만들어지는 동작을 테스트하는 경우입니다. 

좋은 코드, 나쁜 코드 책에서는 실제 기능(함수)만 테스트하기보다는 동작을 테스트하라고 합니다. 이는 여러 가지 함수를 거쳐서 실행될 수 있다고 합니다. 이를 고려하면 괜찮다는 생각이 들기도 하네요.

appl layer

이렇게 factory를 이용하여 baseballNumberGenerator를 받아서 숫자를 생성하게 됩니다.

 

presentation layer

service를 이용하여 게임을 실행하게 됩니다.

 

후기

1년 사이에 엄청나게 발전한 것 같습니다. 하지만 아직 부족한 점이 많이 느껴지네요. 너무 기능을 쪼개고 확장성에 초점을 둔 것 같기도 하다는 생각이 듭니다. 그리고 DDD를 이용하고 싶은데 실제로 이렇게 이용하는 것이 맞는지 궁금하네요.

 

DDD에 대해서 공부할 필요성이 있다고 느껴서, 도메인 주도 설계 첫걸음 이라는 책을 사서 현재 공부해보고 있습니다.

 

 

 

다른 분들에게 리뷰를 받아보고 싶어서 글을 올렸었는데, 슬프게도 리뷰해 주시는 분이 안 계시네요.

 

제가 먼저 접근을 해봐야겠습니다.

 

 

좀 더 노력을 해서 1인분 넘게하는 개발자가 되고 싶네요.

반응형

+ Recent posts