본문 바로가기

회고/프로젝트 회고

나의 두번째 팀 프로젝트, 모락모락을 마무리하며 (Feat. Codestates)

 

 

드디어 내 생에 두번째 프로젝트가 끝났다.

사실 일요일 이후로 쉬엄쉬엄 놀다가 데모데이를 맞이할 줄 알았는데 오늘은 밤새도록 작업했다.. ㅋㅋ ㅋ

 

지난번 프로젝트 회고를 너무 중구난방으로 작성한 것이 아쉬워 이번에는 몇가지 질문을 미리 준비해놓고 해당 질문에 맞는 답변들을 작성하는 방식으로 정리해보려고 한다.

 

 

 

1. 프로젝트에서 어떤 역할을 담당했나요?

1. 백엔드 파트장으로써 전반적인 백엔드 로직을 설계했으며, 팀원들에게 관련 기술들을 공유했다.

2. 리액트 개발 경험을 살려 프론트와 기술적인 소통을 전담하였으며, 종종 프론트 코드를 직접 작성하기도 했다.

3. Spring Security와 JWT, OAuth2, Java Mail을 활용한 보안/인증/인가 시스템을 구축했다.

4. Redis를 활용하여 Refresh Token 및 메일 인증 키 관리 시스템을 구축하였으며, 데이터 캐싱을 이용해 트래픽을 개선하였다.

5. AOP를 이용해 API 성능 로깅 시스템을 구축했다.

6. Selenium과 Spring Schedule을 활용하여 주기적인 채용정보 사이트 크롤링 시스템을 구축했다.

7. 격리된 환경에서의 테스트를 위한 Docker Test Container를 도입하였다.

8. Amazone S3 PreSigned Url을 활용한 파일 업로드 및 관리 시스템을 구축하였다.

9. 이외에 대시보드 통계, 회원 랭킹, 유저 알림 등 회원 관련 전반적인 로직을 구현했으며 이 과정에서 QueryDsl, JdbcTemplate, Native Query를 다양하게 활용하였다.

10. 데이터베이스 실행 계획을 바탕으로 인덱스를 설정하고 쿼리를 수정하는 작업을 진행했다.

 

 

2. 이번 프로젝트에서 어떤 것들을 배웠나요? 혹은 어떤 의미가 있었나요?

1. 대부분의 로직을 TDD 방식으로 작성하여 TDD의 장/단점을 경험했다.

2. 다양한 데이터가 동시에 요구되는 경우가 많아 Spring Data Jpa로 모든 것을 처리하는 것이 아니라 QueryDsl, JdbcTemplate, NativeQuery 등 다양한 쿼리 경험을 쌓았다.

3. 크롤링을 처음 경험해보았으며, 크롤링한 데이터를 저장하는 과정에서 JPA에서 BulkInsert를 처리하는 방법 또한 배울 수 있었다.

4. CRUD는 모두 비슷한줄로만 알았으나, 이전 프로젝트와는 새로운 방식들을 시도해보았다.

예를 들면 파일 업로드 방식, 로그인 처리 방식 등이 있었다.

또한, 이전 프로젝트에서 부족하다고 느꼈던 점들을 개선하여 한층 더 고도화된 로직을 구현할 수 있었다.

5. Redis를 보다 광범위하게 사용해볼 수 있었다.

6. Docker를 처음 사용해보았다.

7. 협업 시 소통의 중요성을 깨닫게 되었다.

 

 

3. 프로젝트를 하며 좋았던 점이나 기억에 남은 것들이 있나요?

 

1. 이전 프로젝트에서 리액트에 너무 많은 시간틀 투자하게 되어서 스트레스를 많이 받았었는데, 이번 프로젝트를 진행할 때 전에 겪었던 경험들이 기술적 소통에 엄청나게 큰 도움이 되었다.

특히나 JWT Token를 이용한 인증/인가나 OAuth2 같은 부분들은 프론트와 백엔드 모두가 전체 흐름에 대한 이해가 필요한데, 만약 내가 프론트의 흐름이나 코드를 알지 못했다면 구현에 불필요한 소통 비용이 들었을 것이라는 생각이 들었다.

