Archive/예전 TIL

트러블슈팅(: 아웃소싱 프로젝트)

khu2172 2024. 12. 7. 14:12

1. 개요

팀 프로젝트의 유저 파트에서 마땅히 트러블 슈팅을 적을 소재가 없어서 트러블 슈팅에 무엇을 적을지 고민하다가 인터넷 서칭을 했음. 근데 성능 개선을 한 트러블 슈팅 자료들을 접했고, 이 자료들을 통해서 트러블 슈팅은 에러 문제를 해결하는 것뿐만이 아니라, 성능 개선과 관련된 걸 소재로 사용해도 된다는 걸 인지하였음.

 

이후, 리팩토링을 통한 성능 개선과 관련된 트러블 슈팅 자료들을 찾아보면서 유저 파트에선 어떤 것을 성능 개선 시킬 수 있을지 찾아보았음.


2. 문제상황(성능 개선이 필요한 상황)

 

기존 쿼리(findUserByEmailForDuplicateCheck(String email))


Hibernate: 
    /* <criteria> */ select
        u1_0.id,
        u1_0.authority,
        u1_0.created_at,
        u1_0.email,
        u1_0.nickname,
        u1_0.password,
        u1_0.status,
        u1_0.updated_at 
    from
        user u1_0 
    where
        u1_0.email=?

 

 

변경 후 쿼리

Hibernate: 
    /* <criteria> */ select
        u1_0.id 
    from
        user u1_0 
    where
        u1_0.email=? 
    limit
        ?

 

 

개선점

- 필요한 최소 데이터(id)만 조회.

- LIMIT 1을 사용하여 조건을 만족하는 첫 번째 행만 반환.


3. 해결

 

기존 쿼리 분석(findUserByEmailForDuplicateCheck)

- 불필요한 데이터 조회: 이메일 중복 확인은 특정 컬럼(예: id)만으로 충분하지만, 모든 컬럼을 조회함(유저 전체를 조회, 유저 반환).

- 비효율적인 스캔: 조건을 만족하는 행이 여러 개라도 모두 스캔. 중복 확인에서는 첫 번째 행만 필요.

 

개선된 쿼리 분석(existsUserByEmail)

- 최소 데이터 조회: id 컬럼만 조회하여 필요한 데이터 양을 최소화(유저 id만 select해서 존재 여부를 true, false로 반환함).

- LIMIT 1 사용: 첫 번째 조건을 만족한 행만 반환하여 불필요한 작업 제거.


// 이메일 중복 검사 (수정 전)
// userRepository.findUserByEmailForDuplicateCheck(requestDto.getEmail());

// 이메일 중복 검사 (수정 후)
if(userRepository.existsUserByEmail(requestDto.getEmail())){
    throw new CustomException(ErrorCode.DUPLICATE_USER_ID);
}

 

기존 findUserByEmail은 이메일을 통해서 해당 유저가 있는지 조회하고 만약, 있으면 반환하고 없으면 예외 처리를 함. 하지만, only 검증 용도로만 사용하기엔 유저 조회가 불필요한 상황.

 

exitUserByEmail은 이메일을 기준으로 LIMIT1을 사용해서 만약, 조건을 만족하는 데이터가 있으면 바로 true 또는 false 결과를 반환해서 위의 쿼리에서 유저를 조회해 오는 경우보다 필요한 데이터의 양이 적어짐.


4. 결론

기존 쿼리에선 필요로 하는 데이터의 양이 많았지만, 수정 후 쿼리를 통해서 이것을 줄였음.


프로젝트 후기(ex: 어려웠던 점, 아쉬운 점, 느낀 점 등)

팀 깃을 사용하는 게 익숙하지 않아서 어려웠는데 특히, merge까지 하는 과정에서 실수를 할까봐 걱정을 많이 했다. 하지만, 팀원들이 깃 사용법을 자세히 알려줘서 실수하지 않을 수 있었다. 그리고 어노테이션들에 대한 이해도가 부족해서 이를 제대로 활용하지 못했었지만, 프로젝트를 진행하면서 점차 어노테이션들에 대한 이해도가 높아졌다. 하지만,  깃 허브를 활용하는 건 아직 어려운 것 같다. 

 

이번 팀 프로젝트 활동을 하면서 팀원들로부터  많은 것을 배웠다. 모두들 엄청난 노력과 열정을 발휘하여 프로젝트를 수행하는 모습을 보여줬고, 이 과정에서 코드 위드 미, 화면 공유 등을 통해서 적극적으로 소통하고 협력하는 자세에 감탄했다. 또한, 내가 잘 모르는 게 있으면 팀원들이 적극적으로 먼저 다가와서 알려주고 도와줬기 때문에 정말 고마웠다.

팀원 모두가 서로를 배려하고 적극적으로 소통하고 협력하려는 자세로 서로를 도와줬기 때문에 실력이 많이 모자랐던 내가 무사히 이번 프로젝트를 마무리할 수 있었다. 팀원들의 엄청난 열정과 적극적인 의사소통 능력은 정말 본받고 싶은 부분이었다. 팀원들로부터 정말 많은 것을 배울 수 있었고, 팀원들에게 정말 감사하다고 말하고 싶다.