7월 프로젝트 회고록

bbbooo·2023년 8월 2일
post-thumbnail

📃 프로젝트 깃허브 주소

https://github.com/bbbbooo/spring-cacamuca

1. 소개

과자 리뷰 서비스

2. 작업사항

리뷰 도메인

  • 리뷰 관련 CRUD

서버 최적화 및 쿼리 튜닝

3. 진행기간

7.1 ~ 7. 31


4. 트러블 슈팅

서버 최적화

  • 리뷰 목록을 불러오는 과정에서 다수의 트래픽이 발생 시, 리뷰를 불러오는 속도가 현저히 떨어짐. 배포를 진행했기에 어느정도 트래픽에 대해 생각을 해볼 필요가 있었음

@EnableCaching, @Cacheable

  • 데이터의 수정이 이뤄지지 않고 단순하게 같은 리뷰를 반복적으로 요청만 하는거라면 굳이 select문을 호출할 필요 없이 캐시에 저장해두고 그것을 꺼내쓰도록 처리하였다.

@Transactional(readOnly=true)

  • 트랜젝션 과정에서 스냅샷을 저장하지 않고 더티체킹을 수행하지 않아 자원의 낭비를 줄일 수 있었음
  • 읽기 전용이라는 것을 명시하여 코드의 가독성도 높일 수 있었다.

쿼리 튜닝

  • 라고 거창하게 써봤는데 select를 사용할때 *를 지양하고 필요한 데이터만을 가져오도록 하여 불필요한 작업 수행을 줄였다.
  • 추가적으로 필요한 경우가 아니라면 order by, group by를 최대한 지양하였음

fetchSize

  • 조회의 경우 Mybatis를 사용하였는데 매퍼 파일안에 fetchSize를 1000으로 명시하여 한번 조회시 1000개의 데이터를 불러오도록 하였다.

  • 테스트 환경
    유저 : 4천명
    응답 시간: 1초
    요청 : 10번

최적화 이전 - 233tps
최적화 이후 - 1016tps

테스트 코드
단위 테스트를 진행할 때, 중복되는 코드가 존재했는데 이를 편의성으로나 코드적으로나 개선할 필요가 있었다. 그래서, 이전에 테스트 코드에 관련하여 찾다 발견한 object mother를 사용하였다.

💡 코드가 길고 밑으로도 비슷한 유형의 코드가 반복된다.

💡 획기적으로 줄일 수 있었다.

테스트 코드와 동일한 위치 Object라는 패키지 생성 및 클래스를 생성함. 클래스 내, 단위 테스트에 필요한 객체를 만들고 이를 static 메모리에서 관리하게 함.

이미지 출력
Not allowed to load local resource

  • 업로드된 사진을 서버의 로컬에 저장하도록 구현하였다. 이유는 프로젝트 내 경로로 지정 시, 배포 할때마다 데이터가 삭제가 되어 따로 저장할 필요가 있었다. 하지만 이럴 경우 이미지를 불러올때 위의 에러 코드가 나오며 이미지를 출력할 수 없었다. 이유인 즉슨, 크롬은 보안상의 이유로 로컬의 이미지를 불러오지 못하도록 막아놨다.

따라서, 이를 해결하기 위해 추가적인 설정을 진행했다.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/review/**")
                .addResourceLocations("file:///C:/app-file/uploadFiles/");
        registry.addResourceHandler("/request/**")
                .addResourceLocations("file:///C:/app-file/uploadFiles/");
    }
}

클라이언트에서 지정한 경로(review, request)로 요청이 들어오면 핸들러에 담겨있는 경로(절대경로)에 있는 정적 리소스(이미지)가 반환되도록 구현하였다.

5. 느낀점

로컬에서는 되는데 배포에서 안되는 이슈가 제일 기억에 남는다. 예를 들어, 테스트 코드가 통과되지 않거나 500에러가 뜨거나... 개발에 있어서 배포도 엄청난 비중을 차지하는걸 다시금 깨닫게 되었다.

프로젝트 기간동안 2개의 면접을 준비하느라 유지보수에 더 시간을 못 쓴점이 아쉬웠다. 특히, 성능 최적화를 위해 쓸 시간이 부족해서 차후 프로젝트에서는 다음의 목표를 이루고자 한다.

  • 100만건 데이터 삽입 후 1초 이내 검색

    컴퓨웨어의 웹 성능 사업부에 근무하는 고메즈에 따르면 사용자의 40%가 3초동안 기다리게 되면 사이트를 이탈하는 것으로 나타났다고 하였으며 월마트는 페이지 속도를 100ms까지 개선하면 수익이 1% 증가한다는 사실을 발견하였다.

엄청난건 아니지만 차근차근 목표를 이뤄나가는 형식으로 진행하고자 한다. 8월도 프로젝트가 시작되었는데 다시 힘내서 달려야겠다.

1개의 댓글

comment-user-thumbnail
2023년 8월 7일

djWjfxlql

답글 달기