우아한 테크코스 6기 프리코스 1주차 회고

정훈·2023년 10월 26일
0

우테코

목록 보기
3/8

지원하기 전

우테코 5기가 시작 할때부터 많은 관심을 갖고 있었다. 지원을 하고싶었지만 그 당시 내 스스로가 5기 프리코스 문제들을 보고 주저없이 포기했었던 것 같다. 지금와서 생각해보면 왜 누가 혼내는 것도 아닌데 '난 안되겠네'라는 마음 속 외침과 동시에 한번 해보고싶은 생각은 들었지만 너무 두려웠다. 하지만 며칠 지나고나서 후회하기 시작했다.

조금이라도 우테코 취지에 조금 알아 볼 껄 그리고 설명회라도 들어볼껄..
왜 해보지도 않고 무턱대고 안된다는 생각부터 한 내 자신이 한심했지만 요번 6기에 참여하면서 자신감,기록하는 습관 그리고 내 스스로가 얼마만큼 멀리 볼 수 있는가 등 성장 하고싶어서 지원하게되었다.

1주차 미션 야구게임

https://github.com/jhva/java-baseball-6

1주차 미션의 야구게임은 구현 할 때 만큼은 그렇게 어렵지는 않았다. 최소한으로 1주차때 프로그래밍 요구사항,그리고 ,README/docs 기능 목록 작성 후 기능구현,객체지향 9가지원칙 등 하면서 이 세가지를 완벽하게 하진 못하더라도 최대한 노력했었던 것 같다. 굳이 요란하게 뭘 하고싶지 않았다. 내 스스로 코드를 보며 고민하고,배워보고, 온전히 프리코스를 느끼고 싶어서 하나하나 의미를 부여가며 시작하고 싶었다. 그래서 세가지의 목표가 결국 내 스스로에도 많은 문제가 있었기 때문에 이를 목표로 잡았다.

프로그래밍 요구사항

- JDK 17 버전에서 실행 가능해야 한다. JDK 17에서 정상적으로 동작하지 않을 경우 0점 처리한다.
- 프로그램 실행의 시작점은 Application의 main()이다.
- build.gradle 파일을 변경할 수 없고, 외부 라이브러리를 사용하지 않는다.
- Java 코드 컨벤션 가이드를 준수하며 프로그래밍한다.
- 프로그램 종료 시 System.exit()를 호출하지 않는다.
- 프로그램 구현이 완료되면 ApplicationTest의 모든 테스트가 성공해야 한다. 테스트가 실패할 경우 0점 처리한다.
- 프로그래밍 요구 사항에서 달리 명시하지 않는 한 파일, 패키지 이름을 수정하거나 이동하지 않는다.

위 요구사항들을 지키기위해 자바 코드 컨밴션 적용,JDK 17 버전 설정한 부분을 기록하고 적용하였다.
https://velog.io/@jhva/Intelij-Java-Style-Guide-%EC%A0%81%EC%9A%A9%EA%B8%B0-%EB%B0%8F-JDK-17
https://velog.io/@jhva/JDK-17-%EA%B8%B0%EB%8A%A5
기존 JDK 11을 사용하면서 JDK17 버전에 추가 된 메서드 등도 모르고 프로젝트나 여러 코드를 칠때 JDK17을 사용했었던 적이 있었지만 문서를 참고하면서 새로운 메서드들도 많이 알게되었지만 특히 Helpful NullPointerExceptions이 인상 깊었다. 기존에는 어떤 변수가 null을 가지고 있는지 알기위해서 맨날 디버거를 통해 알아왔지만 이제는 발생한 위치,어떤 필드에 null 이 들어가있는지 메세지로 보여주기때문에 정말 보기 좋았다.

README/docs 기능 목록 작성 후 기능구현

1. 게임 제어 기능

  • 게임시작 -> 랜덤 값 생성 -> 입력 -> 출력 -> 결과과정을 통해 게임을 진행한다.

게임시작

  • BaseBallGame 클래스 start메서드를 통해 게임 진행
  • BaseBallGame 클래스 stop 메서드를 통해 첫 게임 이후 진행 혹은 게임을 종료
  • Computer 클래스 randomGenerator() 메서드를 통해 랜덤값 3자리수를 얻는다.
  • MessageUtils 클래스를 통해 상황에 맞는 메세지 생성
    1. 게임 시작시 숫자 야구 게임을 시작합니다.
    2. 시작 이후 사용자 입력 숫자를 입력해주세요

