회고/프로젝트 회고

[미니 프로젝트 회고] 이력썰 회고

DuL2 2024. 2. 23. 21:16

이력썰 회고

 지난 10일 정도(2024년 2월 14일 ~ 23일) 진행했던 이력썰 프로젝트 회고를 해보려 합니다. 기술적으로 재밌는 내용을 많이 공부하고 알 수 있게 되어 시야가 넓어졌던 한 주였습니다.

 

 동시성 제어, Cache 등과 같은 이론적으로는 알고 있었지만 실제 코드와 기술을 통해 서비스에서 제대로 고민하며 구현해본 적은 없었기 때문에 재밌고 흥미로운 시간이었다. 팀원들과 서비스를 구현하며 고민해야 할 부분과 잘 해결되지 않는 부분들을 대화를 통해 해결해 나갔고, 다른 팀들과의 소통을 통해서도 기술적인 이해도를 높일 수 있는 시간이었다.

 

 기존에도 Redis를 사용해보긴 했지만, SpinLock과 같은 개념에 대해 알지 못했다. 이번 기회에 부족한 CS 지식 - 뮤텍스, 세마포어 등에 대해서 정리하고 공부해보는 시간을 가졌고, 이들을 블로그에도 추후 정리하려고 한다.

 

 Cache 같은 경우에는 개념으로는 알고 있었지만 실제 구현하려면 당연히 직접 구현해야한다고 생각했었다. 하지만 Spring이라는 엄청난 프레임워크가 가져다 주는 좋은 기능, 기술들을 확인하고 다시 한 번 놀랐다. 하지만, 우리 팀의 경우 Redis를 이용해 직접 Cache 저장소를 구현했지만, 다른 팀들의 코드와 사용법을 공부해보면서 Spring cache가 너무나도 신기했고, 역시 개발자들은 재사용성없이는 살 수 없는 존재구나 라고 생각했다. CacheManager를 뜯어 보기는 했지만, 아직 내공이 부족했고, 최종 프로젝트를 진행하며 발생할 문제를 대처하며 다시 한번 깊게 파보면서 트러블 슈팅과 함께 정리해야 겠다.

 

이번 프로젝트를 하면서 더욱이 좋았던 것은 테스트 툴과 방식에 대한 공부 및 경험을 해볼 수 있었던 점이다. 항상 부하테스트를 해보고 싶었으나 기회가 없기도 했고, 지난번 ElasticSearch를 사용해보면서 CPU, Memory 부하 모니터링과 JVM 커스텀을 해보았지만, 실질적으로 테스트해본 적은 없었다.(물론, 당시 부하의 경우 실제 Data - 신문기사 몇 만건을 ElasticSearch로 밀어 넣으면서 형태소 분석을 하는 과정에서 처리 속도가 어떻게 변화하는지 서버 자원 모니터링을 진행하긴 했다.) 툴을 직접 사용해본 것도 이번이 처음인지라 Groovy가 어떤 언어인지도 잘 모르지만 재밌게 test를 해보았다. 직접 사용해보는 것을 위주로 하다보니 nGrinder 내부에서 쓰레드와 프로세스가 어떻게 돌아가는지 각 test가 병렬로 쓰레드마다 독립적으로 돌아가는 것인지 프로세스로 분리되어 돌아가는 것인지 등에 대한 호기심이 많았지만, 시간 관계상 딥하게 들어가지 못한 점이 많이 아쉬웠다. nGrinder나 Jmeter의 경우에는 언젠가 최종 프로젝트에서도 사용할 것으로 생각되니 미래의 기회를 꿈꾸며 정리하고자 한다.

 

 테스트 방식(부하 테스트, 스파이크 테스트, 내구성 테스트)에 대해서 공부하는 기회도 좋았으나 각 테스트의 가설을 잘 작성하여 진행하는 노하우를 얻고, 공부하고 싶어졌고, 많은 자료를 통해 공부를 해봐야 추후 있을 프로젝트에서 성장할 수 있다고 판단했다. 짬나는 시간에 많은 테스트 결과 들을 tech 블로그 등에서 찾아보며 직관적으로 내가 이 테스트를 통해 무엇을 보여주고자 하는 것인지에 대해 고민하는 시간을 가져보면서 성장해야겠다는 생각을 했다. 

https://loosie.tistory.com/821

 

