728x90 728x90 우테코17 테스트 속도 개선 및 리팩토링! 테스트 너무 느려 요즘 카페서비스는 좀 더 스마트한 테스트 환경을 위해 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. [레벨1] 사다리게임 미션 회고 1단계 1단계 PR 1단계는 페어 프로그래밍으로 진행을 했다. 이전 미션 자동차경주 미션에서는 온보딩 팀 내에서 페어가 배정되었는데, 이번 미션에는 정말 쌩랜덤으로 배정이 된 듯하다. 내 페어는 코코닥이었다. 여기 저기 돌아 댕기면서 여러사람과 인사를 나눴다고 생각했었는데, 처음 보는 크루였다. 의견을 거리낌 없이 주고받기 위해 말을 놓고 편하게 지내자는 제안을 했다. 흔쾌히 승낙을 해준 코코닥과 의견을 나누며 기능구현을 시작했다. 새로만난 페어와 나는 코딩스타일이 많이 다른 편인듯 했다. 페어는 설계 부터 꼼꼼히 차근차근 진행하는 편이었고, 나는 머릿속으로 대충 그림을 그려놓고 코드부터 작성하는 편이다. 이제껏 내 방식에 의문을 품은 적이 없었는데, 페어프로그래밍을 진행하며 설계의 중요성을 깨닫게 되었.. 2023. 3. 1. 우아한 테크 코스 5기 백엔드 최종 합격 후기 최종테스트 이후 12월 17일에 최종테스를 마치고, (우테코 5기 최종테스트 회고록) 며칠간은 푹 쉬었다. 테스트 당일 얼마나 긴장을 했는지 자고 일어나니까 어깨가 다 뭉쳤었다. 테스트 이후 발표까지 약 10일간은 진짜 아무것도 안하려고 했는데, 한 이틀 노니까 심심하더라. 그래서 Spring공부를 했다. 인프런에 김영한 님 Spring강의 첫번째 시리즈가 무료이길래, 요걸로 공부를 좀 했다. 그러다보니 크리스마스가 됐고, 크리스마스를 즐겁게 보내고 나니 본격적으로 긴장감이 몰려오기 시작했다. 특히 26일 월요일이 긴장감이 최고로 날뛰었다. 이때의 내 정신상태는 우테코 붙고 나서의 내 모습을 상상함 합격하지도 않았는데 이게 뭐하는 짓인가 싶은 현타 떨어지면 어뜨카지.... 위 세가지가 순차적으로 끊임없이.. 2022. 12. 28. [우테코 5기 프리코스] 최종 코딩 테스트 1. 프리코스 이후 아빠 환갑이랑 프리코스 기간이 겹쳤었다. 깔끔하게 미뤘다. 진짜 불효자 새끼임;; 미뤘던 아빠 환갑파티를 할겸 부산을 다녀오면서 일주일 간은 푹 쉬었다. 다시 집으로 돌아와서 본격적으로 최종 코테 준비를 들어갔다. 사실 이때 기가 많이 죽어있었어서, 1차합격 못하지 않을까란 생각을 많이했었는데, 그래도 공부할 겸, 호오옥시 붙을지도..라는 마음으로 준비를 시작했다. 우선 내가 사는 지역의 최종코테 대비 모각코를 구성했다. 카페에서 모여서 5시간 동안 하나의 미션을 구현하고, 서로 리뷰하는 과정을 거쳤다. 일주일에 한번, 2번을 모였는데, 처음에는 5명이, 두번째는 3명이 참여했다. 근데 사실. 모각코를 하는 날을 제외하곤 제대로 공부를 한날은 손에 꼽는다. 공부가 손에 안잡히더라. '.. 2022. 12. 18. [우테코 5기 프리코스] 4주차 돌아보기 0. 목차 1. 프리코스 끝 2. 과제 3. 많이 고민한 내용 4. 최종 소감 1. 개요 오늘 4주간의 프리코스가 모두 완료되었다. 👏 🎉 이번미션은 진짜 힘들더라. 후우.. 마지막에 예기치 못한 오류 만나서 잠시 당황했는데, 일단은 잘 넘겼고, 일단은 성공적으로 마쳤다. 솔직히 탈진 상태라 아무것도 하기 싫은데, 그래도 까먹기 전에 회고를 후딱 쓰자. 2. 과제 이번 주차 과제는 다리건너기 였다. https://github.com/woowacourse-precourse/java-bridge 처음엔 이게 뭔소린가 했다. 진짜로. GitHub - woowacourse-precourse/java-bridge Contribute to woowacourse-precourse/java-bridge developm.. 2022. 11. 23. [우테코 5기 프리코스] 3주차 돌아보기(11월 16일 추가) 우테코 프리코스 3주차 과제 https://github.com/woowacourse-precourse/java-lotto GitHub - woowacourse-precourse/java-lotto: 로또 미션을 진행하는 저장소 로또 미션을 진행하는 저장소. Contribute to woowacourse-precourse/java-lotto development by creating an account on GitHub. github.com 로또 만들기가 이번 프리코스 과제였다. 로또 살 금액을 입력하면 자동으로 로또 번호가 생성돼서 출력되고, 당첨번호와 보너스 번호를 입력하면 결과가 출력되고, 로또 구매 금액과 당첨금액을 비교해서 수익률이 몇퍼센트인지 출력해주는 프로그램을 만드는 과제였다. 2주차 과제보.. 2022. 11. 15. [우테코 5기 프리코스] 2주차 돌아보기 0. 목차 1. 개요 2. 회고 3. 가장 많이 고민한 부분 4. 정리 1. 개요 어제(11월 7일 월요일) 프리코스 2주차 과제를 제출했다. 지식이 부족해서 일까. 더이상 어딜 고쳐야 될질 모르겠다. 절대 완벽하다는 소리가 아님;; 그.. 뭐랄까. 만약에 내가 건축가라면 좀 잘못지어진 건축물을 보고 '스읍..... 이거이거 건축 할줄 모르네' 라고 하겠지만 일반인들은 '헤헿 건축물 헤헿' 하고 말겠지. 지금 내가 그렇다. '헤헿 야구게임 헤헿' 하고 있다. 회고록이나 쓰고 자바 공부나 해야겠다. 2. 회고 2주차 미션은 야구게임 이었다. 미션을 받고 든 생각은 '역시나.. 근데 왜?' 였다. 우테코 관심있고, 진심인 사람들은 아마 전기수 전전기수 프리코스 문제들 한번씩은 검색해서 풀어봤을거라 생각하는데.. 2022. 11. 8. [우테코 프리코스] 우테코 5기 백엔드 지원 & 프리코스 1주차 회고 0. 목차 1. 개요 2. 우테코 백엔드 지원 3. 프리코스 1주차 회고 0. 개요 어.. 원래는 지원하고 나서 지원 후기 쓰고.. 프리코스 1주차 하고나서 1주차 회고 쓰려 했는데 ㅎ.. 게을렀다기 보단 우선순위에서 밀리다보니 이제서야 쓰게됨ㅋㅋ 그냥 내가 어떤마음으로 우테코를 지원했고, 그 과정이 어떠했는지 기록으로 남겨두고 싶었다. 나중에 다시 볼일이 있을지는 모르지만 일단 남겨둠 본가 냉동실 같은 느낌임 1. 우테코 지원 1-1. 우테코 지원 이유 10개월 간 국비교육을 받았다. 프론트, 백엔드, 블록체인에 대해 전반적으로 배우고, 취업시장에 뛰어 들었다. 근데 난 안뛰어들었다. 살짝 발만 대봤음. 같이 공부하던 20명의 동기들만 뛰어들었다. 취업을 하지 않은 이유는 단순했다. 만족이 안된다. 아.. 2022. 11. 2. 이전 1 다음 728x90 728x90