Search
Duplicate

2020년 12월 1주차 회고록

정말,,정말 바쁘고, 정신없어서 회고록을 너무 놓치고 늦게 작성한 것 같다.
처음에는 병행이 가능했던 과제들도 시간이 지나며 난이도가 올라가고 연말에 따른 약속들과, 약간의 번아웃과 여러 소식들로 인해 시간이 부족하니 차례대로 놓치게 되는 것 같다.

이번주의 배경음

지금 듣고있는 보사노바 재즈! 역시나 심플한 멜로디에 경쾌해서 집중을 도와주고 멜로디에 빠지지 않게 해준다.

1. 회사

저번주에 이어 이번주까지 이어지는 프로젝트의 QA는 나를 좀먹는것 같다.
어디든 이 내용을 토로하고싶지만, 딱히 말할곳은 없고, 그러다가 회고록시간에 투덜투덜되며 마음의 안식을 약간이나마 얻었지만....
납득이 가는부분들과 가지않는부분들의 콜라보가 계속되고있다.
우선, 납득이 가는부분은 고객사 정책상 개발기에는 제공되지않는 API들에 대한테스트(장바구니,검색엔진, 피부측정결과 등등..) 오픈직전까지 테스트가 힘든상황이였기에 오픈 후에 QA피드백이 오는건 감수할만 하다. 하지만, 바로 납득안가는 부분이 이어지는데, 어째서 이런 부분들에서 생긴 문제가 대부분 문서의 규격과 다른 API Response 값들인것을 내가 다시 고쳐서 맞춰야 하는걸까?
예를들어 피부측정결과에 대한 API 문서에 나와있는 규격은
{ "result":{ 피부측정결과들... }, "detail":{ "mergelist":{ "prd_List":{추천상품들...}, } }, "list":{피부측정일시...} }
JSON
복사
이와같이 되어있어 추천상품이 detail.mergelist.prd_List라는 객체탐색을 했어야 했다면, 오픈되고 확인한 response는 그냥 prd_List의 depth가 1이였다. 규격처럼 3이 아니라!
{ "result":{ 피부측정결과들... }, "detail":{ ... }, "prd_List":{추천상품들...}, "list":{피부측정일시...} }
JSON
복사
이러니 undefined로 안나올 수밖에... 규격이 왜있고 문서가 왜 있는지 모르겠다 ...

2. 데이트

아내는 현재 지방 구석에 있어 격주로 수원역근방에서 반나절정도 데이트하는게 전부다.
그러다보니 부족한시간에 이것저것 노력은 하지만, 수원근방을 벗어나기도 힘들고, 코로나로 함부로 돌아다니기도 힘든상황... 최근에는 사양이 좋은 컴퓨터가 2대씩있는 숙박업소를 찾아 대실해서 음식도 시켜먹고 쉬다가 오는 것 같다.
비용적으로도 생각보다 저렴하다. 대실비용이 대략 3만원대에 음식비용해도 5만원이 넘지 않는데,
돌아다니면서 혹은 피시방에서 데이트를 한다면 결코 더 적게 나오진 않았던 것 같다.
하지만, 내년에 집을 구하면 이런 비용소모도 없을 것으로 생각되어 빨리 시간이 흐르면 좋겠다.

3. TDD, CleanCode with Java

