회고록

대규모 트래픽을 고려한 프로젝트 Board Server 회고

whyHbr 2024. 11. 27. 23:00
728x90
반응형

1. 프로젝트 개요

  • 프로젝트명: 대규모 트래픽을 고려한 프로젝트 Board Server
  • 기간: 2024.11.17 ~ 2024.11.27
  • 목표
    • 대규모 트래픽을 고려해 부하를 줄이는 방향으로 개발한다.
    • MyBatis 활용 능력을 향상 시킨다.
  • 팀원: 본인 
  • 기술 스택
    • IntelliJ
    • Java 17
    • Spring Boot 3
    • MyBatos
    • MySql
    • Redis
    • AWS
    • Jenkins
    •  Locust

2. 프로젝트 진행 과정

  • 주요 기능 개발:
    • 회원
      • 회원가입
      • 비밀번호 암호화
      • 로그인
      • 로그아웃
    • 게시판
      • CRUD
      • 검색
    • 댓글, 대댓글
      • CRUD
    • 태그 CRUD
      • 검색
    • 알림 기능
      • AWS SNS/ publish, subscribe
      • 에러시 슬랙 알림 기능
  • 기술적 도전:
    • 주로 사용하던 JPA 대신 MyBatis 를 사용해 프로젝트를 진행했다.
    • CICD 를 처음 해보았다.
    • Jenkins, Putty, AWS, Locust 를 처음 사용해보았다.
    • 알림 서비스를 연동해보았다. 
    • 대규모 트래픽에 대응한 성능 최적화를 해보았다
      • TTL을 60초에서 600초로 수정하였다.
      • 검색 API 서비스 로직에 @Async 어노테이션을 사용해 비동기 처리 방식으로 수정하였다.
      • 레디스 검색키를 세분화 하였다. 

3. 성공적인 점

  • 잘 된 부분.
    • 설치, 설정 과정 때문에 새로운 툴을 사용하는 것을 꺼려했었는데 이번 기회를 통해 새로운 툴을 많이 사용해보았다.  이제 다른 툴도 다뤄보고 싶다.
      • 이전 두 번의 프로젝트에서 성능 테스트를 진행했을 때 K6 를 사용했었는데 이번엔 Locust 를 사용해보았다. 모니터링이 가능하고 결과를 파일로 다운받을 수 있다는 장점이 있다. 
    • CICD 과정을 전보다 깊이 있게 이해하였고, CI 과정을 진행해보았다. 
    • 처음으로 알림 기능을 구현해보았다. 서버가 다운되었을 때 알림이 가게 하면 좋을 거 같다.

4. 개선할 점

  • 어려운 부분
    • 처음 사용해 보는 것이 많은 만큼 아직은 미숙하다. 지속적인 학습을 통해 익숙하게 만들어야겠다.
    • CICD, 배포에 관한 지식이 깊지 않다. 이해도가 프로젝트 전보다 향상되긴 했지만 능숙하진 못하다. 시간을 들여 공부해야겠다.

5. 배운 점

  • 기술적 배움:
    • 전 프로젝트에서는 검색값cache null 처리를 할 때
      // null 허용
      @Bean
      public KeyGenerator customKeyGenerator() {
          return (target, method, params) -> {
              StringBuilder sb = new StringBuilder();
              sb.append(target.getClass().getSimpleName());
              sb.append(".").append(method.getName());
      
              if (params != null) {
                  for (Object param : params) {
                      sb.append(".").append(param != null ? param.toString() : "null");
                  }
              } else {
                  sb.append(".null"); // params가 null인 경우를 처리
              }
      
              return sb.toString();
          };
      }
      
       이런 방식으로 진행하였다.  이번 프로젝트에선 
      @Cacheable(value = "getPosts",
              key = "'getPosts' + #request.getName() + #request.getCategoryId()",
              unless = "#result == null")
       unless = "#result == null") 을  사용해보았다.  어떤 방식이 더 좋다고는 말 못하겠지만 새로운 기능을 알게되었다. 
    • 인덱스를 걸고, TTL 을 늘리고, 비동기 방식을 사용하고, cache key 를 세분화 하는 등 대규모 트래픽을 핸들링 하는 방법을 배웠다. Locust 를 통해 시각화된 것을 볼 수 있어 흥미로웠다. 
  • 프로젝트 관리와 협업:
    • 혼자 하는 프로젝트라 블로그에 정리하며 진행할 수 있었고, 공부해가며 진행할 수 있어 좋았다.  하지만 내가 처음 사용해보는 툴을 먼저 사용해본 선구자와 함께 했다면 더 높은 이해도로 프로젝트를 마무리 할 수 있었을 거 같다. 

6. 향후 계획

  • 향후 개선 사항:
    • 예외 처리를 서비스에서 하는 것이 좋을 거 같다. JPA는 default 메서드를 사용해 repository 에서 발생하는 메서드를 repo에서 처리하는 단일 책임의 원칙을 준수할 수 있는데, MyBatis mapper에서 default 메서드 사용이 가능한지 알아봐야겠다. 
    • 배포 전엔 properties 값을 ignore에 등록해 커밋했는데 배포하려니 properties 값이 필요해 깃허브에 properties 원본을 올렸다. 안전한 방법을 찾아봐야겠다.
  • 개선된 프로세스:
    • 지난 프로젝트서 사용해보지 못해 아쉬웠던 깃허브 이슈를 사용해보았다. 혼자 혹은 2명 정도서 프로젝트를 진행하거나, 요약본 올릴 때 좋을 거 같다. 프로젝트가 무거워지면 노션에 상세히 정리하는 편이 좋을 거 같다. 

혼자 하니 실수해도 돼서 편하게 새로운 툴을 많이 사용해보았다. 

 

 

728x90

'회고록' 카테고리의 다른 글

쿠폰 선착순 발급 이벤트 회고록  (3) 2024.12.10
파이널 프로젝트 회고록  (4) 2024.10.24
미니 프로젝트 회고록  (3) 2024.10.24