악보에 태그 기능을 달면 더 좋겠다는 아이디어가 생각났다.
블로그 태그 같이 자유롭게 여러개를 다는 기능보다는
작성자가 직접 난이도와 곡 장르를 정해진 태그 중 골라서 매기는 기능이다.
이 기능이 추가되면 사용자들이 좀 더 편하게 악보를 찾을 수 있을 것이다.
난이도와 장르를 구분하지 않고 이렇게 enum 하나에 묶은 뒤,
각 값마다 태그의 배경색과 보여질 내용을 하드코딩했다.
난이도와 장르를 enum 하나에 묶은 이유는 Flutter의 Chip 이라는 기본 위젯을 가볍게 커스터마이징해서
Tag 라는 커스텀 위젯을 만들었는데, 이 Tag 라는 위젯에 TagContent 라는 하나의 enum 을 넘겨서
장르와 레벨을 모두 표현하고 싶었기 때문이다.
enum을 구분하면 위젯도 GenreTag, LevelTag 이런식으로 구분되어어야 하는데
완전 구성 코드가 똑같은 2개의 위젯을 용도가 다르다고 구분해버리는 것은 비효율적이라고 생각했다.
그런데 dart 언어가 업데이트 되면서 enum 에 기능이 많이 생겼다고 한다.
enum을 단순한 열거형으로 사용하지 않고 하나의 class 처럼 쓸 수 있다고 한다.
하지만 아쉽게도 상속은 안된다.
만약 상속이 되었다면 TagContent 라는 하나의 상위 enum 클래스를 만들고
LevelTagContent, GenreTagContent 라는 하위 enum 클래스를 만든 뒤
Tag 위젯에는 TagContent 라는 상위 위젯을 입력받도록 하면
깔끔하게 구분된 enum을 하나의 위젯에서 활용할 생각이었다.
왜 enum 에서는 상속을 구현하지 않았을까?
일단 공식문서에서는 Enum 클래스를 상속하기 때문이라고 이해했는데,
dart는 다중 상속을 못하기 때문인 것 같다.
근데 믹스인, 인터페이스도 사용을 못하게 막은 이유는 뭘까..
enum 에서 이런식으로 구현을 했다.
하드코딩인 건 똑같은데, switch 문으로 하는 것 보단 이게 더 나은 것 같다.
enum 클래스의 값으로 필요한 데이터를 다 지정할 수 있으니 아주 편하다.
이렇게 나온다
장르는 종류가 너무 많아질 것 같아서 색을 하나로 통일했다.
너무 다양하더라도 구분을 그냥 하는게 나을지는 고민을 좀 더 해봐야겠다.
이제 난이도와 장르 데이터를 저장할 수 있게 해야한다.
이 악보의 기본적인 정보는 Sheet Info 라는 데이터 클래스로 관리하고 있다.
그래서 난이도와 장르를 저장할 수 있는 데이터를 sheet info 에 추가해주었다.
기존 db 데이터에는 level, genre 가 없기 때문에 매개변수에 기본값을 넣어 활용할 수 있게 하였다.
그런데 만약 실제로 많은 데이터가 들어있는 채로 운영중이었다면 이렇게 코딩하면 안됐을 것 같다.
기존 악보에 kpop 만 있지도 않을 것이고, 난이도가 쉬운 악보만 있지도 않을 것이기 때문이다.
이런 경우엔 null 값을 허용하게 한 후, 값이 null 이면 태그가 보이지 않게 하는 것이 더 바른 방향 같기도 하다.
null 이 아니라 반드시 값을 넣어야 한다면 enum에 noTag 같은 값을 추가하는 것도 방법이다.
근데 적고보니 null 을 허용하는 것은 안전하지 않은 코딩방식이라고 생각해서 이 방법이 더 나은 것 같다.
바로 수정해야지
아무래도 이게 맞는 것 같다.
다음으로 악보 데이터 생성, 수정 페이지에서 태그 데이터를 생성, 수정하는 기능을 넣어주었다.
또 태그 데이터를 UI로 그려내는 코드도 돌면서 태그 데이터를 그리도록 수정하였다.
이걸 하면서 기존 코드도 많이 리펙토링했다.
sheet info 라는 데이터 클래스를 만들어두고 활용하지 않았던 코드가 많아서
일일히 sheet info 데이터 클래스를 이용해 데이터를 주고 받도록 수정했다.
이렇게 난이도와 장르에 대한 태그 기능을 추가하였다.
기존에 db에 레벨과 장르 데이터가 없었던 악보에 대해서는 태그가 보이지 않는다.
최근에 이 프로젝트에 깃허브 프로젝트 기능을 이용해서 task 관리를 하고 있는데 아주 좋은 것 같다.
그 전에는 소스코드에 TDOO 로 주석을 달아두었는데, 깃허브 프로젝트에 없는 TODO도 많아서
실제로는 이것보다는 해야하는 작업이 더 많다
아자아자 ^ㅇ^
'개인 프로젝트 > [2021] 코드악보 공유APP' 카테고리의 다른 글
22. 노트북으로 프로젝트 환경 세팅 옮기기 (0) | 2023.09.05 |
---|---|
20. 플레이스토어 출시 (0) | 2023.08.08 |
19. 그룹 기능 구현과 Firestore 데이터 구조 고민 (0) | 2023.07.19 |
18. 플러터 버전 업데이트 / DB 구조 수정 / 테스트 코드 추가 (0) | 2023.05.21 |
17. UI 수정 / 악보 좋아요 기능 추가 / 그룹 기능 추가 / 성능 개선 (0) | 2021.08.19 |