덕분에 이전 프로젝트 경험이 결코 헛된 시간을 보낸 것이 아니라는 생각이 들어서 기뻤고, 왜 결국 개발자는 다 알아야 한다고 하는지 그 의미를 깨달을 수 있었다.

 

2. 이것은 장점이자 단점이였는데, 우리 팀의 백엔드 구성원들은 나를 중심으로 나머지 팀원 두 분이 모인 것이다보니 전반적인 계획이나 로직을 거의 내가 결정했다.

장점인 부분은 내가 하고 싶은 걸 이번 프로젝트에서 다 해봤다는 것이다.

이전 프로젝트 경험을 생각했을 때, 일반적인 프로젝트 구성원들끼리 모인 상황이였다면 절대 이렇게까지 내가 원하는대로 진행할 수 없었을 것이다. 아마 테스트 코드부터 일주일째부터 아무도 작성하지 않게 되었을 가능성이 높다.

단점은 나중에 언급하겠다.

 

3. 내가 원치 않았던 CRUD가 주가 되는 프로젝트라서 새로운 경험 없이 노가다만 하게 되는 거 아닌가?라는 걱정을 많이 했으나 오히려 새로운 기능을 깔짝거리머 건드려보는 것이 아닌 기존에 알던 로직을 더 고도화하고 최적화하려고 노력하니 그 안에서 많은 것들을 배울 수 있었다.

돌이켜보면 지난 프로젝트는 쿼리 최적화나 n+1, 인덱스, 실행계획 같은 건 전혀 신경도 안 썼었다.

그리고 레디스는 사용했으나 인증키 관리가 너무 허술했었고, Security 로직도 이번에 다시 바닥부터 쌓아올리다보니 부족한 점들이 많이 발견되어 보완 과정을 거쳤다.

또한 어느 정도 클린 코드 실천과 리팩터링 경험도 쌓을 수 있었으며, 이전에는 신경쓰지 못했던 전체적인 구조나 설계에 대해서도 더 깊이 고민해보고 적용한 부분들이 있다.

근데 고민하고 고민한 결과 계층형 아키텍처에서는 아무리 돌고 돌아도 그 자리를 벗어날 수 없는 것 같음.. 다음에는 진짜 꼭 도메인 주도 개발을 해보고 싶다.

 

4. TDD로 프로젝트를 진행할 수 있었다.

사실대로 말하자면 나만 TDD 했고 팀원들은 초반에만 TDD 하다가 나중에는 그냥 선 로직 작성 후 테스트 코드 작성했다.

그래도 최소한 팀원들이 계속해서 테스트 코드를 작성하는 노력이라도 해줬기 때문에 나도 TDD를 계속할 수 있었다.

아마 팀원들이 " 아~~ 이거 왜하는지 모르겠어요~~ 그냥 안할래요~~ "이랬으면 나도 기운빠져서 더이상 지속할 수 없었을 것 같다.

다른 조들의 테스트코드 작성 현황을 봤는데 Spring Rest Docs는 커녕 테스트 코드를 한 개도 작성하지 않은 조도 수두룩했다.

힘들었을텐데 끝까지 테스트 코드를 열심히 작성하려고 노력해준 우리 팀원들에게 다시 한 번 고마운 마음을 전한다.

 

 

 

4. 프로젝트를 진행하며 아쉬워던 점이 있나요? 프로젝트를 다시 진행할 수 있다면 어떤 점들을 고치고 싶나요?

 

1. 제일 아쉬운 걸 꼽자면 소통 문제다.

돌이켜보면 내가 너무 의욕이 넘치는 나머지 팀원들과 소통이 부족했다.

이전 프로젝트에서는 내가 프론트, 백엔드를 모두 처리했기 때문에 전체 분량을 어떻게 정하든 나 혼자 이틀이든 사흘이든 밤을 새워가면서 완성하면 그만이였지만 이번에는 아니였다.

엄연히 프론트엔드와 백엔드의 영역이 구별되어 있었고, 프론트엔드 팀원분들에게도 본인들의 계획이 있었을텐데 나는 "파이널 프로젝트인데 이 정도 노력은 해야하는 게 당연한 거 아닌가?"라는 너무나도 자기중심적인 사고로 소통하려고 했고, 그 결과 우리 팀은 프로젝트 초반에 마찰을 겪게 되었다.