랜덤 값 생성

  • camp.nextstep.edu.missionutils.pickNumberInRange() 라이브러리를 통해 3자리의 숫자 생성
    • 서로 다른 수 의 1 ~ 9 범위에 대한 3자리 숫자 생성
      • 서로 다른 수 중복 처리

입력

  • InptuView 클래스를 통해 사용자 입력을 받는 printUserInputView() 메서드 생성
    • 서로 다른 수 의 1 ~ 9 범위에 대한 3자리 숫자 생성
      • 중복 예외 처리 중복된 숫자를 입력할 수 없습니다.
      • 3자리 숫자 예외 처리 3자리 숫자를 입력해주세요.
      • 0 일 경우 1 ~ 9 사이 숫자만 입력해주세요.
      • 숫자가 아닐 경우 1 ~ 9 사이 숫자만 입력해주세요.

출력

  • MessageUtils 클래스를 통해 맨 처음 게임 시작시 생성했던 랜덤값을 통해 힌트를 출력한다.
    1. 랜덤 값이 123, 입력 받은 값이 145 일 경우 1스트라이크 메세지 출력
    2. 랜덤 값이 123, 입력 받은 값이 134 일 경우 1볼 1스트라이크 메세지 출력
    3. 랜덤 값이 123, 입력 받은 값이 972 일 경우 낫싱 메세지 출력

결과

  • 컴퓨터가 생성한 랜덤값을 맞추었을경우 MessageUtils 클래스를 통해 메세지 출력
    • 3스트라이크 이후
    • 3개의 숫자를 모두 맞히셨습니다! 게임 종료
    • 게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.
      • 게임시작 1, 종료2번 를 입력으로 받는다.
      • 1 번을 입력했을 경우 입력 단계로 돌아간다.
        • 이후 입력 -> 출력 -> 결과 과정을 똑같이 거친다.

위 기능 목록은 과제진행 요구 사항 중 하나였다. 원래 알고리즘 풀때나 프로젝트를 할때나 무턱대고 정리 하지 않고 바로 코드치고 그랬었는데 한번 이렇게하고 천천히 따라가니까 되게 기능에만 온전히 집중 할 수 있었던 것 같았다.

객체지향 9가지원칙

최대한 객체지향 9가지원칙을 수행할려고 노력하였다.

1. 한 메서드에서 한 단계 들여쓰기만 사용하자
2. else 예약어를 쓰지 말자
3. 모든 원시값과 문자열을 포장하자
4. 일급 컬렉션을 사용하자
5. 한줄에 한개의 점만 사용하자
6. 축약하지 말자
7. 모든 엔티티를 작게 유지하자
8. 클래스는 변수 두개를 넘지 않게 하자
9. Getter / Setter / Properties를 사용하지 말자 

어떤 프로젝트나,따로 공부를 위해 코드를 칠때 단 한번도 위 9가지 원칙을 지켜본적이 한번도 없었던 것 같았다. 그렇기 때문에 조금 더 집중 있게 했었던 것 같다. 특히 1번째 원칙과 2번째 원칙을 지키면서 하다보니 저절로 메서드 분리가 되었던 것 같다.중복되는부분 이라던가,하나라도 분리를 위해 노력하다보니 잘게 분리를 할 수 있었다.


하지만 위 사진을 보면 InputView,OutView 클래스를 나누어 각 클래스가 갖는 책임을 한 가지씩 갖고 설계하는것도 하나의 방법이였던 것 같았다. 왜냐면 각 메서드들은 다른 InputView로 만을 사용하고있었는데 다른곳에서도 유용하고 쓰이고 있었다..^^ 지금 생각해보면 너무 생각없던 것 같다. 그나마 잘한거라고 생각한거는 매직넘버 상수화..또는 상수로 쓰이는 부분들 분리..정도? (아닌 것 같다..)

특히4번은 처음 알게되었다..일급 컬렉션..컬렉션에서 나오는 불변.. 특히 불변의 이유가 너무나도 궁금했고, 그렇게 계속 궁금증의 Depth가 깊어져 갑자기 문득 캡슐화를 지키는 이유가 궁금해졌다.
이러한 생각을 토대로 나 역시 또는 누군가 이 글을 읽은 사람도 느꼈을 것 같다. 객체지향에 대해서 잘 모르는게 아닌가 ? 사실 자바라는 언어에 대해서 어떻게 쓰이는지만 알지, 나는 객체를 제대로 알고있는 듯한 기분은 안들었다.

미션 피드백을 통해 느낀점

