1월 1주차 주간 회고 === ## TGIF ### 많은 후회는 날 천천히 가게 할 뿐이다. 후회하지 말자 ###### tags: `20220107` `주간 회고` 아키텍처 및 패턴 점검 - 우리 아키텍처 잘 만들고 있습니까? - 리뷰 받기 - 플랜을 확인 받자 서로 생산성 관리 - 스프린트 및 이슈 점검 - 달성률 개인화 문서화 계획 점검(시간 갖기) - 스프린트 단위 개인별 목표에 대한 문서 작성 결과 점검 ### 패턴 & 아키텍쳐 점검 #### 김완기 <달성률 30%> - 홈 뷰 구현 - MVVM 이해 및 바인딩 방법 학습 및 예제 프로젝트를 활용한 적용 진행 - 홈 뷰를 구현하기 위한 계획을 세웠지만, 실제로 계획했던 홈뷰를 제대로 구현하지 못함. - 첫 뷰부터 MVVM 패턴을 활용해 구성하려고 했으나, MVVM의 동작 방식은 이해를 했지만, 실제로 코드로 작성했을 때 생각보다 잘 적용이 되지 않았다. - 여러 개발자의 포스팅된 글을 비교해보고, 살펴봤지만, 구현 방법 또한 오픈 소스를 활용해 다양하게 진행할 수 있는 것 같기도 했고, 이 부분에서 어떤 구현 방법을 택해야 하는가에 대한 고민에 대해서 빠른 해결책을 내지 못했다.(결국은 모두 같은 흐름을 가진다는 생각에 이젠 좀더 빠르게 진행할 수 있을 것 같다.) - 실제 뷰 구현 - 일단 MVVM의 동작 방식에 대해서는 많은 부분 이해를 했다고 생각한다. 저조한 달성률 : 실제 구현 과정에서 각 뷰 별로 모두 MVVM의 구조를 가지고 짜야한다는 생각에 첫번째 뷰부터 MVVM으로 잘 짜자 라는 마인드 때문인 것 같다. #### 이강호 <달성률 70%> - #### msa 인증 서버 아키텍처에 대한 고민 - 인증서버를 구성하기 위해 게이트 웨이에 커스텀 필터를 적용했다. - 스프링 시큐리티를 모든 서버에서 구현하는 것보다 간단한 인증만 거친 토큰을 사용하는 것이 좋겠다는 생각을 했다. - 이메일 인증과 리프레시 토큰을 위해 redis를 이용하기로 결정했다. - 많은 예제들과 다른 팀원들의 의견을 종합해서 결정했다. - 스프링 시큐리티에 대한 개념 정리를 했다. - 구조상 유저 인증서버에는 시큐리티를 적용할 수 밖에 없었다. - 나는 인증서버와 유저서버를 같이 쓰고 있었기 때문에 결국 내 정보를 반환하기 위해서 스프링 시큐리티의 사용법을 좀 더 정확하게 알고 있어야 했다. (로그인, 회원가입, 내 정보, 회원 수정, 로그 아웃이 한 서버에 위치함) - 또한 중요한 것이 게이트웨이에서 커스텀 필터로 걸러질 때와 시큐리티의 반환하는 response형태가 같아야 했기 때문에 관련된 정보를 많이 찾아보았다. - weflux와 webmvc에서 request, response를 반환하는 이름이 조금 다르고 메소드가 조금 씩 달랐고 webflux는 byte형식을 담아주었다. - #### 프로젝트 전체에서 사용되는 부분에 대한 고민 - 에러 핸들링에 대한 고민으로 관련된 블로그 글을 통해 나중에 한번에 적용할 계획을 세웠다. - 에러코드와 response를 통일 시켜야 할 계획을 세웠다. - 에러코드는 음수로 결정 (양수도 ㄱㅊ지만 혹시나 나중에 status코드와 겹칠 위험이 있다.) - data를 굳이 내려주지 않아도 괜찮겠다는 생각을 했다. - 만약 내려준다면 err: 0을 고정시켜야 할 것이다. - entity와 dto 사이의 변환에 대해 고민을 했다. - 코틀린을 이용해 편리하게 변환하는 방법에 대해서 찾아보았고 생성자를 여러개 만드는 것으로 data class를 정의했다. + fun toEntity라는 메소드를 따로 정의했다. - 필터에서 받은 토큰을 변환해서 내려줘야 할지 서버들 마다 json을 가지고 있을지에 대해 고민했다. -> 결국 그냥 변환해서 내려주는 것이 좋겠다고 판단해서 userId를 헤더나 바디에 추가해서 내려주기로 했다. - #### 달성률이 저조한 이유 - 생각보다 많은 시간이 kotlin과 스프링 자체 조사에서 시간이 나갔다. 차라리 좀 공부를 깊게 하고 개념을 확실히 하는 게 오히려 빠르다고 느꼈다. - msa관련 강의를 일요일에 들어야겠다. #### 홍석기 <달성률 105%> > [storybook 배포 주소](https://lemondade-storybook.netlify.app/?path=/story/atoms-button--primary) - `icon` 컴포넌트 관련 - 문제점) Icon을 `svg` 파일로 저장하여 `storybook` 에 보여주는데, `storybook` 자체적으로 `svg` 파일을 읽는데 있어 오류가 발생. - `storybook` 은 자체적으로 static file를 읽는 과정에서 `file-loader` 라는 모듈을 사용. - 하지만 `svg` 를 읽으려면 그 `file-loader` 보다 앞서 `@svgr/webpack` 를 통해서 해당 `svg` 파일을 로드해야함. - 해당 설정에 있어서 정확한 방법을 몰라 시간이 많이 소요함. <br /> > 결과적으로는 `.storybook/main.js` 에 `webpackFinal` 함수를 통해 해결하였음. > - `image` 컴포넌트 - next/image 관련 - next에서 제공하는 태그인 `next/Image` 를 사용했다. - 하지만 `domain`을 따로 설정해야하는 요구사항이 있었다. - `./storybook/preview.js` 파일에 설정을 추가하고, - `next.config.js` 에 `image`를 불러오는 `domain` 을 추가하였다. ### 금주 타임라인(뭐했는지 적으세요) #### 김완기 - MVVM Binding 진행 - MVVM 관련 예제 프로젝트 총 7개 정도 진행 해봄 ![](https://i.imgur.com/F01mUIC.png) 하지만 명확하게 이해했다고 보기는 어려워보임. - KREAM 구현해야하는 뷰들 figma 활용해서 분석 진행 - #### 이강호 #### 홍석기 - `Button` 컴포넌트 작성 - `Atom` 중의 기본인 버튼을 생성. - 간단하지만 `props` 를 고려하며 개발이 이루어져야 한다. ```typescript type ButtonProps = { category: ButtonTypes; children: React.ReactNode; onClick?: React.MouseEventHandler<HTMLButtonElement>; disabled?: boolean; fullWidth?: boolean; }; ``` - 위에 보이는 field들을 가지도록 설계하였다. - 2중 ternary 연산을 피하고 싶다보니 `fullWidth` 관련한 속성은 따로 하단에 뺄 수 밖에 없는 상황이 아쉬웠다. - 해당 내용을 기반으로 `storybook` 작성도 진행했다. - `Icon` 컴포넌트 작성. - 프로젝트 내부에 사용되는 모든 `icon` 들을 조사했다. - `svg` 파일을 통해 관리하려는 목표가 있었다. - 해당 과정에서 발생하는 이슈가 있었다. 위에 기술 하였다. - 총 15개의 아이콘을 작성했다. - `ProductImage` 컴포넌트 작성. - 프로젝트에 사용되는 여러가지 이미지들이 있는데, 그 중 제품 이미지 컴포넌트를 작성했다. - `next/Image` 를 사용하기로 결정했다. - 이미지 resizing, 최적화 그리고 브라우저 호환성이 좋다. - 이미지의 개수에 따라 빌드 타임이 길어지지 않는다. - 설정해주어야 하는 것들이 많아 설정하는데 시간이 조금 걸렷다. ### 개인별 문서화 점검 #### 김완기 트러블 슈팅 진행 사항 #### 이강호 개발 진행 사항 작성 #### 홍석기 Story book 진행 사항