나의 KPT 회고

Keep

  • 구현체에 의지하지 않고 객체지향적으로 코드를 구성했고 더 성장할 수 있는 기회였다.
  • 멀티 프로세스 환경에서 고민해볼 수 있는 다양한 고민들을 경험했고, 그 부분을 고려할 수 있는 시야가 트인 것 같다.
  • 기술 사용에 대한 기준을 가지게 되었다.

Problem

  • 어떤 개발 방향성을 정하고 그것에 대한 저반 지식에 대해 공부를 해야할 것 같다.
    • 공부를 해도해도 부족한 CS지식은 본인으로 하여금 명확한 용어를 사용하여 남들을 설득하는데 방해가 된다.
    • 부족한 지식은 문제 해결 능력을 긴 시점에서 떨어트린다.
  • 이벤트 스토밍을 통해 명확한 요구사항과 정책을 팀원들과 공유해서 기능을 구현할 때 모두가 이해한 그대로의 기능으로 작성하도록 해야할 같다.
    • 서로 이해한 바가 많이 다를 수 있다는 것을 인지하고 항상 문서화와 공유 및 소통을 지속적으로 해야한다.

Try

  • 꾸준한 CS 지식 공부하기
    1. 프로젝트를 진행하며 생겨나는 CS를 잘 나의 언어로 풀어 정리하기
    2. 매주 새로운 CS 지식을 공부하기
  • 이벤트 스토밍과 와이어프레임 잘 작성하기
    • 팀 내에서 제대로 된 기능 요구사항에 대한 소통이 되고 있지 않다면 잘못된 문서화 혹은 소통 방식의 문제일 것이다. 이를 해결하기 위해서는 꼼꼼이 청사진을 그려보고 개발을 진행하면서 개선하려는 노력을 꾸준히 해주어야 하는 것 같다.
    • 기능 구현할 때 다이어그램 등 다양한 매체를 통해 공유하고 정리하려는 행위를 지속해야 할 것 같다.
  • 기능에 대해 차근차근 한글로 풀어 적어보기

 

이력썰 프로젝트 개요

  • 팀명 : Ressul Company
  • 프로젝트 명 : 이력썰 (Ressul)
  • 프로젝트 소개 : 취준생들이 이력서를 통해 썰을 푸는 공간.
  • 프로젝트 계기 : 이제 수료할 날이 얼마 남지 않았고 취업을 하기 위해서는 이력서나 포트폴리오를 작성해야 합니다. 최근 개발자들의 포트폴리오나 이력서가 정말 다양한 형태로 작성되고 있어 다른 사람들의 이력서를 편하게 확인하고 얘기하는 공간이 필요하다고 생각되어 만들게 되었습니다.

🏁개발 일정

 

⚙️ Backend 개발환경

  • 언어 : Kotlin 1.9.20 - Java version 17
  • 프레임워크 : SpringBoot 3.2.0
  • ORM: JPA
  • 빌드 툴 : gradle-8.5
  • 데이터베이스 : MySQL
  • 형상 관리 : git
  • IDE : IntelliJ IDEA 2023.3 (Ultimate Edition)

ERD

패키지 구조

API

주요 기능

  • 선착순 이벤트
    • 유명 튜터가 이력서를 검토해주는 선착순 이벤트
    • 데이터 정합성을 지키기 위한 Spin Lock
    • 단일 스레드 기반의 Redis가 지원하는 setnx 명령어를 활용
  • OAuth2 회원 기능
    • Security 없이 직접 구현체를 작성하여 개발
    • 여러 OAuth2 인증사 사용하기 위한 확장이 가능한 구조로 OAuth2Client 개발
    • WAS Filter에 Application 인증을 위한 MyJwtTokenFilter 추가
    • Security @AuthenticationPrincipal을 대체할 @LoginUser를 받을 수 있도록 LoginMemberArgumentResolver 개발
  • 이력서 캐싱 기능
    • 이력서 단건 조회 시 조회수가 올라가는 것을 저장해두었다가 그것을 인기 게시글로 선정하기
    • RedisTemplate를 통하여 인기 이력서 관리.
    • RedisRepository를 이용한 생산성에 중점을 둔 인기 키워드 게시글 관리
  • 회원권 결제 기능
    • 토스 페이먼츠를 통한 결제 시스템
    • WebClient를 이용한 통신