알뜰폰 요금제 변경하기

KT M 모바일(KT 알뜰폰(MVNO, Mobile Virtual Network Operator) 통신사)에서 1만원 정도의 요금제 사용하고 있었다.
모요(모두의 요금제, 알뜰폰 요금제를 검색)를 가입하고 같은 가격에 데이터가 2배고 혜택도 더 많아서 요금제 변경을 했다.

쉐이크 모바일 통신사의 쉐이크 LTE 15GB+1Mbps, 매월 네이버페이 5,000 지급, 사은품 3개월마다 20GB 쿠폰등, 7개월까지만 9천원 요금이다.

모요에서 esim 사용(2~3,000원정도 발급 비용 발생), 번호이동으로 개통 절차
- EID(esim 식별번호, esim 저장할 칩(eUICC)에 새겨진 번호), IMEI(단말기 식별번호, 갤럭시s25는 IMEI2까지 있어 둘다 입력해야한다.)를 핸드폰에서 찾아 입력해야 한다.
- pass 인증앱으로 주민등록증 or 운전면허증 + 얼굴 인증이 필요하다
- 은행 자동 이체(시간이 자정 30분 전후로는 안된다.) or 카드 결제 정보를 입력한다.
- 이전 통신사(KT M 모바일) 문자를 받고 문자에 적힌 ARS 로 전화해 번호이동을 선택한다.
- 이전 통신사에서 해지가 됐다는 문자를 받고 개통이 진행중이었다. 이때 집에 정전이돼 wifi 를 사용하지 못하는 상황이였다. 개통은 완료되지 않은 상태라 네트워크, 전화도 안됐다. 다시 전기가 들어온 후 개통 완료와 add esim 이 뜨면 esim을 설치할 수 있었다.

개통 후 필요한 작업
- 기존 sim은 비활성화, 새로 받은 esim 으로 전화번호,문자,데이터를 사용하도록 설정해야 한다.
- 통신사/esim 이 변경돼 pass 앱을 실행하면 초기화하라고 뜬다. 초기화 후 이름, 생년월일, 계좌확인으로 인증서를 새로 생성해야 한다.
- 통신사/esim 이 변경돼 삼성페이 인증을 다시 해야 한다.

사용량 조회 확인하기
- 쉐이크 모바일 통신사는 앱이 없다. 통신사 홈페이지를 찾아 가입했는데 사용량 조회 기능이 없다. KT 회선을 이용하는 통신사들은 KT마이아뜰폰 이라는 앱을 사용하라고 하는데 s25같은 최신폰에선 설치가 안된다고 나온다.
- https://ktmyr.com/ 웹 사이트를 가입(네이버 로그인 연동도 해둬야 편하다.)하니 사용량을 볼 수 있었다. 폰에 홈페이지 바로가기 링크 추가

요금이 저렴해서 좋긴 한데 할인이 끝나는 7개월 안에 다른 요금제로 변경해야 한다. 또 이런 과정을 거쳐야 한다고 생각하니 좀 귀찮을것 같긴 하다.

homebrew disabled the alacritty cask

brew install alacritty 를 해도 안되고
 alacritty (disabled)

brew install --cask alacritty 를 해도 다음과 같이 mac gatekeeper 를 통과하지 못해 설치를 못한다고 한다.
Error: alacritty: Cask 'alacritty' has been disabled because it does not pass the macOS Gatekeeper check! It was disabled on 2026-09-01.

homebrew gatekeeper(맥에 내장된 기본 보안 기능으로 인터넷이나 외부 경로로 다운로드한 응용프로그램이 안전한지 검증하고 신뢰할 수 없으면 실행을 차단) 통과 필수 적용
- 5.0.0 릴리스 공지에서 gatekeeper 를 통과하는 패키지만 설치 가능
- cask 비활성화 사유를 unsigned에서 fails_gatekeeper_check로 바꾼 PR
- alacritty cask disable 처리
- alacritty 같이 .app을 빌드하는 formula는 받지 않는다는 규정

alacritty 대응
- 공증(gatekeepe 통과를 위한 서명) 논의https://github.com/alacritty/alacritty/issues/8749

공증을 받으려면 apple developer 계정이 필요하고 연 $99 비용이 든다.
메인테이너(chrisduerr)는 이를 "scam", "ransom" 이라고 거부하고 비용을 대신 내겠다는 댓글도 스팸으로 보겠다고 한다.
homebrew 가 소스를 받아 직접 빌드하고 서명해서 배포해야 한다고 주장하지만 homebrew는 .app을 빌드하는 formula를 받지 않고 있다.
homebrew 쪽에서 alacritty 전용 tap(외부 저장소, tap 있다면 brew install 가능하고, 맥에서 실행시 인증되지 않은 프로그램 허용하면 실행까지 된다.)을 만들라고 제안했지만 alacritty 는 만들지 않고 있다.

흠, 그냥 cargo 로 설치하자.
cargo install alacritty

mysql for update deadlock

mysql db 를 사용하는 api server(golang) 에서 2개의 insert 요청 발생중 deadlock 이 발생했다.
Error 1213 (40001): Deadlock found when trying to get lock

InnoDB 인덱스는 행 사이에는 gap 이라는 빈 구간이 있다.
a행 - (gap) - b행 - (gap) - c행

다음과 같은 A,B 양쪽에서 insert 하기전 존재 여부를 판단하기 위해 for update 로 gap lock 을 획득하려고 했다. 
A: SELECT d FOR UPDATE -> 없음 -> gap lock 획득 
B: SELECT e FOR UPDATE -> 없음 -> gap lock 획득 (gap lock 끼리는 공존)
A: INSERT or UPDATE d -> B 의 gap lock 에 막혀 대기
B: INSERT or UPDATE e -> A 의 gap lock 에 막혀 대기
서로를 기다리는 데드락 상태가 된다.
InnoDB 기본설정에 innodb_deadlock_detect=ON 있어 데드락을 감지하고 한쪽을 롤백시킨다.

User (부모 테이블) - UserResource (자식 테이블)  있다고 했을때

// 있으면 update 없으면 insert
func saveUserResource(tx *gorm.DB, userID uint64, val int64) error {
        // 수정 전 - 자식 테이블에 아직 없는 행을 잠그면 데드락 발생할 수 있다.
        // var userRC entity.UserResource
        // err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).Where("`user_id`=?", userID).Take(&userRC).Error

        // 수정 후
        // 항상 존재하는 부모 users 행을 PK 로 잠가 같은 사용자의 저장을 줄 세운다 (record lock).
        if err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).
                Model(&entity.User{}).
                Select("`id`").
                Where("`id`=?", userID).
                Take(&entity.User{}).Error; err != nil {
                return err // 부모가 없으면 ErrRecordNotFound
        }
        // 자식 행은 잠금 없이 조회한다. 부모 잠금 덕분에 같은 사용자의 다른 저장은 여기 들어오지 못하고 기다린다.
        var userRC entity.UserResource
        err := tx.Where("`user_id`=?", userID).Take(&userRC).Error
        if errors.Is(err, gorm.ErrRecordNotFound) {
                return tx.Create(&entity.UserResource{UserID: userID, Val: val}).Error
        } else if err != nil {
                return err
        }
        return tx.Model(&userRC).Update("val", val).Error
}

Prev