우아한 테크 코스 6기 - 프리코스 2주 차
부제 : 마지막까지 ㅎ..하얗게 불태웠다.........(파사삭)
두둥근해가 떴습니다 자리에서 일어나서~과제를 확인해야지
다행이 죽지 않고 돌아온 2주 차 회고 타임
어째서 2주 차 미션은 이전 기수와 다른 문제죠.. 4기까지 풀어봤어야 했나봐 흑흑모래모래자갈자갈
확실히 지난 주 미션보다 어렵다고 느껴지긴했지만 그래도 생각보다 풀만한데?라고 생각이 들었다.
자자 이번주도 화이팅 가 보 자 고 !
과제 시작
마음의 준비가 덜 됐던 건가요. 왜 시작도 안했는데 발등에 불이 붙어있죠..
일단 저번 미션을 끝내자마자 세운 목표가 있었다.
>>프리코스 끝나기 전 까지 MVC 패턴과 비즈니스 로직 뿌수기<<
무조건 MVC 패턴을 쓰고 비즈니스 로직대로 구성하는게 좋은건 아니지만 패턴에 대해 무지했던 나는 하나의 패턴정도는 자유자재로 사용할 수 있는 능력치를 키워보고싶었다!
그래서 MVC 패턴부터 공부를 하기 시작했다.
의도치 않게 과제 구현보다 과제하기 전 공부시간에 더 많은 노력을 투자하게되었다. 아래의 소감문에서도 나오겠지만 MVC 패턴과 비즈니스 로직에 대해 구글링으로 검색해보면 너어무 기초적으로 기본 개념과 뜻에 대해서만 나오거나 밑도 끝도 없이 까만건 글자요 하얀건 ㅈ,,아니 바탕이로다 할정도로 어려운 설명이었다. 내가 원하는 지식을 습득할 수 없다는 이야기다.
공부에 난항을 겪던 중 테코톡 영상을 찾아보게 되었고 그곳에서 해답을 찾았다!
뭔가 선배들한테 과외받은 느낌 막 이래~ 크킄크킄ㅋ
테스트 코드에 대해서도 공부할 때 이전 기수 선배들의 회고록과 공부 기록을 참고하니 너무나도 많은 도움이 되었다.
특히 테스트 코드를 짤 때 java.util.NoSuchElementException: No line found 에러를 만났을 때 아래의 글에서 힌트를 얻고 문제를 해결할 수 있었다. 혹시 나와 비슷한 문제를 겪는다면 읽어보시길..
우아한 테크코스 프리코스 4주차 회고
프리코스 기간동안 빠른 성장을 할 수 있었던 이유를 딱 한가지만 뽑는다면, 저는 많은 사람들과의 피드백과 코드리뷰를 뽑겠습니다.처음에는 새로운 과제에서 우수한 성적을 받는데에 신경을
velog.io
이번에는 기능별 커밋이 과제로 주어져서 이전 글에 올렸던 커밋 메시지 규약 정리글을 참고했다.
정말정말 어이없었던 순간은 소감문엔 작성하지 않았지만 gradle과 intellij...
아무리 기본 테스트와 내가 구현한 테스트 코드를 통과해도 실행 시 잘못된 입력값에 대해 예외가 던져지지 않고 이상한 오류가 뜨면서 종료되었다. 그래서 같이 자바 공부하는 스터디원에게 함께 해결해보려고 했다.
아무리 코드를 씹고 뜯고 맛보고 즐겨도 아니 왜 이게 안되는거냐구요ㅜㅜㅜㅜㅜㅜ
그러던 중 스터디원이 실행 콘솔이 너무 복잡하다고 gradle에서 intellij로 바꾸라고 했다.
..
응?
나 지금 인텔리제이 쓰고 있는데? 이거 프레임워크 인텔리제이 맞는데..?
알고보니 인텔리제이 내에 빌드설정을 의미하는 것이었다.
이와 관련된 정보는 아래 블로그에서 확인하시길!
Build Gradle vs IntelliJ IDEA
작년에 처음 IntelliJ IDEA를 사용하기 시작하면서 이클립스와는 다른 단축키들을 익혔었다. 그 중 하나가 Gradle Project를 Gradle로 빌드 할건지 IntelliJ IDEA로 빌드할 것이지 설정이었다. 처음에는 기본
pamyferret.tistory.com
아무튼! 블로그에서처럼 설정에서 Build and run using과 Run test using을 모두 intellij로 바꾸었다.
그런데
아니
이 게 머 선 1 2 9
.
.
설정만 바꾸었는데 예외 메세지가 너무 이쁘게 나오면서 참하게 종료되는 것이 아닌가..!
ㅇㄴ 돌려줘요 내 6시간....
내가 이것땜에...
과제 제출날까지 끄흡...
과제 결과
2주 차 과제 코드는 아래에!
https://github.com/coenfflOo/java-racingcar-6
GitHub - coenfflOo/java-racingcar-6: 프리코스 2주차 미션
프리코스 2주차 미션. Contribute to coenfflOo/java-racingcar-6 development by creating an account on GitHub.
github.com
우와.. 이번 fork 수는 2.4K pull request 수는 2.3K..
fork만 하고 pull request 못하는 사람이 내가 될 뻔 해쓰어😂
근데 진짜 확실한건 잘 버텨내기만 해도 정말 많이 성장한다는거?
코딩 천재와 코딩 바부팅이를 왔다갔다하면서 엄청 많이 배운다
그런 의미로 3주 차도 죽..이되면 안되고 밥 되게 화이팅해야즤~
- 이번주 소감!
📝 소감
이번 과제는 구현을 하기 위한 과정에 그 어떤 때보다 많은 노력을 기울였습니다. 2주차인데도 벌써 이만큼이나 성장한 제 자신이 놀라울 정도로 더 좋은 구현을 위해 공부하는데에 많은 시간을 투자했습니다. 덕분에 목표로 정한 것들을 모두 지키며 구현할 수 있게 되었습니다. 다음 미션에서 어떤 목표를 정하여 얼마나 발전할 수 있을 지 스스로가 기대가 됩니다!
☻ 잘한 점 & 배운 점 & 알게 된 점
MVC 뿌시기!!
: 드디어 MVC에 대한 감을 잡다~!~!!
- 지난 과제에서 MVC 패턴을 처음 사용해보았습니다. 하지만 Controller의 사용성을 이해하지 못해 Model과 View만 사용하여 MVC 패턴이라고 하기도 애매한 정도였습니다. 그래서 이번엔 미션을 하기 전 MVC 패턴에 대해 깊게 공부를 해야겠다고 다짐했습니다. 처음엔 구글에서 검색해보며 공부를 했는데 MVC 패턴에 대해 기본적인 설명만 있고 제가 알고싶은 부분과는 거리가 있다고 느껴졌습니다. 그래서 유튜브에 테코톡을 검색하게 되었고 이전 기수분들의 MVC 패턴 관련 영상을 모두 보았습니다. 많은 영상 중 제리님의 테코톡 영상이 정말 도움이 많이 되었습니다. MVC가 각각 어떤 역할을 하는 아이들인지는 너무나 잘 아는데 어떤 기능으로, 어떻게 나누어야 하는지 감을 못잡고 있던 상태였습니다. 하지만 테코톡의 ‘Model내부에 controller와 view에 관련된 코드가 있으면 안된다.’, ‘view 내부에 model 코드가 있을 수 있지만 controller 코드는 존재할 수 없다’, ‘controller는 model과 view에 의존해도 된다(코드 존재 가능)’ 라는 내용은 MVC패턴이 왜 필요한지 의문을 가진 저를 완전히 납득시켰습니다. 사용성을 이해하니 어떻게 분류를 시켜야 하고 도메인을 설계해야하는지도 쉽게 느껴졌습니다. MVC 공부를 하면서 비즈니스 로직까지 살짝 건드려 보니 정말 많이 성장한게 체감되었습니다. 지금까지 구현해본 프로젝트 중 가장 만족스럽게 패키지를 분리한 프로젝트였습니다.
객체와 생성자
: 만날때마다 새롭고 어색하고 낯가리게 되는 객체와 생성자
- 코드를 작성하면서 생성자나 필드 값은 항상 생략하고 필요한 메서드만 구현하는 것이 습관이었던 제게, 다른분들의 코드를 보며 객체와 생성자를 살펴보는 과정에서 몇 가지 아쉬움을 느꼈습니다. 쉽게 구현하고자 한다면, 맵 등의 데이터 구조를 사용하여 원하는 기능을 충분히 구현할 수 있겠지만, 객체와 생성자, 필드 값을 사용하여 구현하는 것은 많이 경험해보지 못했습니다. 객체를 정의하고 생성자를 만들어 속성을 초기화하는 연습을 해야겠다는 생각이 들었고 새로운 도전이었습니다. 특히, 생성자가 객체가 생성될 때 호출되며 초기 상태를 설정하는 역할을 한다는 아이디어는 처음에는 어색했습니다. 기본 생성자가 자동으로 생성된다는 점을 알았지만, 이번 기회를 통해 필요한 속성을 가지고 있는 생성자를 직접 정의해보고 싶었습니다. 역시나 미션을 수행하면서 여러 객체를 다루어야 했고, 객체들에서 필요한 값을 설정하고 다른 클래스에서 사용하는 것이 저에게는 꽤 어렵고 혼란스러운 과정이었습니다. 하지만 이전 프로젝트들에서 특정 클래스에 메서드를 생성하고 다른 클래스에서 그 메서드를 가져오는 것과 유사하게 생각하며 이해하려고 노력하는 것이 흥미로운 과정이기도 했습니다. 물론, 아직 구현에서 아쉬운 부분이 많이 보입니다만, 더 많은 연습을 통해 객체와 생성자를 능숙하게 다루고 다양한 상황에 적용하는 데 도움이 될 것이라고 믿습니다.
☺︎ 오류 해결
boolean 값 판단 오류
: ! 하나에 12시간과 ! 하나에 나의 머리카락과 ! 하나에 나의 눈물이
- 모든 입력이 정상적으로 처리되었으면 입력된 횟수가 실행된 횟수와 동일하지 않은 동안 레이싱을 하도록 조건문을 작성하였습니다. 하지만 메서드 명을 isRaceOver이라고 지정했으면서 메서드 내부에 race != this.raceCount를 반환하도록 두었습니다. 다른 클래스에서 코드를 사용할 때 메서드 명만 보고 실행된 횟수가 입력받은 값과 동일해지면 레이싱이 끝나는 메서드라고 생각하여 !isRaceOver를 조건으로 두었습니다. 그러다보니 레이싱자체가 진행되지 않았고 저는 다른 클래스나 메서드의 문제인가 하여 한나절을 꼬박 보내버렸습니다. 계속 코드를 뜯고 고쳐봐도 해결되지 않고 디버깅을 해도 이해가 되지 않아 메서드마다 특정 문자를 출력하도록 하는 코드를 넣어 어디가 문제인지 분석했습니다. 그러다가 조건문 자체에 들어가질 못했다는 것을 깨닫게 되었고 메서드 명의 의미에 맞게 race == this.raceCount로 수정하였더니 바로 해결되었습니다. 이 문제로 12시간 가까이를 머리싸매고 고민하게 정말 너무나도 어이가 없었지만 1주차 피드백에서도 알려주셨듯이 메서드 명이 얼마나 중요한지, 그리고 그 메서드 명에 따라 코드를 구성하는게 왜 중요한지 몸소 느낀 오류였습니다.
테스트 에러 No line found
: 하나는 되고 둘은 안되는 java.util.NoSuchElementException: No line found
- 테스트 코드를 작성하며 가장 힘든 순간 1위였습니다. 테스트 코드에 대해 원리와 문법을 익히는 것은 어렵긴 해도 이해가 되면 재밌었습니다. 새로운 재미를 만나며 ‘역시 나 코딩천재?’라고 생각 될 때쯤 java.util.NoSuchElementException: No line found 에러를 만났습니다. 이 에러를 처음 보았을 때 너무나도 어이가 없었습니다. 분명히 여러개의 테스트 코드를 작성하여 개별 실행을 하면 통과가 되는데 하나의 클래스로 실행을 하면 발생했습니다. System.setIn()을 @AfterEach로 호출하든 각 테스트마다 추가를 하든 해결이 되지 않았습니다. 그렇게 한두시간을 헤매다가 원인부터 제대로 파악하고자 다시 구글링부터 했습니다. 검색해본 결과 Console.readLine() 메소드를 호출할때 입력값이 존재하지 않아서 발생하는 에러라고 했습니다. 그래서 해당 라이브러리에 들어가 보니 Console.readLine() API의 Scanner가 static 변수로 사용되고 있었습니다. 다시 말해, 계속 같은 Scanner를 사용하기 때문에 이전 테스트의 입력버퍼에 남아있던 값들이 다음 테스트에도 영향을 주었습니다. 이전 테스트의 버퍼를 확인해보니 개행이 남아있는것을 확인을 했음으로 이 개행을 제거하여 버퍼를 비워주어야 해결이 될 것같다는 생각을 했습니다. 그래서 @AfterEach의 메서드 내부에 Console.close()를 추가하여 각 테스트마다 Console이 종료되어 새로운 테스트가 실행될 때 새로운 Scanner가 사용될 수 있도록 했습니다. 이 문제를 해결하기 위해 밤새 고뇌의 시간을 겪었지만 테스트를 비롯하여 Console 라이브러리에 대해 스스로 더 깊게 이해하게되었다는 점이 뿌듯했습니다.
☹︎ 아쉬운 점
테스트 코드라는 것을 처음 접해보았기에 일단 테스트 코드에 대해 공부하고 직접 짜보는 것에 급급했습니다. 그러다 보니 왜 테스트 코드가 필요하고 어떤 것들을 위주로 테스트 코드를 짜야하는 지에 대해서는 생각하지 못하고 무분별하게 코드를 작성한 느낌이 있었습니다. 모든 클래스가 다 테스트 코드가 필요한 것은 아닐텐데 너무 코드 작성에만 집중을 하것이 아닌가 하는 아쉬움이 남습니다.
'공log > [WoowaTC]' 카테고리의 다른 글
[우아한 테크 코스] 최종 코딩 테스트 후기 (0) | 2024.01.18 |
---|---|
[우아한 테크 코스] 6기 프리코스 4주차 (0) | 2023.11.16 |
[우아한 테크 코스] 6기 프리코스 3주차 (0) | 2023.11.09 |
[우아한 테크 코스] 6기 프리코스 1주차 (1) | 2023.10.26 |
[우아한 테크 코스] 6기 준비 시작! (0) | 2023.10.19 |