지금 생각해보면 프론트엔드 팀원 분들이 내가 계획한 분량만큼 작업하는 게 힘들다고 했을 때, 충분히 그 생각에 공감하면서 협의점을 찾았으면 프로젝트 초반의 소통 문제도 덜했을 것이고, 능률도 올라서 지금보다 더 많은 기능을 구현할 수 있었을 것이다.

나는 종종 객관적이고 효율적으로 사고한다는 착각에 빠져 오히려 일을 그르치는 잘못을 저지르곤 하는데, 이번이 딱 그런 경우였다고 생각한다.

만약 프로젝트를 다시 진행하게 된다면 프론트엔드 팀원들과 충분한 상의 끝에 작업 범위를 정하고 해당 목표치가 내 마음에 들지 않는다면 백엔드 일정을 빠르게 끝내고 프론트엔드 팀원분들을 도와서 완성 일정을 앞당겨 분량을 늘리는 선택을 하고 싶다.

정말 객관적이고 효율을 중요시하는 사람은 팀원과 불필요한 언쟁을 하지 않는다. 

다음부터는 이런 일이 없도록 주의해야할 것이다.

 

2. 위에서 언급했던 장점이자 단점이였던 내 중심으로 돌아가는 백엔드 팀 문화의 단점 편이다.

아무래도 우리 팀의 백엔드 분들은 나를 중심으로 모이셨고, 내가 프로젝트 시작 며칠 전부터 미리 기술을 공유해주면서 프로젝트를 대비했을 만큼 지식에 차이가 있었기 때문에 거의 모든 부분이 내 위주로 결정될 수 밖에 없었다.

내가 하고 싶은대로 할 수 있는 건 어찌보면 장점이지만, 어찌 보면 심각한 단점이였다.

팀원들과 기술에 대한 토론 끝에 배울 수 있는 것들이 정말 많은데, 그런 기회를 모두 놓쳐버린 것이다.

다만 이 부분은 의도적으로 이렇게 한 것은 아니라서..

모든 것에는 일장일단이 있는데 그저 장과 단이 너무 뚜렷했던 것 같다.

다음에는 좀 더 토론이 가능한 분위기에서 프로젝트를 진행하고 싶다.

 

3. DB 최적화로 인한 성능 향상을 내가 생각한 목표만큼 이루지 못했다.

SpringDataJpa에 기대서 평온한 삶을 살다가 다양한 쿼리 경험을 쌓았고, 인덱스 설정이나 실행계획 등 다양한 시도들을 해본 것은 사실이지만 DB 최적화는 내가 생각했던 것보다 벽이 엄청나게 높았다.나름 직접 열심히 작성한 쿼리보다 Batch로 한 번에 대충 끌고와서 해결하는 게 더 성능이 좋은 슬픈 경험도 해봤다..이건 시간을 돌이키고 말고 할만한 일은 아니고 앞으로 더 꾸준히 노력해야할 부분이다..

 

4. 다양한 기술을 접해보지 못했다.물론 무조건 신기술이나 유행하는 기술을 만져보는 게 좋은 것은 아니지만, 사실 이런 프로젝트 때가 아니면 그런 것들을 다뤄볼 기회가 흔치 않은 게 사실이기 때문에 이 부분에 아쉬움이 컸다.

음.. 다음 프로젝트나 개인 프로젝트에서 혼자 써보면 되는 거니까 괜찮다.

 

 

 

 

5. 마무리

 

사실 아쉬운 점이 너무너무 많아서 셀 수조차 없다.

하지만 이제 끝이다.

소꿉장난은 끝났고 현실에 내던져질 시간이 왔다..

 

지난 프로젝트가 나에게 뼈가 되고 살이 되었듯이 이번도 마찬가지일 것이라고 믿는다.

문 닫자~

 

 

 

 

 

 

https://www.youtube.com/watch?v=3ji5B3qJIoY 

5:45 , 19:5가 내 발표 부분이다.

 

 

 

https://seb40-main-004-hyeonwooga.vercel.app/

 

모락모락

📆 채용 일정 캘린더더보기 >

seb40-main-004-hyeonwooga.vercel.app

놀러오십쇼~