저번주와 이번주의 가장 큰 고비는 역시 현재 진행중인 과정인 nextstep의 TDD, CleanCode with Java다. 시간을 쏟아부어 비교적 빠르게 마지막 미션까지 왔지만, 마지막 미션에서 너무 헤메이고 있다 ㅎㅎ
그리고 무엇보다도 볼링의 규칙과 점수판이 나오는 정확한 룰을 모르니까 피드백에서 코드도 코드지만 룰을 잘 못 이해해서 많은 부분을 뜯어내고 다시 설계해야 할 때는 너무 지쳐서 사실 현재 진행중인 4-3미션인 점수계산을 하는상황까지 넉아웃이 여러번 왔었다. 게다가 일까지 갑자기 몰려오다보니 시간을 쓰기가 더 힘들어지니...
여하튼, 이번주의 피드백과 적용사항 그리고 개선점은 이렇다.
첫 번째, 다형성을 이용한 상태패턴을 사용해보자.
: 현재 볼링게임의 상태(더블,스트라이크,스페어,미스,거터 등)를 Points라는 일급콜렉션안의 Point라는 점수객체에서 점수를 기준으로 판단을 했는데, 이는 Point에서 점수와 더불어 현재 점수의 심볼과 상태까지 체크해야하기에 책임이 과중해진다. 이를 상태패턴을 이용해 책임을 분산해보라는 피드백이였다.
여기서 나는 Symbol 인터페이스를 만들어 공통기능을 명세후 각각의 상태를 담당하는 상태 객체들을 만들어줬다.
그럼 매번 이런 점수를 어떻게 걸맞는 상태객체로 만들어서 반환해줄 수 있을까? 생각을 했고, 스프링 시큐리티에서도 필터등록시 사용하는 책임사슬패턴을 이용해 구현해주기로 했다.
Symbol 객체는 supported라는 메소드를 가지고 있어서 각각이 자신이 해당 값을 지원할 수 있는지 로직을 수행후 그에 합당한 객체일 경우 해당 타입으로 객체를 생성해준다. 이는 ENUM에서 수행해줬고, 이를 통해 좀 더 책임을 분산시켜줄 수 있었다.
두 번째, 커서필드를 이용한 링크드리스트의 검색량 축소
나는 볼링게임에서 10개의 프레임을 각각 어떻게 모아줄까하다가 링크드리스트 자료구조를 사용했다. 그래서 각각의 프레임들은 자신의 다음프레임만 알면되고 객체간의 연결이 손쉬워 장점을 가지고 있었지만, 내가 만든 구조상 매번 현재 진행중인 프레임이나 완료된 마지막 프레임을 알기위해서는 head부터 순차탐색을 했어야했고, 이를 해결하기위해 다른 자료구조들이나 콜렉션들이 고려되었다.
하지만 원체 많은 피드백들을 적용하느라 지쳐있기도 했고, 매번 피드백 적용마다 뼈대까지 다 뜯어고칠정도로 고치다보니 너무 힘들어서 아예 새로운 자료구조로의 변경은 내게 너무 부담이였고, 고심끝에 cursor 필드를 만들어 볼링게임시마다 마지막으로 진행한 프레임을 cursor로 업데이트를 해주는 것이였다. 어짜피 pitches는 프레임객체 자기자신이 가능하면 자기자신을 반환하고, 아닐경우 자신이 가지고있는 다음 프레임의 pitches를 호출함으로 결국 마지막까지 자기자신 Frame객체를 반환하기에 cursor를 적용하는데 문제는 없었다.
세 번째, 시그니쳐를 통해 알 수 있는 정보를 네이밍에서 제거
위 상태패턴을 구현하며 생성했던 최초 네이밍은 Symbol인터페이스와 XXXXSymbol이였다. 내게는 그냥 습관적인 네이밍이였고, 축약하지말라는 말을 대충 이해한 결과였다.
하지만, 각각의 구현체들은 자신이 구현하고있는 인터페이스의 시그니처를 이미 알고 있기 때문에 접미사로 시그니처명을 또 붙혀주는것은 썩 좋은생각은 아니였고, 모조리 제거를 해버렸다.
네 번째, 멤버필드는 적을수록 좋다.
난 각 프레임의 완료상태를 complete라는 논리타입의 변수에 저장했었다. 그리고 매번 투구시마다 해당 내용을 업데이트 해줬는데, 이 코드에서 멤버필드는 과하게 많았고,
private boolean completed;
Java
복사
불필요한 업데이트 로직은 과하게 호출되었다. 그렇기에 과감히 해당 필드를 삭제하고, 해당 프레임의 진행상황을 알고싶으면 그때 나머지 정보들을 통해 연산하여 결과를 반환하는식으로 했다.
물론 이 완료결과를 조회하는 메소드의 호출도 여럿 있지만, 매번 투구마다 업데이트 할 때보단 확실히 감소했다고 할 수 있다.

