프로젝트 Project

앞선 글에서는 멀티모듈과 MSA란 무엇인지 이론적인 부분을 중점적으로 살펴보았는데요, 직접 멀티모듈을 적용해서 프로젝트 구조를 구성해보겠습니다. 1️⃣ 프로젝트 환경Spring Boot 2.7GradleJava 11JPARest API 2️⃣ 모듈 구성레이어드 아키텍처 기반으로 멀티 모듈을 구성했습니다.commonapi-diaryapplicationauthawscore-mysqlcore-redis구성 시에 jpa 특성상 domain과 infra를 완전히 나누는게 큰 의미가 없다고 생각되어서, domain-infra를 묶어 하나의 모듈로 생성하였습니다. 1.  api-diarypresentation 레이어 모듈로서, 전체 다이어리 서비스의 API 요청과 응답을 처리하는 역할입니다.commonAPI 컨트롤러..
프로젝트의 규모나 성격, 도메인에 따라 사용할 수 있는 캐싱 전략은 다양합니다.카테고리를 전체 조회하는 저의 서비스의 경우, 데이터가 자주 조회됨/변경이 자주 일어나지 않음/용량이 크지 않음 이라는 특성을 가지고 있기 때문에 캐싱을 사용하기로 하였습니다.또한 단일 서버를 사용하고 있으므로 로컬 인메모리로 캐싱하는 Ehcache를 사용하여 빠르게 카테고리 데이터에 접근할 수 있도록 구현하였습니다. 1️⃣ 캐싱 전략카테고리는 조회가 잦지만 수정이 잦지 않다는 점, 그리고 데이터 변경사항에 민감하지 않다는 점을 고려해 가장 일반적으로 쓰이는 look aside + write around 조합(데이터 정합성 이슈가 있음)을 사용할 것입니다. 자세한 캐싱 전략 참고✔️ 캐시 메모리 제거어플리케이션의 로컬 인메모리..
문제 상황게시글을 조회할 때 관련된 좋아요, 해시태그, 카테고리 정보를 함께 조회하면서 페이징처리까지 하는 api가 있습니다.이 때, 게시글의 입장에서 좋아요와 해시태그는 ~toMany 관계이고, 카테고리는 ~toOne의 관계입니다.보통 N+1 문제를 피하기 위해서 연관된 엔티티를 함께 영속화 시키기 위해 lazy loading + fetch join을 사용하는데요, fetch join은 JPA의 Pageable과 함께 사용할 때 문제가 생깁니다. ✔️ 문제 쿼리@Query(value = "select b from Board b " + "join fetch b.category " + "left join fetch b.likes " + "le..
인덱스에 대한 자세한 설명은 인덱스 에서 다루었습니다. 이번에는 인덱스를 직접 적용해서 쿼리 성능을 높여보겠습니다.0️⃣ 인덱스 사전 지식적합한 인덱스가 있는 경우, MySQL은 옵티마이저가 쿼리 실행계획을 통해 자동으로 인덱스를 선택합니다.인덱스는 항상 정렬되어 있는 상태를 유지하기 때문에 해당 컬럼을 이용해 검색할 경우 속도가 향상됩니다.✔️ 성능 향상검색where절에서 칼럼을 이용한 조건 검색이 빨라집니다. where절에서 사용하지 않을 시 인덱스를 타지 않고 full-scan을 하게 됩니다.조인join절에서 인덱스를 활용하면 매칭되는 행을 효율적으로 찾을 수 있습니다.정렬/그룹화order by나 group by절에서 인덱스를 사용하면 빨라집니다.범위 검색날짜나 숫자 범위 등에서 인덱스를 사용할 때..
달래dallae
'프로젝트 Project' 카테고리의 글 목록 (2 Page)