"10초에서 3초로 단축"
빅데이터를 사용하여 사용자 취향에 기반한 레시피 추천 플랫폼을 제작한 경험이 있습니다. 저는 Django에서 컨텐츠 기반 필터링을 사용하여 연관레시피를 추천해주는 기능 구현을 담당하였습니다. Python을 사용하여 크롤링을 통해 5000여 개의 레시피 데이터를 가져왔으며, 7만여 개의 리뷰 데이터를 가공하였습니다.
컨텐츠 기반 필터링을 사용하여 비슷한 재료로 만들 수 있는 레시피를 추천하는 기능을 구현하는 데에 성공하였지만, 문제가 발생하였습니다. 해당 데이터를 받아오는데 10초가량 걸리면서 서비스를 이용하는 데 불편함이 있다는 것이었습니다. 원인을 파악하기 위해 코드를 한줄씩 실행시키며 테스트를 진행하였습니다. 그 결과, 데이터를 받아오는데 오래 걸리는 원인은 query에 있었습니다. 리뷰 데이터가 7만여개 다보니 성능을 저하시키는 주 원인이었고 , 5개의 테이블이 한꺼번에 조인되면서 query의 성능이 급격히 저하 되었습니다. 따라서 리뷰 테이블과 레시피-해시태그-재료-재료이름 4개의 테이블을 조인하여 따로 불러왔으며 필요한 컬럼으로만 구성하였습니다. 데이터를 받아오는 데에 10초가 걸리던 API가 3초로 줄어들게 되었습니다. 시간은 단축되었지만, 초반 DB 설계 시 반복적인 조인을 줄이기 위해 반정규화를 진행하였다면 시간이 좀 더 절약됐을 것 같다는 아쉬움이 남았습니다.
결과적으로 프로젝트는 성공적으로 마무리되었으며, 시간이 걸리더라도 꼼꼼한 설계의 중요성에 대해 깨달았습니다.좋은점 1
"엔티티와 DTO를 구분해야 하는 이유"
끊임없는 도전정신과 끈기로 여행 플랫폼 제작 프로젝트의 백엔드 개발을 맡아 SSAFY 공통프로젝트 대회에서 우수상 수상에 기여한 경험이 있습니다. SpringBoot를 기반으로 한 백엔드를 맡게 되었고, 한 번도 배워보지 않은 JPA를 적용해보기로 하였습니다. 물론 MyBatis를 쓰는 것이 익숙하였지만 JPA가 성능, 생산성, 유지보수 면에서 우수하다고 알려져 있어 JPA를 적용해 새로운 기술을 익히고자 하였습니다.
하지만 JPA가 익숙하지 않아 개발 도중 문제가 발생하였습니다. 엔티티에 다른 테이블들을 매핑시키고 나니 무한 루프를 돌아 에러가 발생하였습니다. 또한, 응답에서는 불필요한 데이터까지 제공되어 응답 데이터의 양이 많아지는 현상이 발생하였습니다. 이러한 문제점은 엔티티와 DTO를 따로 생성해 주지 않아서 발생하는 것임을 뒤늦게 알게 되었습니다. DTO는 Request/ Response에서 사용하는 View를 위한 클래스이고, 자주 변경이 필요하므로 따로 분리해서 생성하는 것이 적합하다는 것을 깨달았습니다. 이를 해결하기 위해 DTO를 따로 생성해 주었고, BeanUtils.copyProperties 메소드를 사용하여 엔티티에서 DTO로 변환해주는 작업을 수행하였습니다. 모두 수정하는 데까지 시간이 오래 걸렸지만 DTO의 필요성과 DTO가 설계서의 역할을 해준다는 것을 깨달았습니다.좋은점 2
새로운 기술을 습득하려는 도전정신과 문제를 해결하려는 끈기 덕분에 성공적으로 프로젝트를 마치고 우수상을 수상할 수 있었습니다.
좋은점 1 지원직무와 연관이 있는 개발 경험을 제시한 점이 좋고, 질문의 요구 사항을 정확하게 반영한 점도 좋습니다. 당시 경험을 구체적으로 설명하고 있어 이야기가 신뢰가 간다는 점도 좋습니다.
좋은점 2 이 부분 역시, 지원직무와 연관이 있는 개발 경험을 제시한 점이 좋고, 질문의 요구 사항을 정확하게 반영한 점도 좋습니다. 당시 경험을 구체적으로 설명하고 있어 이야기가 신뢰가 간다는 점도 좋습니다.