4. Whiteship, Java study

백기선님의 자바스터디가 어느덧 4주차가 되었다. 주차로는 [4 / 18] 로 4분지 1도 지나지 않았지만, 과제의 난이도가 갑자기 생각보다 올라버렸다.
3주차까지는 이론위주의 기초과제가 대부분이였다. JVM이 무엇인가, 연산자가 무엇인가, 변수란 무엇인가? 그래서 스터디 참가율도 몇백명단위로 높았는데, 이번주는 기선님의 휴가로인해 2주로 과제가 연장되었고, 현재 1주가 지났음에도 과제를 낸 사람은 40명이 채 되지 않는다. (나도 내지 못했다.)
4주차의 과제는 필수 과제로는 이번주차와 비슷한 이론 과제로 선택문과 반복문에 대한 공부였고, 그외의 과제가 이번주부터 새로 추가된 새로운 스타일의 과제로 코드가 추가가된다.
1.
JUnit 5학습
: intelli J, 이클립스, VSC, 등으로 JUnit 5로 코드작성하는 법에 익숙해지는 것인데, 이전 과제처럼 등장배경과 장점 그리고 어떤 기능들이 있는지 소개와 예제코드를 위주로 교과서처럼 과제를 해야할지, 고민하다가 2번과제와 연동해서 2번과제를 수행하며 직접 테스트케이스를 작성함으로써 학습하는걸로 정했다.(결코 요약이 귀찮아서는 아니다
2.
live-study 대시 보드를 만드는 코드를 작성하세요.
: 스터디 github의 README를 보면 현재 과제에 참가중인 참가자와 참가현황이 업데이트되며 나온다. 이걸 직접 코드로 구현해보는 것인데, GitHub API 라이브러리를 이용해서 구현한다.
이를 이용해 해당 github의 이슈를 읽어와 참가자들의 참가율을 조사하는 것인데, 라이브러리를 사용하는 것은 큰 문제가 되지 않았지만, 현재 진행중인 nextstep과정에서 하던 스타일대로 클린코딩을 하려고하니 생각할게 많아져서 오히려 헷갈리고 있는 상황이다.
참가자가 Participants 라면 이슈별 참가자 일급 콜렉션은 ParticipantsByIssues일까? 무튼 내일부터는 이 과제부분을 진행해야할 것 같다.
그외에는, LinkedList나 Stack, Queue등 각 자료구조를 코드로 구현해보는 과제들이다.
어서 해야겠다....

3주차 과제 및 4주차 과제 포스팅(작성중)

5. 건강검진

건강검진결과가 몹시 좋지 않다.
지방간도 심하고, 간수치도 너무높다 일반인의 5배로 실시간으로 간이 파괴되고있는 수준이라는건데, 다이어트와 식단관리가 시급하다. 공부때문에 시간이없다는 핑계와, 헬스장이 코로나로 닫았다는 핑계로 운동을 하지 않았는데 이런결과라니 충격적이다..
딱히 단것을 좋아하지도 않고, 술도 즐기는편이아니고 단순히 안움직이는 편이니 당뇨위험이라는 말은 너무 충격적이였다.
의사의 말로는 밀가루가 정말 안좋고, 특히 라면은 밀가루 면인데다가 튀기기까지 했으니 더 안좋다고 하면서 식단관리도 하라고해서, 점심은 밀가루를 제외한 일반식을 먹고 저녁을 줄이면서 실내자전거를 50~60분정도가량을 타고 있다. 꾸준함이 제일 중요하다. 노력하자.