조각들
[트러블슈팅] 간헐적으로 모든 api가 안 돌아가고 러닝 data가 날아갔던 버그
[트러블슈팅] 간헐적으로 모든 api가 안 돌아가고 러닝 data가 날아갔던 버그
2023.08.11현재 Runnect에서 open api를 제외한 나머지 api는 모두 accessToken과 refreshToken을 request header에 넣어서 보내주고 있다. token이 유효해야 api를 정상적으로 이용할 수 있다. 만약 token이 만료되면 서버로 보내서 갱신을 시켜주도록 하고있다. 그런데 가끔 open api를 제외한 나머지 모든 api가 안 돌아가는 문제가 있었다. "토큰 갱신에 문제가 있었나?"하고 수집된 log를 보면 역시나 token이 만료됐다는 error message가 날아왔다. 난처했던 건 이러한 버그가 갱신 logic 상에 문제가 없어보이는 상황에서 간헐적으로 발생한다는 것이었다. 이 때문에 단순히 유효한 token이 아니라는 message만으로는 어떠한 상황 때문에 발생하..
[트러블슈팅] Log로는 파악할 수 없었던 Timer 관련 버그
[트러블슈팅] Log로는 파악할 수 없었던 Timer 관련 버그
2023.08.11음악 어플처럼 백그라운드에서 작업을 계속해서 돌릴 경우 조치를 취해주어야 한다는 것은 알고 있었다. 그런데 Runnect 서비스에서 처음 Timer 기능을 구현할 때 다른 앱으로 전환해도 log가 잘 찍히길래 알아서 잘 되는 줄 알고 별다른 작업을 해주지 않았다. 앱을 일정 시간 동안 백그라운드(다른 앱, 화면 잠금)에 켜놔도 앱이 안 죽기도 했다. 그런데 앱이 죽지는 않는데 가끔씩 앱에 재접속 했을 때 돌려놨던 Timer가 초기화 된다거나 1시간을 돌렸는데 40분으로 반영이 되어있다는 등 비정상적인 동작이 있다는 보고를 받았다. 백그라운드 관련 조치를 취해주지 않았던 것이 원인임을 짐작하는 게 어렵지 않았다. 그래서 Timer를 생성하고 돌리는 logic을 Service를 생성해서 분리시켜주었다. 이..
코틀린 스터디 - 4장
코틀린 스터디 - 4장
2023.08.06함수 몸체부 내에 정의할 수 있는 대상 지역 함수 지역 클래스: 보통 함수 기능이 커지면 클래스로 변환하여 정의해서 사용하므로 실제 사용할 일은 별로 없다. object 표현식으로 정의해서 객체를 사용할 수 있다. 단일 표현식 함수 코드 블록의 하나의 라인으로 처리되는 경우를 단일 표현식이라고 한다. 간단한 표현식만 있는 경우는 블록을 생략하고 한 줄로 작성하는 단일표현식으로 작성할 수도 있다. 보통 = 연산자 다음에 표현식을 사용해서 처리한다. 단일 표현식으로 함수 코드 블록을 구성하면 단일 표현식을 추론해 반환 자료형을 추론할 수 있으므로 반환 자료형을 생략한다. 함수 오버로딩 함수 식별자는 함수 이름과 시그니처인 함수 매개변수의 개수와 자료형으로 구성한다. 그래서 같은 이름의 함수를 여러 개 정의할..
코틀린 스터디 3장
코틀린 스터디 3장
2023.07.30비교연산자 비교연산자도 연산자 표현과 메서드 처리 두 가지 방식을 제공한다. 비교연산자를 메서드로 사용할 때는 compareTo 메서드가 실행되며 이 메서드의 결과는 기본으로 0, 음수, 양수로 나뉜다. 결괏값 설명 0 두 항이 동일한 경우 negative integer 첫 번째 항이 작은 경우 positive integer 첫 번째 항이 큰 경우 val a = 100 val b = 20 println(a.compareTo(b) >= 0 ) // 두 수의 크기 비교 // true 포함연산자 특정 범위에 속한 값에 포함 여부를 확인할 때는 이 연산자를 사용한다. 연산자 표현식 상응하는 메서드 in a in b b.contains(a) !in a !in b !b.contains(a) var height = ..
코틀린 스터디 - 2장
코틀린 스터디 - 2장
2023.07.23리터럴 변수에 할당되거나 표현식에서 사용되는 고정된 값 매직 리터럴(넘버)을 사용하면 해당 숫자가 어떤 의미인지 바로 파악이 어렵습니다. 따라서 이를 지양하고 상수를 사용해서 직관성을 높이는 것이 좋습니다. 위의 코드는 제가 작업하고 있는 프로젝트에서 counter 변수에 사용되고 있던 매직 넘버를 상수로 리팩토링한 예시입니다. val, var 변수를 선언할 때 value를 재할당할 수 있는 경우 var을 사용하고, 그렇지 않을 경우 val을 사용합니다. time은 var로 선언된 변수입니다. "val로 선언한 변수는 value 재할당이 안 되지 않나? time은 가변적이어서 hour 값이 계속 바뀌니까 hour, minute, second는 var로 선언돼야하는 거 아닌가?"라는 생각이 들면서 헷갈릴 ..
[의견대립] Dialog 확장함수를 어떻게 쓸 것인가
[의견대립] Dialog 확장함수를 어떻게 쓸 것인가
2023.07.21배경프로젝트에서 AlertDialog가 많이 사용되는데 객체를 생성하는 부분은 공통이라 보일러 플레이트 코드가 된다. 이것을 지양하고 편의성을 높이고자 팀원이 확장함수를 만들어주었는데 코드는 아래와 같다. 이 확장함수는 하나의 xml만 inflate하고 그 안에 들어가는 text나 event를 dialog 객체 생성할 때 직접 입력해주는 식이다. 이렇게 하면 같은 layout일 경우에만 유용하고 조금이라도 수정 사항이 생기거나 새 디자인의 dialog가 추가되었을 때 커버할 수 없다. 따라서 나는 아래와 같은 확장함수를 직접 만들어주었다. dialog의 디자인이 어떻든 xml만 잘 만들어서 inflate해주면 기존의 코드를 건드리는 일 없이 모든 경우를 커버할 수 있다. 기존 확장함수의 한계를 해결할 ..