woowacourse-teams / 2022-mo-rak

🥳 모락: 모임을 즐겁게, 편하게!
https://mo-rak.com
50 stars 6 forks source link

역할 정하기 기록 조회하는 로직의 가독성을 개선하고 인덱스를 적용한다. #608

Closed leo0842 closed 1 year ago

leo0842 commented 1 year ago

(필수) 구현한 기능의 commit id 혹은 issue 번호를 명시한다.

458

(필수) 리팩토링할 대상 혹은 작업 내용을 명시한다.

  1. 비즈니스 정책 상 JPQL 에 적용되지 않는 로직이 있기때문에 JdbcTemplate 으로 기록을 조회하고 있어서 가독성이 좋지 않고 영속성을 이용할 수 없다.

@Repository
public class RoleEntityRepositoryImpl implements RoleEntityRepository {

    private List<RoleHistory> queryRoleHistories(Long roleId) {
        return jdbcTemplate.query(
                "SELECT MAX(ID) id, MAX(rh.date_time) date_time "
                        + "FROM role_history rh "
                        + "WHERE rh.role_id = :roleId "
                        + "GROUP BY cast(rh.date_time as DATE) "
                        + "ORDER BY date_time desc",
                new MapSqlParameterSource("roleId", roleId),
                (rs, rowNum) -> new RoleHistory(
                        rs.getLong("id"),
                        rs.getTimestamp("date_time").toLocalDateTime(),
                        new ArrayList<>()
                )
        );
    }

    private void addMatchResults(Map<Long, RoleHistory> idsByHistory) {
        jdbcTemplate.query(
                "SELECT * FROM role_match_result rms WHERE rms.role_history_id in (:ids)",
                new MapSqlParameterSource("ids", idsByHistory.keySet()),
                (rs, rowNum) -> {
                    RoleMatchResult matchResult = new RoleMatchResult(
                            new RoleName(rs.getString("role_name")),
                            rs.getLong("member_id")
                    );
                    RoleHistory history = idsByHistory.get(rs.getLong("role_history_id"));
                    history.getMatchResults().add(matchResult);
                    return null;
                });
    }
}
  1. 데이터를 약 5만건 넣고 테스트를 돌려 보니, 성능이 현저히 떨어진다. image
    • 약 35초 소요