Skip to main content

Command Palette

Search for a command to run...

선착순 출석체크, firefinger 개발 중 고민

Updated
•2 min read•View as Markdown
선착순 출석체크, firefinger 개발 중 고민

복불복에 대해 회의한 뒤 생긴 고민

→ 조회할때마다 동시 출석자의 순서가 바뀔 수도 있지 않을까?

생각의 오류

  • API 를 여러번 조회해보았을때, 동시 출석자의 순서는 바뀌지 않았다.

  • 나는 이것이 mysql 내부에서 데이터를 정렬하는 로직에 있어서 “어떠한 규칙”을 통해 조회되기 때문이라 생각했다.

  • 하지만..! 나의 생각은 일부는 맞고 일부는 틀렸다. 왜냐하면 mysql 은 데이터를 조회할때, 인덱스 정렬 또는 파일정렬을 사용하는데 추가로 캐싱을 사용한다.

  • 첫번째 실행에서 쿼리 결과를 캐싱하고, 이후 실행에서도 동일한 정렬을 유지한다.

  • 그렇기때문에 내가 시도 했던 여러번의 api 조회에서는 같은 updated_date를 가진 데이터들이 특정 실행환경에서 동일한 순서로 나온것이었다.

순서가 보장되지 않는 경우

Mysql 의 정렬방식과 캐싱을 통해서 데이터의 순서가 보장되지 않는경우를 생각해볼 수 있다.

  1. Mysql 내부 정렬 방식이 최적화되면서 결과 순서가 변할 가능성.

    지금 당장은 updated_date 의 순서가 유지 되지만, 이후 데이터가 증가하거나 Mysql 내부 정렬 방식이 변경되면 결과가 달라질 수 있다.

  2. file sort를 사용하는 경우

    말그대로 데이터를 가지고 정렬하는것이기 때문에 동일한 데이터의 경우 조회하는 순서가 바뀔 수 있다.

순서가 보장되는 경우

  1. index sort 를 사용하는 경우

    index sort란, Mysql 이 order by를 처리할 때, 테이블의 인덱스를 활용하여 데이터를 정렬하는 방식이다.

  2. file sort로만 정렬하는것이아니라 index sort 를 정렬기준에 추가하는 경우

Mysql explain

→ 설명해줘~!

mysql 이 어떤 정렬을 사용해서 데이터를 가져오는지 explain 키워드를 통해 알 수 있다.

EXPLAIN SELECT * 
FROM attend 
WHERE attend_program_id = 113 
AND attend_status = 'ATTEND' 
ORDER BY updated_date ASC 
LIMIT 10;

그럼 파이어 핑거의 기존 쿼리는 어떤 정렬을 사용할까?

  • Using fileSort → 파일 정렬이 사용됨

  • Using index → 인덱스를 사용하여 정렬

파이어핑거의 쿼리는 “Using filesort“로, 파일정렬이 사용되고 있었고, file sort 의 경우 데이터를 가지고 정렬하기 때문에 동일한 데이터를 조회시 동일한 조회순서를 보장하지 않는다.

Mysql show

만약 인덱스 정렬을 사용하고 있다면, 어떤것을 인덱스로 정하고 정렬하고 있는지 알려줘!

SHOW INDEX FROM attend;

attend_id, attend_program_id, attend_status를 인덱스로 사용하고 있다는것을 알수 있다.


앞으로의 방향

현재의 Fire finger 기능에서는 파일정렬을 사용하고 있으며, updated_date의 값을 기준으로 정렬하고 있기 때문에 Mysql 에서 캐싱값, 정렬 최적화가 달라질 경우 같은 등수에 대해 순서가 바뀌어 나올 가능성이 존재한다는 것을 확인했다.

이를 해결하기 위해서는 updated_date 외에, 인덱스 정렬을 사용할 수 있는 기준값을 추가하는것이 순서를 확실히 보장할 수 있다. 그렇기 때문에, 또다른 정렬 기준값인 순서 컬럼을 추가하고 2가지 기준으로 정렬하고자 한다.

61 views
김
김종민1y ago

비밀 댓글입니다.

More from this blog

Jpa 영속성 컨텍스트 및 이점

영속성 컨텍스트란? 영속성 컨텍스트란 엔티티를 영구 저장하는 환경으로 JPA가 엔티티를 메모리에서 관리하는 공간이다. 엔티티 매니저 팩토리를 통해서 고객의 요청이 올때마다 엔티티 매니저를 생성하고, 이때 엔티티 매니저와 1:1로 영속성 컨텍스트가 생긴다. EntityManaver.persist(entity); 위의 코드에서 entity는 persist 됨과 동시에 영속성 컨텍스트에서 관리하게된다. 영속성 컨텍스트에서 관리한다는것은 DB 에 저...

Jul 6, 20253 min read29
Jpa 영속성 컨텍스트 및 이점

CI/CD 적용 이후 고민과 Health Check 도입

EEOS 로그인이 안되는데요? CI/CD 적용 후 슬랙에는 배포 성공 알림이 올라왔고, 당연히 배포가 완료 된줄 알았다. 서버에 접속해보니 테이블 변경 오류로 애플리케이션 실행이 제대로 되지 않은 상태였다. 문제 상황 기존 CI/CD workflow 는 배포 성공 및 실패에 따라 슬랙 메세지가 전송되는 로직으로 작성 되어있지만, 여기서 “성공“은 CD 코드가 끝까지 실행되었을때이다. 만약 CD 코드가 모두 실행되고 슬랙 메세지까지 전송되면 ac...

Jun 11, 20253 min read69
CI/CD 적용 이후 고민과 Health Check 도입

Redis 캐싱전략 - Cache Aside, Write Around

캐시(Cache), 캐싱(Caching)이란? 캐시란, 원본 저장소보다 빠르게 가져올 수 있는 임시 데이터 저장소 캐싱이란? 캐싱이란, 캐시(임시저장소)에 접근해서 데이터를 빠르게 가져오는 방식을 의미한다. 예시) “이 API는 응답 속도가 너무 느린데? 이 응답 데이터는 캐싱(Cahing) 해두고 쓰는 게 어때?’ 데이터를 캐싱할때 사용하는 전략(Cache Aside, Write Around) 레디스를 캐스로 쓸때 어떤 방식으로 사용할지 ...

Jun 1, 20251 min read20
Redis 캐싱전략 - Cache Aside, Write Around

try catch finally VS try with resources

예외를 처리할때, 사용한 외부자원은 반드시 반납해야한다. 예외 처리는 try catch finally 와 try with resources 두가지 구문으로 처리할 수 있는데 이 둘의 가장 큰 차이는 자원을 반납하는 방식에 있다. try catch finally 예외 처리 시 외부자원은 사용후 반드시 반납되어야 한다. 자바는 이것을 위해 어떤 경우라도 반드시 호출되는 finally 기능을 제공한다. try - catch - finally 구조는...

May 27, 20252 min read24
try catch finally VS try with resources

Dongda's Log

5 posts