프리코스 1주 차를 마치고 1주 차후기 및 공부한 내용을 적어보려고 한다.
1주 차 과제를 하면서도 나머지 사람들의 코드를 볼 때도 나는 아직 병아리에 불과하고
나보다 뛰어난 사람이 많다는 것을 알 수 있었다.
다른 사람들의 코드를 볼 때 이렇게도 만들 수 있구나라고 생각하고
나는 아직 부족하구나 좌절했었지만 그 코드들도 모두 흡수해서 더욱 발전해야겠다는 생각이 들었다.
공통 피드백
1. 요구사항을 정확히 준수한다.
먼저 나는 요구사항부터 제대로 읽지 않고 기능을 만들었다. 야구게임을 만들어 본 적이 있기 때문에
이 정도는 쉽지 라는 생각에 먼저 기능정의서만 대충 메모장에 적어 넣고 기능을 만들었다.
그리고 과제제출 하기 전에 빠진 게 있나 과제내용을 확인을 했는데
과제 진행 요구 사항에 기능을 구현하기 전 docs/README.md에 구현할 기능 목록을 정리해 추가한다.
라는 글을 보고 제출하기 전에 부랴부랴 기능정의서를 다시 적어서 README를 작성했다.
요구사항이 어찌 보면 가장 중요한 내용인데도 불과하고 요구사항을 제대로 보지 않고 만들었다는 것이다.
이일을 잊지 말고 다음에는 요구사항을 정확히 파악하자.
2. PR을 한번 작성했다면 닫지 말고 추가 커밋을 한다.
이 부분을 몰랐던 부분인데 PR을 한번 하면 새로운 PR을 생성할 필요 없이 수정을 한다면
추가 커밋을 하면 자동으로 반영이 된다는 것이다.
과제 제출을 하고 한 가지 수정할 점이 있어서 다시 push후 PR을 하러 들어갔을 때 이미 반영이 되어있는 상태
였기 때문에 왜 PR을 하지 않았는데 자동으로 수정한 내용이 들어가 있지? 생각을 했는데 이러한 이유가 있음을 알게 되었다.
3. 축약하지 않는다. 이름을 통해 의도를 드러낸다.
나는 항상 변수이름과 함수이름 이름 짓는 거에 항상 많은 시간을 보내곤 한다. 이름을 통해 그 함수나 변수의 역할을 알 수 있게 하는 것이 좋다고 생각한다.
이름 짓기에 항상 고민이 많은데 이번에는 함수 이름을 지을 때 나는 의도를 알 수 있게 이름을 지었다고 생각했지만 다른 사람들에게는 그렇지 않다는 걸 알게 되었다.
함수나 변수의 이름이 길어지는 것이 싫었기 때문에 짧게 이 함수의 기능을 알 수 있게 짓고 했는데 다른 사람들에게는
무슨 역할인지 헷갈리수도 있다고 생각이 됐다. 피드백내용에선 의도를 드러낼 수 있다면 이름이 길어져도 괜찮다.
라는 내용이 있다.
하지만 객체 지향 생활 체조 원칙 5: 줄여 쓰지 않는다.(축약금지)라는 걸 알게 되었고 다음부턴 이름이 길더라도
기능의 역할이 뭔지 한 번에 알 수 있게 이름을 짓도록 하자.
4. 자바에서 제공하는 API을 적극 활용, 배열대신 Java Collection을사용한다.
배열대신 Java Collection을 사용하라는 건 옛날부터 학원에서 LIst나 Map 등등 Collection을 사용하라는 것을 알고 있었기에 요번에도 기능구현을 할 때 배열대신 List를 사용했지만 Map은 사용하지 않았다.
중복값을 제거하기 위해 HashSet과 List를 사용했는데 다른 사람들의 코드들을 보면 내가 Collection을 사용하지 않고 만든 기능을 Map을 사용해서 간단하게 만들었던 부분들을 보았다. 다음 기능부터는 Collection을 더욱 사용해서 코드를 클린 하게 만들어야겠다.
몰랐었던 부분
1. 변하지 않는 것 관리
항상 문자를 출력해야 할 때 System.out.print("출력") 이런 식으로 출력하곤 했다.
하지만 다른사람들의 코드들을 보면서 변하지 않는 값은 변수로 선언하여 관리하는 걸 알았다.
그래서 왜 이렇게 선언하는 거지 찾아보니깐 여러 가지 이유가 있었다.
문자열을 변수로 관리하는 이유는 코드의 가독성, 유지보수성, 재사용성을 향상하고 실수를 줄이기 위해라고 한다.
1. 문자열을 직접 사용하는것보다 변수이름을 사용하며 코드의 의도를 명확하게 전달할 수 있고 변수 이름으로 어떤 정보가 저장되는지 알 수가 있다.
2. 문자열을 변수로 관리하면 한 곳에서만 수정하면 되므로 코드의 변경이 용이해진다. 만약에 여러 곳에 같은 문자열 있다면
변경사항을 모든 곳에서 일일이 찾아 수정해야 하므로 오류 가능성이 높아진다.
3. 재사용성 동일한 문자열을 여러 곳에서 사용해야 하는 경우 변수를 통해 중복코드를 제거하고
문자열을 쉽게 재사용할 수 있다.
이러한 이유로 변하지 않는 것들을 변수로 관리한다. 이걸 알고 내 코드에 적용시켰을 때 더욱 코드가 간결했졌고 수정도 편해진다는 것을 알게 되었다.
내 코드
private static final String INPUT_NUMBER = "숫자를 입력해주세요 : ";
private static final String INPUT_NUMBER_LENGTH_EXCEPTION = "입력하는 수는 3자리여야합니다.";
private static final String INPUT_NUMBER_CONTAIN_EXCEPTION = "1~9까지의 수를 입력해주세요.";
private static final String INPUT_NUMBER_DUPLICATE_EXCEPTION = "입력하는 수는 서로 다른 수여야합니다.";
private static final String RESET_GAME_MESSAGE = "게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.";
private static final int INPUT_NUMBER_LENGTH = 3;
private static final String INPUT_NUMBER_TYPE = "^[1-9]*$";
2. 디자인 패턴
예전에 야구게임을 만들 때는 그냥 하나의 클래스 여러 개의 함수들을 모아두고 야구게임을 만들었었지만
이전에 알고 있던 MVC 패턴을 적용해서 만들어보자고 생각했다.
하지만 MVC패턴은 그냥 겉만 알고 있었기 때문에 더 알아보고 적용해 보기로 했다.
찾아보던 중 우아한 테크 MVC패턴 리뷰라는 글을 보고 많은 도움이 되었다.
우아한 테크 -MVC 패턴 리뷰- [레이어, MVC 패턴, 5레이어]
발표자료들 범블비(2020) : MVC 패턴에 대한 설명 + MVC 패턴의 역사 제리(2021) : MVC 패턴의 활용성에 대한 원칙 해리&션(2019) : MVC의 Model, Controller, View에 대한 소개. 제이임(2019)의 MVC 패턴 : 미션과 관
murphymoon.tistory.com
나는 일단 3개로 나눠서 기능을 만들었다.
Model : 플레이어 와 컴퓨터 객체의 점수 데이터
View : 입력을 처리하는, 출력을 처리하는 기능
Controller : 게임 관련 로직을 처리하는 기능
패키지와 클래스는 이런 식으로 만들었다.
BaseballController : 게임의 전체적인 로직을 담고 있는 클래스다.
Random : 중복되지 않는 랜덤한수를 만들어내는 클래스다.
Number : 사용자가 입력한 수와 컴퓨터가 입력한수 저장하는 객체이다.
InputView : 사용자의 입력을 받는 클래스이다. 입력 시 예외처리도 이곳에서 한다.
OutView : 사용자에게 출력해 주는 클래스다.
일단은 이런 식으로 만들었는데 만들면서 Controller의 함수가 너무 많은 게 느껴지긴 했지만 어떻게 해야 하는지 방법을 몰라 일단 기능을 완성했다.
추후 다른 사람들의 코드를 보면서 Service 계층을 추가해서 로직 부분을 관리한다고 한다.
컨트롤러가 많은 역할을 담당하는 것을 느껴본 입장에서 서비스를 왜 사용하는지 알게 되었다. 이후부터는 Service를 적극 사용해서 만들어보자.
3. TDD
먼저 야구게임을 fork 하자마자 보이는 게 test였다. test패키지는 무엇을 하는 패키지이지? test클래스는 어떤 클래스지?
전혀 TDD에 대해 모르는 상태였다. 그래서 TDD에 대한 지식을 쌓고 개발을 했어야 했지만
기능부터 만들고 나중에 찾아보자 라는 생각을 가졌었다.. 그리고 기능을 만들고 찾아보고 나서야
이게 테스트 코드를 먼저 작성해서 프로그램이 잘못되었음을 증명하고 잘못된 부분을 수정해서
최종 목표에 부합할 만큼 참으로 만드는 법이라는 걸 알게 되었다.
TDD에 관한 것 이 글을 참고했다.
https://frozenpond.tistory.com/149
[개발상식] tdd란 (tdd 예제, tdd하는법)
1. tdd란 test driven development의 약자로 테스트코드를 작성하여 프로그램이 잘못되었음을 증명하고, 잘못된 부분을 수정하여 목표에 부합할 만큼 참으로 만드는 개발 방법론입니다. 최종적으로 올
frozenpond.tistory.com
TDD에 대해서는 겉정도는 알게 되었지만 시간이 많이 부족했던 탓에.. 개인으로 테스트코드를 만들지를 못했다.
그나마 몇 개 추가한 거라곤 입력 길이테스트 예외테스트 중복값 테스트 정도였다.
void 길이_테스트() {
assertSimpleTest(() ->
assertThatThrownBy(() -> InputView.validationNumber("12"))
.isInstanceOf(IllegalArgumentException.class)
);
}
@Test
void 입력_예외_테스트() {
assertSimpleTest(() ->
assertThatThrownBy(() -> InputView.validationNumber("as1"))
.isInstanceOf(IllegalArgumentException.class)
);
}
@Test
void 중복_값_예외_테스트() {
assertSimpleTest(() ->
assertThatThrownBy(() -> InputView.validationNumber("112"))
.isInstanceOf(IllegalArgumentException.class)
);
}
좀 더 TDD에 대해 공부해서 다음에는 TDD를 먼저 만들고 나서 기능을 구현해야겠다.
링크
https://github.com/inhoru/java-baseball-6/tree/inhoru
GitHub - inhoru/java-baseball-6
Contribute to inhoru/java-baseball-6 development by creating an account on GitHub.
github.com
우아한 테크 -MVC 패턴 리뷰- [레이어, MVC 패턴, 5레이어]
발표자료들 범블비(2020) : MVC 패턴에 대한 설명 + MVC 패턴의 역사 제리(2021) : MVC 패턴의 활용성에 대한 원칙 해리&션(2019) : MVC의 Model, Controller, View에 대한 소개. 제이임(2019)의 MVC 패턴 : 미션과 관
murphymoon.tistory.com
https://frozenpond.tistory.com/149
[개발상식] tdd란 (tdd 예제, tdd하는법)
1. tdd란 test driven development의 약자로 테스트코드를 작성하여 프로그램이 잘못되었음을 증명하고, 잘못된 부분을 수정하여 목표에 부합할 만큼 참으로 만드는 개발 방법론입니다. 최종적으로 올
frozenpond.tistory.com
'우테코' 카테고리의 다른 글
우아한테크코스 프리코스 4주차 후기 (0) | 2023.11.27 |
---|---|
우아한테크코스 프리코스 3주차 후기 (0) | 2023.11.11 |
우아한테크코스 프리코스 2주차 후기 (0) | 2023.11.10 |