(8주차 ~ 11주차)
실전 프로젝트를 진행하며 느낀 점은 그동안의 프로젝트는 프로젝트라는 이름을 달아줄 수준도 아니었구나 하는 것이었다. 물론 지금 우리의 결과물도 실제 현업에서 다루게 될 프로젝트들의 규모에 비하면 장난같은 수준이겠지만 :)
클론 코딩이 성공적으로 마무리되고 곧 바로 팀 빌딩이 이루어졌다. 그 과정에서 우여곡절이 있었지만, 무사히 팀 빌딩이 이루어졌고 우리 팀의 주제는 음식 배달을 공유하는 커뮤니티 사이트로 정해졌다. 주제 선정이 끝나도 아이디어를 빌드업하는 과정이 순탄하지 않았다.
첫 생각은 슬랙이나 게더처럼 회사, 공유오피스 사람만 사용할 수 있도록 스페이스를 나누어주고 인증키를 주는 것이었는데 그 방법에 관한 접근법이나 기술적으로 알맞은 해결법을 찾기가 어려웠다. 이 문제를 어떻게 비지니스적으로도 사용성 측면에서도 어색하지 않고 자연스럽게 풀어갈 수 있을지 회의를 정말 많이했던 기억이 난다. 그래서 다음과 같이 차근차근 우리의 현 상황과 목적을 분명하게 하는 방법을 취해서 곁가지를 쳐내기로 했다.
스페이스를 나누려는 목적 :
낯선 사람과 배달비를 나누거나 배달 받은 음식을 나눠가지기 위해 이루어지는 상황과 행동들 중 위험한 요소들이 존재 할 수 있다. 따라서 어느정도의 안전성을 보장 할 수 있는 범위로 사용자 범위를 좁히는 것이 필요하다. 그 범위로 회사, 공유 오피스인 이유는 신원 파악이 가능하고 관리 되는 명단이라고 판단 할 수 있기 때문이다.
스페이스를 나눌때의 문제점 :
타겟이 되는 사용자의 풀이 좁아지고 기술적으로 매끄럽게 해결 되지 않는 한계가 존재한다. 가령 특정 링크로 초대받은 사용자가 다시 인증키를 복사해와서 다시 입력하고 다시 로그인하고 (다시.. 다시.. 다시... 후...) 우리가 생각해 낼 수 있는 스페이스를 나누는 방법이 서버단에서도 프론트단에서도 그리 만족스럽지 못했다.
스페이스를 나누는 방법 외 해결 방법 :
스페이스를 나누는 목적에도 부합하면서 스페이스를 나눌때의 문제점을 자연스럽게 해결해줄 방안을 모색하던 중 위치기반으로 사용자 및 모집글을 모으고 트롤 유저에 관한 방책으로 채팅방 방장에게 강퇴 권한을 부여하는 구성을 생각하게 되었다.
새 방안의 장점:
8주차 오랜 시간 회의 끝에 앞으로 가야하는 방향에 관한 설정이 끝난 이후 소셜 로그인과 기본 CRUD를 완성 후 배포하는 일에 정신 없이 시간을 보냈다. 클론 코딩때만 해도 기본 리액트와 리덕스를 사용하여 CRUD를 완성하는 것이 어렵기도 하고 시간이 참 오래걸렸었는데, 어느 순간 필요한 액션을 구상하거나 서버에 필요한 정보를 요청하기도 하고 프론트에서 대신 작업해 줄 수 있는 영역도 구분 짓는 등 항해를 처음 시작하던 때와는 사뭇 달라진 나의 모습이 보였다. 그렇게 한 주를 보내고 2주차에 접어들어 채팅이라는 큰 산을 만나게 되었다.
지금까지 서버와 클라이언트의 통신은 단방향이었다. 프론트가 일방적으로 요청을 보내면 서버로부터 응답을 받는 구조였다. 이제 겨우 그 관계에 익숙해진 상태였고, 사실 그것만이 내 세상.. 이었다. 그러던 중 우리 서비스의 핵심 기능이라고 할 수 있을 채팅 파트를 맡게 되니 처음에는 긴장이 되기도 했었다. 그래도 새로운 기능이자 중요한 기능을 내가 구현해볼 기회가 생겼다는 것이 굉장히 기뻤고 뿌듯했다. 곧 바로 서버분들과 회의를 진행했고 다행히 그 동안 알지 못했던 개념들을 잘 설명해 주셔서 금방 공부해야할 방향을 잡을 수 있었다.
기본 용어 공부 이후 그래서 어떻게 리액트에 적용해서 사용하는 건데? 그래서 어떻게 코드를 짜야 동작을 하는 건데? 라는 문제에 부딪혔다. 일단 sockJS, socket.io 가 뭔지 stomp는 또 뭔지 코드는 어떻게 동작을 하는 건지 공부하는 데에 시간을 많이 쏟았던 것 같다.
개념도 이해를 했다고 생각했고 구글링과 git hub 코드 참고로 어느정도 스톰프 메서드를 사용하는 법에 관한 느낌은 잡았다고 생각을 했다. 다른 프로젝트와 비교하며 우리 프로젝트에 적용할 방안도 고민해보았는데 될 거라고 생각하고 작성했던 코드에서 문제가 많이 발생했다.
문제 현상 : 채팅방에 들어가면 websocket is opening 이라는 내용만 찍히면서 실제 커넥과 섭이 이루어지지 않았다. 오히려 채팅방을 나가거나 주소이동이 되는 순간 서버로 커넥, 섭, 디스커넥이 산발적으로 발생하는 것을 확인할 수 있었다.
문제 원인 : 그 이유를 찾기 위해 구글링을 하던 중 한 줄기 빛과 같은 문장을 보게 되었다. 소켓 연결을 선언하는 위치는 해당 컴포넌트와 동등한 위치에서 선언되어야한다는 것이었다. 이전까지 스톰프 함수들을 여러 컴포넌트에서 사용할 수 있을 것이라는 생각으로 모듈을 만들어 임포트하는 형식으로 코드를 작성했었는데 그것이 아주 큰 실수였다.
해결 과정 : 초기 우리 서비스에서 채팅방으로 입장이 가능한 경우는 메인 포스트 채팅버튼과 개인 채팅 리스트 탭이었다. 그래서 초반 소켓을 선언하는 위치에 관련한 이슈에서도 혼란이 있었다고 생각한다. 그래서 소켓 연결 위치에 관련된 이슈를 접한 뒤 실제 채팅이 일어나는 컴포넌트에 해당 코드를 작성하였고 room id 가 없는 경우의 예외처리를 추가하였다. 또한 초반 채팅으로 접근할 수 있는 경로가 메인과 채팅 리스트 탭이었는데, 이것을 채팅 리스트 탭으로 통합하여 관리하고, 메인에서는 방장에게 채팅 신청을 넣는 기능으로만 제한하여 로직을 정리하였다.
소켓 연결 이후에도 엄청나게 많은 디버깅과 기능 추가와 코드 수정이 있었다. 단순히 연결만 시켰다고 끝나는 것이 아니라 내가 보낸 채팅과 다른 사람이 작성한 채팅을 구분해서 뷰를 만들어야 했다. 사이드바에서는 채팅에 참여 중인 유저를 관리하였고, 계속해서 생겨나는 채팅과 관련 된 기능들을 구현하느라 새벽 4시, 5시가 기본 취침시간이 되었다...
의사소통
많은 회의를 거치며 자유롭게 의견을 말하는 문화가 얼마나 중요한지 느꼈다. 에자일 방법론을 적용해보려는 팀 분위기도 좋았다. 또한 의견을 낼 기회가 많이 주어지니 스스로도 더욱 타당한 주장과 뒷받침 의견을 제시하여 발전적인 결론을 도출하려는 시도를 하게 되었다. 덕분에 논리적으로 사고하는 연습을 많이 할 수 있었다. 같은 말도 듣기 좋게, 분명하게, 상대를 배려하는 자세로, 무언가 요구하기전 내가 해야하는 부분은 책임지고 마무리한 뒤, 협업이 가능한 상태를 만드는 것이 참 중요했다.
기본 CRUD
실전 프로젝트 전 과정들을 통해 기본적인 CRUD와 api 요청은 어느정도 익숙해진 상태긴 했지만, 이번 프로젝트를 진행하면서 리덕스와 그 데이터들에 관한 관계를 확실히 몸에 새기게 되었다.
컴포넌트 간 데이터 이동 및 관리
항상 상위 컴포넌트에서 하위로 데이터를 이동시키곤 했는데, 컴포넌트의 구조가 복잡해질 수록 간혹 하위의 데이터를 상위로 가져와야하는 경우가 생겼었다. 이런 데이터들을 처리하는 법을 조금이라도 다뤄볼 수 있었고 필요한 데이터들을 만들어 내거나 관리하는 법을 익혀가는 것 같다.
낯선 기능을 구현해보는 힘
채팅을 처음 구현해보는 것도 매우 큰 경험이었지만, 그 외 라이브러리를 사용해보는 것도 나에게는 새로운 경험이었다. 온통 영어로 되어있는 라이브러리를 설치한 뒤 문서를 읽어보며 사용법을 익히고 라이브러리 코드를 뜯어보며 커스텀을 하거나 구글링을 하며 문제를 해결해 나가는 경험들이 의미있었다. 비록 그것이 best practice는 아니었을지라도 새로운 기술, 기능을 적용해 보는 재미가 쏠쏠했다.
와 역시 부산의 명물 이수진!