배경지식!
01. 로또는 프리코스때 했었다.
02. 인덴트(깊이)가 하나로 제한되었고, 인수도 2개로 제한되었다. -크게 상관은 없었다.-
03. 1단계는 페어로 이루어져 하나의 컴퓨터로 같이 코드를 짠다.
04. 기간은 총 3일이며 야근도 했다.
05. 하나의 컴퓨터로 돌아가며 진행하며 이번에는 시간을 기준으로 했다.
이번 미션은 이미 해봤던 거라 괜찮을 줄 알았는데 여전히 같이 하는건 에너지가 많이 소모된다.
이전에는 미션이 어떻게 진행되는 지에 대해 적응하는 기간이었다면,
이번에는 생각해보던 것들을 조금이나마 시도해보는 시간이었다.
저번 교육때 말씀하시기로
pr에는 코드 작성에 대한 내용을 담으라고 해서
이번에는 내가 의도한 바와 궁금한 점을 적었다.
아래가 그것이다.
1. 작성 의도
1) mvc패턴에 대한 고민
: 이전 미션까지 따로 constroller를 두지 않고 app에서 주축으로 처리하도록 만들었습니다. 하지만 많은 교육생이 mvc패턴처럼 만드는 것을 보고 이를 이번에 적용하며 고민해보는 시간을 가졌습니다. view에서 input과 output을, controller에 view와 model을 조종하는 로직을 넣고자 하였습니다-지켜지지 않은 부분도 있습니다-. 하지만 아직 controller가 가지는 역할과 view가 가지는 역할의 범위에 대한 개념 정립을 하지 못했습니다.
여러 교육생에게 물어보며 view는 정말 input만 하는 경우도 있었는데, 저는 view에서 유효성검사와 model에서 사용하기 편하게 형 변환하는 정도로 작성하는 게 맞다고 생각했습니다. 하지만 아래 문구를 읽고 제가 생각한 것과 view와 controller, model가 많이 다를 수 있겠다고 생각했습니다. 그래서 혹시 본 미션에서 나눈다면 어떤식으로 나누실지 궁금합니다.
"단순히 데이터를 다른 형태로 나타내기 위해 뷰를 업데이트하고 싶을 수도 있습니다(예를 들면, 항목을 알파벳순서로 정렬한다거나, 가격이 낮은 순서 또는 높은 순서로 정렬). 이런 경우에 컨트롤러는 모델을 업데이트할 필요 없이 바로 처리할 수 있습니다." -MDN-
2) TDD 작성
: TDD를 처음 했습니다. 때문에 시간도 굉장히 많이 들고, 이걸 어떻게 어디까지 해야 하는지 가늠이 되지 않았습니다. 다만, 하면서 훨씬 테스트를 하기에 편한 코드를 작성하게 되었고, 이전에 작성한 테스트 덕분에 예기치 못한 오류를 미리 잡을 수 있다는 것을 느꼈습니다. 아직은 작은 단위 테스트를 위주로 했기 때문에 그나마 쉬웠지만, 조금 더 큰 테스트를 할 때에는 익숙하지 않아 테스트 작성하는 시간이 오래 걸린다고 느껴졌습니다. 이와 별개로 테스트에 대한 사소한 고민이 있습니다. validation 외에는 오류가 발생하는지 테스트를 하고 있지 않습니다. 테스트 내에 들어오는 값은 이미 완벽하다고 가정하고 진행을 하는데 이렇게 하는 것이 맞는지 궁금합니다.
3) 객체 안 변수 밖으로 꺼내지 않기
: 컨트롤러 안에 로또게임 객체를 만들고, 이 안에 로또 객체를 만들었습니다. 가능한 객체 안에 있는 변수들은 그 자체로 내보내기 보다는 밖에서 인수를 받아 처리하고 리턴하도록 작성을 했습니다. 때문에 input값이 들어왔을때 하향식(컨트롤러 - 로또게임 - 로또)으로 넘어가는 느낌이 들었는데, 만약 파일이 커지고 고려해야하는 것들이 많아진다면 이런 하향식이 괜찮은 건지에 대한 생각도 들었습니다. 하나의 객체에 요구하는 것이 많아진다면 그것을 객체 내 각 함수로 구현하여 반환해야 하고, 그렇다면 객체가 너무 무거워지지 않을까 생각이 들기도 했습니다. 혹시 이 부분에 대해서는 괜한 생각일지 궁금합니다.
4) 재사용 가능하도록 만들기
: 최근 재사용이 가능하도록 만드는 것에 대해 고민하고 있습니다. 정말 최근에 접한 개념이라 아직 어딜 어떻게 설정해야 이를 다시 쓸 수 있을지 고려하기 어렵습니다. Validation 중 숫자인지, 구간 내에 위치하는지 확인하는 함수를 여러 곳에 사용하는 부분에서 이를 대충이나마 알 것 같았습니다. 본 미션을 진행하며 로또 번호가 7개라면, 보너스가 없다면, 보너스가 2개라면 등 여러 상황을 가정하고 사용할 수 있게 짜고 싶었지만 잘 구현된 것 같지는 않습니다. 혹시 보시면서 재사용 가능하도록 만들 수 있거나 함수가 여러개 들어가 분리가 필요한 부분이 있다면 말씀 부탁드립니다. 더불어 한가지 궁금증은 재사용을 고려하여 함수를 짜다보면 기준이 되는 상수-validation에서 구간 내에 위치하는 지 확인하는 함수에서 기준점- 같은 것들이 인수로 들어가게 만들어야 하고, 그렇다면 너무 인수가 많아지지 않을까 생각이 듭니다. 그런 경우 재사용이 어려운 함수로 생각하고 짜야하는 것인지, 혹은 제가 잘못짜서 그렇게 된 건지, 혹은 그렇다고 하더라도 재사용성이 높은 함수가 좋은건지 궁금합니다.
-
2. 기타 고려한 부분
1) 반복문을 지양하기 위해 for반복문을 없애고자 했습니다. fo반복문을 지양하는 것이 변수가 자칫 잘못 설정되어 문제가 발생하는 것 등을 방지하거나 혹은 가독성을 높이기 위함이라고 알고있습니다. 혹시 else나 반복문 외에도 여타 이유로 지양되는 행동이 있는지 궁금합니다.
2) callback 대신 promise/async/await를 사용했습니다.
그렇담 얼마나 성취했을까?
📍 학습 목표 성취도
- UI와 도메인 영역을 분리할 수 있는 설계를 고민해보고, 목적에 맞게 객체와 함수를 활용 : mvc를 하며 지금 중 제일 분리를 해봄
- 단위 테스트 기반으로 점진적인 리팩터링 : TDD를 해봤는데 5할정도는 이루지 못한 것 같음..
추가적으로 어려웠던 점을 이야기하자면..
1. 나는 생각보다 보수적인가?
> 하나의 기능을 구현하기 위한 방법은 무수히 많다. 정말 단순하게 별찍기 하나에도 for문을 쓸 수 있고, forEach을 쓸수도 있을거고, 하드코딩을 할수도 있을 것이다. 나는 하나의 방법을 알면 그것만 쓰는 것같다. "돌아가기만 하면 된다"는 식의 마음이 있었던거같은데, 기능은 하니 새로운 것을 꼭 써야하는지에 대한 거부감이 있었던 것 같다.
예시로, for반복문을 자제하자는 파트너의 이야기에 "이 상황에서는 for 반복문을 쓸 수밖에 없지 않을까요?"하고 그냥 두기를 원했다. 그렇게 찾아본 것에는 왜 반복문을 자제하라는지 이유가 나와져 있었고 나도 납득이 가는 내용이었다. 더불어 callback 사용법을 어느정도 익힌 상태에서 파트너가 새롭게 async/await를 해보자고 했을 때에도 시큰둥하게 느껴졌다. 마감이 촉박하다는 마음에서 이미 알고 있는 방법을 쓰자는 마음이 만들어진것도 같다. 아무튼 결과적으로는 모두 적용을 해봤고, 나도 그 결과에 만족했다. 내가 혼자 했다면 이걸 시도하고자 하지 않았겠지 싶다. 그래서 더 경각심을 가지고 찾아봐야겠다고 생각했다.
2. 새로운 것을 배우는 것
새로운 것을 많이 배우다보니 멍하게 느껴지기도 한다. 일이 많이 쌓인 사람이 호들갑을 떨기보단 멍때리며 가만히 있는다는데, 그것처럼 멍하게 사고가 정지하는 기분이 들고는 한다. TDD도 처음해보면서 그래서 어디서부터 해야 하는지 고민이 되었고, 공부를 하기엔 코드를 바로 짜야했다. 결국 뭔가 공부하는 시간보단 코드를 쓰는 시간이 많은데 그러다보면 늘기는 늘지만 이게 맞는지에 대한 고민도 많이 들게 된다. 1단계가 끝났으니 내가 쓴 코드, 남이 쓴 코드를 보고 개념에 대해 찾아볼 시간을 가져보아야 겠다.
그 외 이야기..
1. 어디까지 재사용 가능하게 만들어야 하는가
> 재사용에 대한 의문은 여전하다. 익숙하지 않아서 더 그런가보다. 위에서 언급한 것처럼 로또번호 갯수가 7개가 되거나, 범위가 달라지거나, 보너스를 2개 뽑는다거나 하면 코드의 많은 부분을 수정해야 할 것이다. 때문에 기능별로 최대한 분리하고자 하는 것임을 이제야 조금 이해가 가기도 한다.
'2022우아한형제들_우테코' 카테고리의 다른 글
[우테코] 어쩌다 면담 (0) | 2023.02.24 |
---|---|
[우테코] Lv. 1 로또 구현 - 2단계(웹) 1차 PR 후기 (1) | 2023.02.24 |
[ 우테코 ] Lv. 1 자동차 경주 구현 - 2단계(리팩토링) 후기 (0) | 2023.02.13 |
[우테코] Lv. 1 자동차 경주 구현 - 1단계(페어) 후기 (0) | 2023.02.09 |
[우테코] 최종 지원 결과, 합격 (0) | 2022.12.29 |