본문 바로가기
728x90
728x90

우테코/요즘카페10

테스트 속도 개선 및 리팩토링! 테스트 너무 느려 요즘 카페서비스는 좀 더 스마트한 테스트 환경을 위해 Testcontainer를 사용하고 있다. 그런데, Testcontainer의 유일한 단점. 테스트 실행시 컨테이너가 실행 되는데, 이 때문에 테스트에 걸리는 시간이 늘어났다. 꼴랑 167개 테스트 돌리는데 58초.. 거의 1분이 걸린다. 테스트 속도를 개선 할 수는 없을까? 개선 1: Application Context 스프링 테스트 프레임워크에는 컨텍스트 캐싱 이라는 기능이 있다. 한 번 로드 된 애플리케이션 컨택스트를 캐시에 저장하고, 동일한 설정과 환경을 가진 후속 테스트에서 해당 캐시 된 컨택스트를 재사용 하는 기능이다. 근데 저 말을 잘 생각해보면, 후속 테스트에서 이전 테스트와 다른 설정과 환경을 갖는 다면 Applica.. 2023. 10. 6.
테스트 컨테이너를 사용하는 이유 + 테스트 격리 도커도 불편해 요즘 카페서비스는 MySql을 사용하고 있는데, 테스트 환경와 운영환경을 최대한 일치 시키기 위해 테스트 역시 MySql을 사용하고 있다. 처음에는 도커 컨테이너를 띄워서 테스트를 돌렸다. 물론 로컬 MySql을 사용하는 것 보다는 관리포인트가 줄어들지만, 이 또한 몇 가지 불편한 점들이 있다. 테스트를 돌리려면 DB 컨테이너를 실행 시켜줘야 한다. 해본 사람은 알겠지만, 이게 은근히 거슬린다. compose 파일 관리도 비용이다. 프로젝트 초반에는 여러 이유들 때문에 compose 파일 변경이 잦았는데, compose 파일을 관리하는 것 역시 비용이 들어가는 행위라는 것을 깨달았다. port를 신경 써야 한다. 맥북을 이틀 간 수리를 맡긴 적이 있었다. 이틀 동안 놀수는 없어서 여자친구 .. 2023. 10. 6.
ID가 있는 엔티티를 save() 할때 발생하는 SELECT 쿼리 없애기 INSERT 하려면 SELECT 2번 나감 최근에 인덱스를 한번 정리하고 싶어서, 서버의 API로 요청이 들어올 때 발생하는 모든 쿼리를 리스트업 했었다. 그리고 다음은 새로운 유저가 OAuth를 통해 로그인 할 때 발생하는 쿼리들이다. Member를 SELECT 하는 쿼리가 두번 발생한 이후에 INSERT 쿼리가 발생한다. 우리 서비스는 로컬 회원가입이 없다. 구글과 카카오를 통한 소셜 로그인만 가능한데, 사용자가 로그인 버튼을 누르고 사용자가 선택한 provider로 부터 사용자의 정보를 받는다. 위 정보를 통해 우리 서비스에 등록된 사용자라면 로그인을, 등록되지 않은 사용자라면 등록 후 로그인을 진행한다. @Transactional public TokenResponse createAccessToke.. 2023. 9. 27.
N+1 해결하기 (발생하는 쿼리 80% 줄이기) N + 1 ORM을 사용하다 보면 무조건 만나게되는 문제가 있다. 바로 N+1. 우리 서비스 역시 N + 1 문제를 마주쳤다. 카페조회 @Entity public class Cafe { @Embedded private Images images; @Embedded private Detail detail; } @Embeddable public class Images { @ElementCollection(fetch = FetchType.LAZY) @CollectionTable(name = "image") private List image; } @Embeddable public class Detail { @ElementCollection(fetch = FetchType.LAZY) private List avai.. 2023. 9. 19.
공간 인덱스로 조회속도 32배 개선하기(요즘 카페 지도 기능 개발) 우리 서비스에 지도 기능을 추가하기로 하였다. 계획은 다음과 같다. 회색선이 교차되는 부분이 지도의 중심점이다. 지도의 중심점을 기준으로 원을 그리고 원 안에 포함되는 카페들을 핀으로 보여주기로 하였다. 현재 우리서비스에서 사용하는 MySql에는 공간에 대한 정보를 담을 수 있는 공간 데이터와 이 공간데이터를 효율적으로 이용할 수 있는 공간 함수, 그리고 검색의 성능을 올릴 수 있는 공간 인덱스가 존재 한다. 이것들을 이용해보려 한다. 1. MySql 공간 데이터 다루기 MySql에서 제공하는 공간데이터의 종류는 위와 같다. 단일 타입으로는 Point, LineString, Polygon 이 세가지가 있고, 나머지들은 이 세가지 타입의 조합이다. 현재 개발하려는 기능은 각 카페마다 좌표를 갖고 있어야 하.. 2023. 9. 17.
이미지 리사이즈 성능 개선하기 1. 카페 등록이 너무 느리다. 요즘 카페 서비스는 카페를 트렌디함을 사진으로 보여주는 서비스인데, 사진의 용량이 너무 크기에 화면에 랜더링되는 속도가 너무 느린 문제가 있었다. 그렇기에 이미지를 필요한 크기에 따라 리사이즈 하는 기능을 추가했었다. 그런데 리사이즈 기능을 추가하고 나니, 카페를 등록하는 요청을 처리하는 시간이 너무 오래걸린다. public List resizeAndUpload(final List files, final List sizes) { final List resizers = files.stream() .map(this::multipartfileToImageResizer) .toList(); final long start = System.currentTimeMillis(); res.. 2023. 9. 14.
Java + Spring 이미지 리사이즈 1. 이미지 리사이즈를 한 이유 몇 주전 요즘카페 서비스를 실제 사용자들에게 배포 후, 설문을 통해 피드백을 받았다. 피드백의 내용 중 압도적으로 많은 내용을 차지하는 것이 이미지 로딩 속도와 관련된 것이었다. 현재 요즘 카페에서 보여지고 있는 모든 이미지들은 최대한 예쁘고 잘나온 사진들의 원본을 EC2의 로컬에 저장해두고, 저장된 원본사진을 그대로 보여주고 있었다. 이러한 방식 때문에 이미지 로딩에 긴 시간이 걸릴 뿐 더러, 데이터 사용량 또한 상당히 높았다. 이를 해결하기 위해, 이미지 업로드 시 리사이징을 진행한 후 S3에 업로드를 하기로 하였다. 2. 리사이즈 툴 선정 우선 리사이즈를 할 툴을 선정해야했다. 고려했던 툴은 다음과 같다. marvin thumbnailator Imgscalr 2DGr.. 2023. 9. 4.
RestDocs + OAS 도입기 (feat. RestAssured) 1. API 문서 자동화의 이유 프로젝트를 진행하면서, 이전까지는 Notion을 이용해 API docs 를 작성하고 관리하였다. 하지만 당연하게도 기능개발을 하면서 몇몇 이유로 API docs를 수정해야 하는 일이 생겼다. 그때마다 노션에 들어가서 API docs를 변경하는 것은 여간 번거로운 일이 아니었다. 심지어 어떤 때는 기능개발에 정신이 팔려 API docs의 업데이트를 새까맣게 까먹고 있다가, 프론트에서 변경 전 API 주소로 요청을 하는 경우도 있었다. 해야된다는 것은 문제가 터지기 전부터 인지하고 있었으나, 기능 개발이 우선 이란 마음에 차일피일 미루다, 더 이상은 미룰 수 없다! 라는 마음으로 API 문서 자동화를 진행하기로 했다. 2. RestDocs vs Swagger 그리고 OAS 이.. 2023. 9. 1.
RestAssured & @Transactional 방금 저장한 데이터를 못찾아요 1. 조회 실패 프로젝트를 진행하며 간단한 테스트코드를 작성하다가, 원하는 대로 동작하지 않는 경우가 있었다. 다음은 문제가 발생한 테스트코드이다. @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class MemberTest { @LocalServerPort int port; @Autowired private MemberRepository memberRepository; @BeforeEach void setUp() { RestAssured.port = port; } @Test @Transactional @DisplayName("멤버를 조회한다") void findMemberTest() { //given final Member me.. 2023. 8. 22.
[요즘카페 트러블슈팅] orElse + JPA 콜라보로 DB가 날라감;; 우테코 레벨3 프로젝트로 진행하고 있는 요즘 카페를 진행하며 경험한 트러블 슈팅입니다. MVP까지 기능 개발을 끝낸 뒤, release를 위해 팀 내부에서 자체적으로 QA를 진행했다. 몇 가지의 테스트를 진행하던 도중 정말 이상한 버그를 발견했다. 특정 상황에서 사용자의 좋아요 목록이 초기화 되는 해괴한 버그였다. 몇번의 테스트를 통해서 좋아요 목록이 초기화 되는 플로우를 찾아냈다. 회원가입을 한다. 카페 정보에 좋아요 를 누른다. 로그아웃 후 다시 로그인 한다. 좋아요 목록이 뿅하고 사라진다...? 좋아요 목록이 사라지는 원인은 결국 DB에 있던 사용자의 좋아요 목록이 모두 다 삭제 되는 것이 원인이었는데, 왜 때문에 이런일이 일어나는지 이유를 찾기위해 위의 워크 플로우와 동일한 테스트 코드를 작성했다.. 2023. 8. 6.
728x90
728x90