-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
주요 이슈들 해결 #78
주요 이슈들 해결 #78
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
게스트 모드 나가기 버튼이 제대로 동작하지 않습니다..! 확인 부탁드려요
상황을 조금 더 구체적으로 말씀해주시면 버그 해결하는 데 도움이 될 것 같습니다! 그리고 앱 한번 삭제 후 재설치해서 다시 테스트 부탁드려요! |
항상 재설치 후 테스트하고 있습니다ㅠㅠ그냥 버튼을 눌러도 동작하지 않습니다 |
저도 동일하게 게스트모드를 처음 눌렀을 때 반응이 없습니다. 다만 다시 누를 경우 에러가 뜹니다. 게스트 모드 id를 지우는데는 성공하지만 실제 나가지는 함수쪽에서 문제가 생기는 것 같습니다.
|
1.게스트모드로 들어가서 앱을 껐다 키면 게스트모드로 들어가는 것을 확인했습니다. 다만 weight table 값이 보존이 안 되고 있습니다. 추가된 상징과 weight table row는 남아있는 것을 봐선 db에 작성된 값이 앱 종료 될때 저장이 안 되는 것 같습니다. 해당 문제 외에는 정상적으로 작동하는 것 같습니다. |
게스트 모드 나가기 버튼 눌러도 동작하지 않는 문제는 해결했는데요. weightTable 관련 버그는 SeedDatabaseWorker에서 500*500 0으로 초기화하고 upsertAll하는 코드 때문에 발생하는 것으로 보입니다. (SeedDatabaseWorker 코드 28-34번째 줄) 앱 시작 시 웨이트테이블 초기화하는 코드는 제가 짠 게 아니라서 @paul2126 님이나 @JH747 님께서 수정하셔야 할 것 같습니다. |
…/swpp-2023-project-team-6 into hotfix/logout-and-withdraw
해당 문제 해결해서 올렸습니다. 저장 방식에서 잘못되고있는 줄 알고 삽질하고 있었는데 방향 알려주셔서 살았어요ㅎㅎ |
PR Title: 주요 이슈들 해결
Related Issue(s):
Link or reference any related issues or tickets.
PR Description:
로그아웃, 회원탈퇴 시 cleanup 과정을 정리했습니다.
1.1. 기본적으로 각 저장소에는 관련된 Repository만 접근한다는 원칙을 지켰습니다. (예시: authTokenPrefsManager는 authRepository에서만 접근, settingsPrefsManager는 settingRepository에서만 접근, userDao는 userRepository에서만 접근)
1.2. 따라서 로그아웃 시 cleanup 로직은 다음과 같습니다.
1.2.1. AccountSettingsViewModel에서 AuthRepository로 로그아웃 요청
1.2.2. AuthRepository는 AuthService에 로그아웃 요청
1.2.3. 이 요청이 성공적일 경우 AuthRepository는 로컬 저장소(authTokenPrefsManager)에서 authToken을 삭제
1.2.4. AccountSettingsViewModel에서는 요청이 성공적일 경우 SettingsRepository로 설정 초기화 요청
1.2.5. SettingsRepository는 로컬 저장소(settingsPrefManager)에 설정 관련 데이터를 초기화
1.2.6. AccountSettingsViewModel에서는 이어서 WeightTableRepository로 가중치테이블 초기화 요청
1.2.7. WeightTableRepository는 로컬 저장소(weightRowDao)에서 내 상징 가중치 행 삭제, 기존 상징 가중치 행 초기화 수행
1.2.8. AccountSettingsViewModel에서는 이어서 SymbolRepository로 상징 정보 초기화 요청
1.2.9. SymbolRepository는 로컬 저장소(symbolDao)에서 내 상징 삭제, 즐겨찾기 초기화 수행
1.2.10. AccountSettingsViewModel에서는 이어서 UserRepository로 유저 정보 삭제 요청
1.2.11. UserRepository는 로컬 저장소 1(userDao)에서 내 정보 삭제 수행, 로컬 저장소 2(userIdPrefsManager)에서 내 ID 삭제 수행
1.2.12. AccountSettingsViewModel에서 마지막으로 sessionManager에 캐시된 유저 정보(ID, 토큰) 삭제 요청
1.3. 회원탈퇴의 경우에도 비슷합니다.
자동 로그인 관련 로직을 수정했습니다.
2.1. 기존에는 게스트 모드의 경우에는 자동 로그인(엄밀히 말하면 로그인은 아니긴 한데)이 지원이 안 돼서 앱을 끄고 켤 때마다 랜딩 스크린에서 '게스트 모드 시작' 버튼을 계속 눌러야 하는 불편함이 있었는데, 유저가 게스트 모드로 앱을 사용하기를 원할 때에도 바로 원하는 화면(상징 선택 or TTS)으로 가게 하는 게 좋을 것 같아서 수정했습니다.
2.2. 기존의 자동 로그인 로직은 앱 내 로컬 저장소(userIdPrefsManager)에서 저장된 userId가 있는지 확인하고, 없을 때는 -1을 반환해서, (userId != -1)이면 자동 로그인을 시켜주는 것이었는데요. 이제는 저장된 userId가 없으면 없는대로 null을 리턴하고 (userId != null)이면 자동 로그인을 시켜줍니다.
2.2.1. 이에 따라 userId의 type이 바뀌고, 게스트 모드를 들어갈 때에도 userId(게스트는 항상 -1)를 앱 내 로컬 저장소에 저장해두는 로직을 추가했습니다.
인증 관련 화면들의 top app bar를 삭제했던 것과 같은 이유로 설정 화면에서 top app bar의 좌측에 있던 뒤로가기 버튼을 삭제했습니다.
3.1. 이 과정에서 리팩토링을 조금 했는데, 각 스크린(심지어 설정 관련 스크린 10개라서 총 13개)에서 top app bar를 일일이 불러와서 scaffold 안에 넣었던 기존의 코드를 개선했습니다.
3.2. 이제는 SpeechBuddyHome에서 한번만 적용하고, child component들에게 paddingValue를 넘겨줍니다. (+ state도 넘겨주긴 합니다... 4번 참고)
상징 크게 보기 화면에서 '나가기' 버튼이 아니라 시스템 내비게이션 바의 뒤로가기 버튼을 눌러서 뒤로 가면 bottomNavBar가 다시 나타나지 않는 이슈를 해결했습니다.
4.1. 기존의 로직은 상징 선택 페이지에서 상징 크게 보기 페이지를 들어갈 때 hide()를 한번 하고, show()를 부르는 콜백 함수를 인자로 주어서 이 콜백 함수를 '나가기' 버튼과 연결해둔 것이었는데요. 이제는 그냥 상징 크게 보기 화면이 launch될 때 hide()를 하고 dispose될 때 show()를 하는 방식으로 코드를 수정했습니다.
4.2. 추가적으로, 3번의 작업 내용으로 인해 같은 문제가 top app bar에 대해서도 발생해서 top app bar도 똑같이 hide()하고 show()하도록 했습니다.
4.3. BackHandler를 두어서 시스템 내비게이션 바의 뒤로가기 버튼을 사용자가 누를 때 해당 interrupt를 감지해서 viewModel.exitDisplaymax()를 호출하도록 했습니다.
상징 선택 이후 하트를 눌러도 하트가 빨간색으로 바뀌지 않던 버그를 수정했습니다.
5.1. 엄밀히 말하면 상징 선택의 문제는 아니었습니다. '상징' 탭에서 상징을 선택한 이후에 '전체', '대분류' 혹은 '즐겨찾기' 모드로 바꾸고 즐겨찾기를 누르거나, 검색을 하고 난 뒤에는 즐겨찾기 UI가 정상적으로 작동했습니다.
5.1.1. 결론부터 말하자면 해당 이슈는 _entries가 symbolDao에 직접적으로 연결되어 있지 않을 때 발생합니다. _entries는 딱 두 개의 함수 - getEntries()와 provideSuggestion() - 로만 업데이트되는데, 이 중 provideSuggestion()을 실행한 이후에 즐겨찾기 UI가 바로 반영이 안 되는 문제였습니다.
5.1.2. getEntries()는 symbolRepository로부터 Flow<List>를 읽어들이는데, symbolRepository의 함수들은 전부 다 symbolDao에 query문을 날려서 받은 데이터를 그대로 viewModel로 다시 던져주는 형식을 취하고 있습니다. 그런데 provideSuggestion()은 symbolDao에서 받은 데이터를 가지고 한번 가공(각 상징들을 weightTable에서 읽어온 값과 합쳐서 리스트를 생성한 후 이를 정렬해서 다른 리스트에 상징들을 다시 복사한 후 반환)합니다. 로우 레벨 코드를 봐야 정확히 알겠지만 이 과정에서 copy가 일어나 provideSuggestion() 수행 이후 _entries에 들어있는 각 상징들은 symbolDao에 있는 데이터를 직접 가리키는 게 아니라 일종의 복사본이었던 것으로 보입니다.
5.1.3. 이 문제를 해결하려면 sorting 로직을 symbolDao로 내려서 간단한 쿼리문으로 Dao에게 "이 기준대로 정렬해서 돌려줘!"에 해당하는 요청을 보낼 수 있어야 하는데 이 로직을 구현하는 게 너무 오래 걸릴 것 같아서 일단 임시방편으로 문제를 해결했습니다. SymbolSelectionViewModel에서 provideSuggestion()을 호출할 때마다 needsToBeRecalled 옵션을 켜놓고 (getEntries()가 호출되면 이 옵션을 다시 끕니다) 즐겨찾기 시도를 한 이후에 needsToBeRecalled 옵션이 켜져있으면 provideSuggestion()을 다시 호출합니다.
5.1.3.1. 이 때 selectedSymbols가 비어있으면 provideSuggestion() 수행 중에 크리티컬한 에러가 발생하기 때문에 (추천해주려고 하는데 뭘 기준으로 추천해야 할지를 모르는 상태) 이 부분 처리를 매끄럽게 하기 위해서 코드들을 조금 손봤습니다. 기존과 동작이 달라진 부분은 딱 하나 있는데, selectedSymbols를 하나하나씩 삭제해서 emptyList가 된 경우에, 해당 시점의 displayMode에 따라 getEntries()를 호출합니다. (해당 시점에 '상징만 보기'가 켜져있으면 바로 상징들이 불러와짐)
Changes Included:
Notes for Reviewer:
일단 지금 해결할 수 있는 버그들은 다 해결하려다 보니까 작업 내용이 조금 많아졌는데 이걸 그냥 코드 리뷰하려면 시간이 상당히 오래 걸릴 것 같아서 설명을 최대한 자세히 썼습니다... 설명을 읽어보시고 특별히 문제 되는 부분이 없다면 코드 리뷰보다는 직접 앱 사용해보시면서 테스트하고 문제 없으면 PR 머지해주시면 좋을 것 같습니다
여기저기 변경사항이 조금 많아서 기존 테스트들이 잘 동작하지 않을 수 있습니다. 테스트 코드 짜기 전 (아직 메인에 머지 안 됐다면) 이 브랜치 머지하셔서 작업하시는 걸 추천드립니다...
Reviewer Checklist:
Additional Comments:
Add any other comments or information that might be useful for the
review process.