1. 요구사항을 정확히 준수한다
2. 커밋 메시지를 의미 있게 작성한다
3. git을 통해 관리할 자원에 대해서도 고려한다
4. Pull Request를 보내기 전 브랜치를 확인한다
5. PR을 한 번 작성했다면 닫지 말고 추가 커밋을 한다
6. 이름을 통해 의도를 드러낸다
7. 축약하지 않는다
8. 공백도 코딩 컨벤션이다
9. 공백 라인을 의미 있게 사용한다
10. space와 tab을 혼용하지 않는다
11. 의미 없는 주석을 달지 않는다
13. 모든 변수와 함수에 주석을 달기보다 가능하면 이름을 통해 의도를 드러내고, 의도를 드러내기 힘든 경우 주석을 다는 연습을 한다.
14. IDE의 코드 자동 정렬 기능을 활용한다
15. IDE의 코드 자동 정렬 기능을 사용하면 더 깔끔한 코드를 볼 수 있다.
	IntelliJ IDEA: ⌥⌘L, Ctrl+Alt+L
	Eclipse: ⇧⌘F, Ctrl+Shift+F
16.Java에서 제공하는 API를 적극 활용한다
17. 배열 대신 Java Collection을 사용한다. 

커밋 메시지를 의미 있게 작성한다.


AngularJS Commit Message Conventions을 지킬려고 노력하고 깃모지도 써가며 커밋 기록을 남겼다.
하지만 다시보니 뭐 error msg , add MessageFormatter 등등 어떤 기능인지 type을 통해 알 수 있었지만 단순히 body 메세지로만 봤을땐 중구난방 그냥 뭐 나만 알 수 있는 커밋 내용인 것 같아서, 문제가 있다고 판단하였고 1주차 피드백 숫자 야구 피드백 강의 영상을 보고나서 커밋할때 <scope>를 넣어서 하니까 대체로 알아보기 좋았던 것 같았다. 그리고 ...영어쓰지말자.....한국말쓰자...ㅋㅋㅋ

feat(OOclass): OO OO 기능 

변수명 메서드명...의미있게 전달할려고 노력하지만 진짜 너무 어려운 것 같다..

2주차 땐 조금 더 신중하게 작성해야겠다.

공백 라인을 의미 있게 사용한다

InputView 안에 printToInputView같은 메서드 경우에 굳이 띄웠어야 했나 싶은 생각이든다..
의미있게 사용 할 수 있도록 노력해야겠다.

느낀점

객체지향적으로 생각하고 설계하고 문제 풀어보기

그냥 단순히 문제에 대한 구현에 의의를 두며 최대한 프로그래밍 요구사항 진행 요구 사항등 맞추면서 했는데 딱 거기까지였다. 더 이상 앞을 보지 않았던 것 같다. 어떻게 하면 잘게 나눌까? 어떻게하면 else를 더안쓰지? 어떻게하면 메서드의 네이밍을보고 무슨 역할을 하는지 짐작 갈 수 있을까 라는 생각만 주구 장창 하다보니 문제에 대해 구현만 했을뿐 뭔가 아무것도 지켜지지 않은 기분이 들었다.
이후 기능 구현 한 사람들의 PR을 보고 일급 컬렉션, MVC 패턴, SOLID 원칙등 알고는 있었지만 그렇게 하지 못했다.. 특히나 MVC 패턴 같은 경우엔 프로젝트를 진행하면서 적용도 많이 해왔는데, 막상 도입을 할려하다보니 어떻게 시작해야할지 모든 부분에서 그냥 감이 안왔다.. 많이 학습하고 공부해서 기록해 놓아야겠다.

요번 계기를통해 솔직히 클린 코드를 읽고싶지만..현재 수중에 가지고 있는 건 클린 아키텍처 책이기 때문에 꾸준히 짬 날때마다 읽고 기록하고 정리하는 습관을 들이면 도움이 되지않을까 생각이 든다. 2주차,3주차에는 더 나은 내가 되었으면 좋겠다.

https://github.com/jhva/Clean-Architecture

예상보다.

처음 내가 목표로 잡았던 부분만큼은 잘하고 싶었는데 그 마저도 못했다..비록 문제는 풀었지만..
회고를 통해서 조금 반성도 하게되고 더 자극받아 더 열심히 해야겠다는 걸 느꼈고, 이것저것 새로운 것 혹은 부족했던 부분을 배우고 공부하면 성장 할 수 있을 것 같다는 생각에 쓰는 내내 좋았던 것 같다. 내가 몸소 부족한게 뭔지. 뭐가 필요한지. 느끼면서 공부 하게되면 성장 할 수 있지 않을까 생각된다. 최대의 목표는 배우고 기록하는 것을 귀찮아하지말고 최대한 정리 해보는 걸 습관 들여보자

0개의 댓글