개발

    좋아요/싫어요 수 조회 성능 개선 과정

    개요 게시글에 투표(좋아요/싫어요)를 할 수 있는 기능을 추가했다. 이 투표 데이터를 관리하는 방법으로 크게 2가지가 있는데 게시글에 투표 수를 컬럼으로 관리하는 것, 그리고 별도의 투표 테이블을 두는 것이다. 한 회원은 한 게시글에 한 번만 투표를 할 수 있도록 했기 때문에 연관된 회원 정보도 필요했고, 그렇기에 별도의 투표 테이블을 두기로 하였다. 게시글의 투표(좋아요/싫어요) 수를 조회하려면 투표 테이블에서 각각의 수를 count 하면 될 것이다. 다만, 이러면 투표 테이블의 데이터가 많아질수록 조회 성능이 악화될 것인데, 게시글의 투표 수를 조회하는 요청은 게시글 목록, 게시글 상세 조회를 할 때 필요한 정보이니 빈번하게 많이 호출된다. 그러니 한 번 조회 성능을 개선해보도록 하자. 대용량 더미 ..

    [Spring REST Docs] 빌드 시 HTML 이 생성되지 않을 때

    개요 프로젝트에서 Spring REST Docs 를 이용하여 API 문서를 만들었다. 빌드 시 adoc 파일을 바탕으로 HTML 파일을 생성하고 싶어 Spring REST Docs 공식 문서 (2.0.7.RELEASE 사용) 를 참고하였는데, 빌드를 하여도 HTML 파일이 생성되지 않는 문제가 발생했다. 결론부터 말하자면 adoc 파일을 바탕으로 빌드 시 생성되는 HTML 파일의 위치가 가 공식 문서에 나온 것과는 다른 것이 원인이었다. 원인 위의 공식 문서를 보면 src/docs/asciidoc 하위에 adoc 파일을 두었을 때, 그래들로 빌드 시 build/asciidoc/html5 하위에 html 이 생성된다. 이를 바탕으로 HTML 문서를 jar 에 패키징하려면 위와 같이 build.gradle ..

    JPQL 로 Pageable 객체 사용 시 주의할 점

    개요 Spring Data JPA Repository 에 Pageable 객체를 파라미터로 전달하면 별도의 쿼리를 작성하지 않아도 페이징을 위한 쿼리를 만들어준다. 전통적인 오프셋 기반의 페이징 처리를 할때는 전체 데이터 수가 알아야하기에 Spring Data JPA 에서는 Page 객체를 반환하는 방식을 주로 이용한다. 이때, 전체 데이터 수를 알아야하므로 페이징 쿼리 외에도 추가적으로 count 쿼리가 나간다. 이 과정에서 JPQL 을 사용하여 페이징 쿼리를 작성할 때, 주의할 점이 있어 공유하고자 글을 작성한다. 주의할 점 결론부터 이야기하자면 count 쿼리가 @Query 로 작성한 JPQL 을 기반으로 나간다는 것을 인지하고 있어야한다는 것이다. 특히, fetch join 을 사용할 경우 예외가..

    도커 컨테이너 로그 설정하기

    개요 EC2 서버에 띄운 컨테이너의 로그를 확인해볼 일이 있어 아래 명령어를 통해 로그를 확인했다. docker logs [컨테이너 명] 지난 로그들을 확인하다가 문득 로그 파일에 쌓여 있는 로그들이 굉장히 많다고 느꼈고, 싸한 느낌과 함께 도커 컨테이너의 기본 로그 설정을 찾아보았다. 도커 컨테이너의 기본 로깅 드라이버 도커 공식 문서에 따르면 도커 컨테이너에서 발생하는 표준 출력이나 표준 에러를 캡쳐하여 json 형태로 보여주는 json-file 로깅 드라이버를 사용한다. 근데 이 json-file 로깅 드라이버가 기본적으로 최대 용량이 정해져있지 않기에 만약 로그가 많이 남는 서비스라면 저장 공간이 부족해지는 일이 발생할 수도 있을 것이다. 그렇다면, 이 문제를 어떻게 해결할 수 있는지 한번 살펴보..

    AWS EC2 메모리 부족을 스왑 메모리로 해결하기

    개요 EC2 에 접속 후 docker 환경에서 프로젝트 jar 파일과 MySQL 을 실행시킨 후 MySQL 에 접속하려는 순간 EC2 가 멈춰버렸다. 현재, AWS 프리티어 계정으로 EC2 micro 를 사용하고 있는데, RAM 이 무려 1GB 다. RAM 에 비해 실행하는 어플리케이션이 필요한 메모리가 더 커서 서버가 터진 것으로 추측했다. 메모리 부족 시 CPU 에서 스왑 작업을 시행하기 때문에 CPU 사용률이 늘어나게 되는데 서버가 터진 시점의 CPU 사용량을 보면 급격하게 올라가는 것을 볼 수 있다. 해결 방안 크게 2가지 방법이 있다. 첫번째는, 램을 증설하는 것이고 두번째는 스왑 공간을 사용하는 것이다. 첫번째 방법은 현재 비용 문제때문에 프리티어를 사용하는 것이니 배제하기로 하고, 두번째 방..