지난 2주차에는 미션을 완료하고 나름 뿌듯하여 자신감에 차 있었습니다.
많은 부분을 배워서 적용했고, 생각할 수 있는 선에서 구현할 수 있는 부분은 모두 구현했거든요.
그래서 3주차도 오면 후딱 끝낼 수 있을 줄 알고, 미션이 오면 피드백부터 열심히 공부하기로 했습니다.
하지만 이것은 자만이었습니다...빨리 끝낼 수 있을거라는 건 큰 오산이었습니다....🙄
3주차미션
3주차는 로또를 만드는 미션(링크)이었습니다.
앞서 피드백을 빨리 공부 한다음, 미션을 진행하기로 했습니다.
이번 피드백에는 강의도 있어서 제이슨님이 어떻게 코딩하는지에 대한 부분도 많이 볼 수 있었고, 참고가 되었습니다.
다만 학습 자료는 만료일이 지정되어 있어 최종 코테 전까지 몇 번 더 보고, 뽑아(?) 먹을 수 있는 건 뽑아먹으려고 합니다.
그리고 README를 작성했습니다.
README 작성
이번에는 기능명세를 작성하기 까다로웠습니다.
Lotto라는 클래스가 이미 구현되어 있고, 필드 추가는 불가능 한 채로 이것을 활용해서 구현해야 했기 때문입니다.
Lotto 게임에는 LottoNumber 라는 번호를 만들어야 하는데 필드 추가가 안되니 난감했습니다.
3주차 소감문에도 작성했는데, 마치 손발이 묶인 느낌이었습니다.
.....뭔지 잘 모르겠으니 일단 기능 구현할 걸 생각해서 리드미부터 작성했습니다.
피드백 강의에서 보니 제이슨님은 기능명을 작성하고 옆에 메소드명을 작성하였습니다.
일단 잘하는 분껄 따라해봐야죠... 단 예외사항에 대한 것은 메소드명 적기가 다소 까다로웠습니다.
기능 구현, 그리고 어려웠던 점
1. An illegal reflective access operation has occurred 에러
첫번째 기능인 구매 금액을 입력받는 기능을 만들고, 로또 숫자를 입력받는 기능을 만들 때 발생한 문제입니다.
본 듯 안 본 듯...익숙한듯 익숙하지 않은 저 문구는 저를 반나절 넘게 구글링을 하고 머리를 쥐어 뜯게 만들었습니다.
camp.nextstep.edu.missionutils.Console 에서 제공하는 API에 대한 문제인 것 같은데,
구글링을 해보니 자바 9버전 이상에서 API가 중요 메소드에 접근하는 것을 막아 발생하는 문제인 것 같았습니다.
아니 그럼 첨부터 그냥 되지 말게 하지 두번째에 안되는건 뭐람
그래서 자바 버전을 8로 낮춰봤더니 이번엔 자바 요구사항이 11 이상이라며 실행이 안되네요...
해당 프로젝트는 자바 버전 요구사항이 11 이상이기 때문에 실행이 안되었습니다.
이것 저것 해볼건 다 해보면서 슬랙도 검색하고 하다가
지난주차 미션을 열어서 실행해 봤는데 동일한 에러 메시지가 확인됩니다..?
아까 어디서 봤다 했는데 지난주에 봤었던 거였습니다.
기능이 간단해서 테스트를 통과하니 머릿속에서 지웠었나 봅니다....
저 메시지가 떠도 입력값 입력하면 추가 진행이 됩니다.
잘 진행(?)되니 마음을 가다듬고 다시 기능 구현에 집중하여 진행해 나갔습니다.
2. 테스트코드와의 싸움
바로 다음에서 로또 번호를 받는 기능을 만들려는데 여기서 브레이크가 다시 걸렸습니다.
미션은 최종적으로 ApplicationTest를 통과해야 100점(...?)입니다.
코드 내용을 보니 첫번째 테스트는 정상 출력값 테스트였고, 두번째 테스트는 예외테스트 였습니다.
@Test
void 예외_테스트() {
assertSimpleTest(() -> {
runException("1000j");
assertThat(output()).contains(ERROR_MESSAGE);
});
}
두번째 코드가 이런 코드를 가지고 있었는데,이게 참 수많은 고민을 하게 만들었습니다.
금액 입력값이 int가 아니라 String 값으로 들어오면 에러메시지를 출력했느냐...고 묻고 있는데...
미션 요구사항에 보면
사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 종료한다.
이러한 조건이 있습니다.
그래서 요구사항대로 IllegalArgumentException를 던지면, 테스트코드에서 메시지 출력에 대한 부분을 읽어올 수 없다고 뜹니다. 반대로 try catch 문으로 에러메시지만 출력하면 메시지는 출력되지만 게임이 끝나지 않는 문제가 생겼습니다.
에러 메시지를 출력 후 종료한다라는 것이 로또 게임 자체를 종료하라는 의미인지, 아니면 입력값 받는 부분을 종료하라는 의미인지 다소 애매했습니다.
전자의 의미로 생각한다면 종료시킬 방법이 있는지 검색해보았고 System.exit() 기능이 있었습니다.
하지만 미션 요구사항에 해당기능을 사용하지 말라고 명시되어 있었죠.
후자의 의미로 생각한다면 입력값을 다시 받지 않고 종료한다는 의미인데, 이렇게 하는것이 맞다고 생각하여 이것에 맞게 try catch문만 남겨 놓기로 했습니다.
3. 유효한 값을 받는 방법에 대해 배우다
꾸역꾸역 기능 구현을 진행하고 있다 lotto 클래스를 다시 한 번 들여다보니 굉장히 멋지다고 생각이 되었습니다.
매개변수 값을 받아서, 그 값이 유효한지 확인하고, 유효하다면 인스턴스변수에 집어 넣는 과정이 감탄스러웠습니다.
다만 숫자 개별값이 아니라 로또 리스트 전체에 대한 검증만 있었기 때문에 이를 따라해서 로또 숫자에 대한 검증도 만들어보고자 LottoNumber 클래스를 만들었습니다.
객체지향을 이렇게도 사용할 수 있구나 꽤나 감탄하면서 진행했었습니다...
4. 매개변수 타입에도 다른 값이 들어올 수 있다
열심히 List 값과 int 값을 만들고 메소드에 넣으려는데... 빨간줄이 뜹니다.
덕분에(?) Lotto 타입과 LottoNumber 타입을 메소드에 넣는 방법도 배우게 되었습니다.
5. 보이지 않는 Pull Request
2주차에는 평균 수면시간 5시간에 이틀 정도는 잠을 거의 못잤는데, 이번 3주차에는 4일 정도를 잠을 못 잤습니다.
금요일에 연차를 쓰고 싶었는데 일정이 있어 월요일에 쓰게되면서 더 촉박한 느낌이었죠.
월요일 저녁 쯤이 되어 기능 구현을 최종 성공하고 리팩토링과 컨벤션을 지켰는지, 요구사항은 제대로 확인했는지 모두 다시 점검하고 제출하려고 하는데...제출버튼이 안보입니다.
가운데 Pull Request가 있어야 하는데 안보여서 많이 당황했습니다.
그동안 브랜치에 작성해서 진행했는데 이거 어떻게 해야하지...하고 커밋도 들어가보고 했는데 Pull Request 가 안보이는 겁니다...
어디갔지..Pull Request...
하다가 귀퉁이에서 이걸 발견합니다.
아..
로그인이 안되어있었습니다.
로그인을 하니 Pull Request가 보이네요...하하..혼자 머쓱해하며 PR을 진행했습니다.
미션 제출 완료
git 사용법, stream 사용법 등 배울것이 많다고 느꼈습니다.
특히 List<String>에서 List<Integer>로 변환할 때 구글링을 통해 stream을 사용하긴 했지만 람다식에 대한 이해도 필요하고 Collectors 에 대한 이해도 추가로 필요했습니다.
프리코스 기간에 미션을 하느라 시간을 쪼개서 공부를 하고 있고 이것이 분명 모자라지만...
그래도 성장하고 있음이 느껴집니다.
정말 고통스러운 순간이 많았는데 자바지기 박재성님이 말씀하신 '포기하지 않으면 실력은 오른다'는 말을 굳게 믿고 나아가보려고 합니다. 백번해서 안되면 이백번 하죠 뭐!!
이제 1주일 남았습니다. 마지막까지 최선을 다해야겠습니다.
'성장기록 > 우테코(프리코스)' 카테고리의 다른 글
우아한테크코스 5기 우테코 프리코스 4주차 회고 (0) | 2022.11.24 |
---|---|
프리코스 3주차 공통 피드백 (0) | 2022.11.24 |
프리코스 2주차 공통 피드백 (0) | 2022.11.16 |
2주차 피드백 강의 수강하며 몰랐던 부분 정리 (0) | 2022.11.10 |
우아한테크코스 5기 우테코 프리코스 2주차 회고 (0) | 2022.11.09 |
남에게 설명할 때 비로소 자신의 지식이 된다.
포스팅이 도움되셨다면 하트❤️ 또는 구독👍🏻 부탁드립니다!! 잘못된 정보가 있다면 댓글로 알려주세요.