public interface EntityA_Repository extends JpaRepository<EntityA, Long> {
@Cacheable(cacheNames = CachingConfig.CACHE_NAME_1, key = "{...}")
@Query("...")
Optional<EntityA> findByUniqueKeys(...);
...
}
public interface EntityB_Repository extends JpaRepository<EntityB, Long> {
@Cacheable(cacheNames = CachingConfig.CACHE_NAME_2, key = "{...}")
@Query("...")
Optional<EntityB> findByUniqueKeys(...);
...
}
public interface EntityC_Repository extends JpaRepository<EntityC, Long> {
@Cacheable(cacheNames = CachingConfig.CACHE_NAME_3, key = "{...}")
@Query("...")
Optional<EntityC> findByUniqueKeys(...);
...
}
EntityA, EntityB, EntityC 중에 DB 에서는 EntityC 만 알면, 다른 Entity는 조인으로 알 수 있다.
요청상 EntityC 에 대하여 모든 요청이 골고루 들어오는것이 아니라 특정 id 의 EntityC 에대한 요청이 자주 들어온다.
엔티티의 도메인적 역할보다는 있는 데이터를 그대로 보여주는것이 메인인서비스이다.
속도가 매우매우 중요한 서비스이다.
public class EntityRelatedDto implements Serializable {
//EntityA
private Long a_property_1;
private String a_property_2;
//EntityB
private Long b_property_1;
private Long b_property_2;
private String b_property_3;
//EntityC
private Long c_property_1;
private Long c_property_2;
private Long c_property_3;
}
@Slf4j
@Service
@RequiredArgsConstructor
public class EntityParsingService {
private final EntityA_Repository EntityA_REPOSITORY; // EntityA + EntityA_2 FETCH JOIN
private final EntityB_Repository EntityB_REPOSITORY; // EntityB + EntityB_2 FETCH JOIN
private final EntityC_Repository EntityC_REPOSITORY; // EntityC + EntityC_2 + EntityC_3 LEFT OUTER JOIN
@Cacheable(
value = "EntityParseDtoCache",
key = "#requestDto.request.info.entityD")
public SspEntityParseDto requestParsing(RequestParseDto requestDto) {
RequestInfo info = requestDto.getSspRequest().getSspInfo();
EntityA entityA = EntityA_REPOSITORY.findById(info.getPublisherId())
.orElseThrow(() -> new Exception());
EntityB entityB = EntityB_REPOSITORY.findBySspIdAndAdClassId(info.getId(), info.getClassId())
.orElseThrow(() -> new Exception());
EntityC entityC = EntityC_REPOSITORY.findById(info.getPid())
.orElseThrow(() -> new Exception());
return EntityParseDto.builder()
.aEntityProperty_1(entityA.getProperty1())
.aEntityProperty_2(entityA.getProperty2())
.bEntityProperty_1(entityB.getProperty1())
.bEntityProperty_2(entityB.getProperty2())
.bEntityProperty_3(entityB.getProperty3())
.cEntityProperty_1(entityC.getProperty1())
.cEntityProperty_2(entityC.getProperty2())
.cEntityProperty_3(entityC.getProperty3())
.build();
}
}
기존
개선
기존
개선
배포 시점(5/30) 이후로 DB 의 network transmit 에서 Bytes/Second 지표가 전반적으로 낮아진 것 확인
기존 - 고점 기준: 330k
개선 - 고점 기준: 261K
DB 를 연결하고 있는 커넥션 수 감소
CPU 평균 사용율 감소
쿼리량 감소