TIL231207 D14 키오스크 -ing -3

jericho·2023년 12월 7일

TIL

목록 보기
14/62

계속해서 키오스크를 만지고 있다.

일단 어제 생각했던, 쿠폰 적용 방법 변경부터 했다. 간단한 변경이라고 생각했는데 생각보다 건드릴 부분이 많았다. 특히, 하나의 장바구니에 대해 쿠폰이 적용되고 리셋되어야 하고, 쿠폰 적용 최소 주문금액 정보도 장바구니에 기록해야하다보니, 장바구니를 클래스로 만들어주어야 했다. 하지만 간단한 변경에 굳이 클래스를 또 만들기가 좀 귀찮아서 그냥 키오스크에 basket_discount 변수랑 basket_forDiscount 변수를 추가하고 변경이 필요할 때 하드코딩을 해줬다. 그런데 생각보다 건드릴 부분이 많아지다보니, 일일이 찾아서 신경써야할 부분이 많았다. 결국 다 만들고 보니 처음부터 클래스로 만드는 편이 신경도 덜 쓰고 개발 속도도 빨랐을 것이었다. 향후 확장성이야 뭐 비교조차도 할 수 없고 말이다. 결국 당장 귀찮다고 하드코딩을 하는 것보다 설계대로 짜는 것이 더 효율적인 것이다.
(물론 정말로 단 한두줄만 필요한 부분에서는 하드코딩이 훨씬 빠를거다. 이번 경우는 하드코딩이 빠를 거라는 내 판단이 틀렸던 거다. 전체 구조 및 필요 호출량에 대한 예측에 실패했다는 말이 되겠다.)

그리고 우리팀 모두 레벨7까지 완성하고 코드 리뷰를 했다. 대표로 제출할 하나를 뽑기 위해서다. 하지만 우리끼리는 어떤 코드가 제일 좋은 것인지 알 수가 없어서, 단체로 튜터님을 찾아가서 하나를 뽑아달라는 요지로 피드백을 받았다. 결론은 모두 잘 해결했고 어느 것을 내도 좋아보인다. 하지만 전공&복전 3명이 뭉친 팀으로서는 뭔가 더 있어야 하지 않겠느냐는 피드백이 있었다. 일단 처참한 UI. 물론 콘솔창에서 뭐 얼마나 이쁘겠냐만, "제일 중요한 것은 첫인상"이라는 명언과 함께, 좀 더 이쁘게 출력할 수 있을 거라고, 적어도 줄이 삐뚤빼뚤하지 않았으면 좋겠다고 하셨다. 그리고 무의미한 클래스 구조를 개편할 것과, 추가적으로 구현할만한 것으로 햄버거에 소스를 변경하는 등의 추가 기능을 제시하셨다. 그리고 하나를 선택해 대표로 제출할 것이 아니라, 각자의 좋은 기능들을 뽑아 합쳐보라고 하셨다.

분명히 좋은 피드백입니다만, 문제는 다음날 정오가 제출기한인 저녁식사 직전의 시간이라는 점이겠지요... 일단 클래스 개편은 간단하고, UI 개선도 가능해보인다. 추가 기능은 시간이 부족해 미뤄두자. 진짜 문제는 각 기능을 뽑아 합치는 것이다. 튜터님도 처음부터 맞춰서 작업한 게 아니라 힘들 수 있다고 하신 부분이지만, 합쳐보려니 정말로 막막했다. 일단 페이지 단위로 구성한 내 코드를 기반으로 고쳐보자고 가닥을 잡았다. 그래서 팀장님이 구현한 '들어온 개별 주문 제거 기능'을 먼저 합쳐보고자 했다. 팀장님이 화면공유를 하고 내가 같이 보면서 합쳐보려고 시도했지만... 나는 ArrayList고 팀장님은 MutableList였다. 게다가 담고있는 타입도 각자 만들어둔 클래스. 결국 클래스부터 갈아엎어야 합칠 수 있다는 말이다. 힘들거라 생각은 했지만 상상이상으로 난감했다. 결국 합치는 건 잠정 포기하고, 각자 코드를 기반으로 페이지 단위 형태로 개선해보기로 했다. 나는 이미 내 코드니까 UI쪽에 집중하기로 했다.

문자열 포맷팅

출력화면에서 줄을 맞추고자 했다. 현재 일단 탭으로 대충만 맞춰놓은 터라 삐뚤빼뚤하게 되어있다. '콜라'랑 '인크레더블 버거'의 길이가 다르니까 이후 텍스트가 다른 탭에서 시작하는 것이다. 이름에 '콜라        ' 식으로 띄어쓰기를 뒤에 추가해 길이를 맞춰줘서 탭을 맞춰보려 했다. 그러나 다른 곳에서 이름을 사용할 때가 문제였다. 장바구니에서 "콜라         가 장바구니에 추가되었습니다."라고 뜨는 꼴을 볼 수는 없었다.

결국 정석대로 문자열 포맷팅을 도입해야 했다. 포맷팅은 사용해볼 때마다 뭔가 안되고 귀찮고 힘들고 해서 별로 손대고 싶지 않았다. 하지만 결국 이를 피해서 다른 방법을 찾으려 하면 결과적으로 그게 더 안되고 귀찮고 힘들어지는 법이었다. (뭔가 철학적인 깨달음을 얻고 있는 것 같다.)

포맷팅의 다른 부분은 넘어가자. 기억할 것은 오른쪽 정렬이다. %7s 하면 7칸 영역에 오른쪽 정렬이다. 왼쪽 정렬은 -7이다.
자세히는 다음과 같이 사용하면 된다.

"%d. %-10s\t| %s".format(index + 1, itemList.name, itemList.detail)
"%-13s\t| %s".format("5. 주문", "장바구니를 확인 후 주문합니다.")
"%-12s\t| %7s\t| %s".format(name, "${price}원", detail)

문제는 아무리 탭 구간에 맞춰 4개나 8개 단위로 영역을 잡으려고 해도, 한글이 들어가면 박살난다는 점이다. 게다가 실행 환경에서의 출력 폰트에 따라서도 달라진다. 기본적으로 한 칸의 크기가 일정한 폰트가 아니면 영어만 사용해도 띄어쓰기 칸이 안맞는다. 일정한 폰트도 한글이 들어가면 안맞게 된다. 이 부분은 어쩔 수 없다. 최대한 맞길 바랄 수밖에.

몇 칸이 적절한 영역인지는 결국 출력해봐야 안다. 한글 포함 처음부터 왼쪽정렬로 영역을 잡으려고 하면 몇칸을 줘야할 지 알기 어렵다. 오른쪽 정렬로 내 메뉴를 모두 출력해본 다음에, 적절한 칸을 정해서 왼쪽 정렬로 만들면 된다.

자세한 내용은 공식 문서 참고.
https://kotlinlang.org/docs/strings.html#string-formatting
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/format.html
https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html

아스키 텍스트

첫 화면을 좀 더 이쁘게 하기 위해서, 아스키 아트를 고려해봤다. 맘스터치 로고를 아스키아트로 그려내면 좋겠다는 생각이었다. 하지만, 아스키 아트를 출력하려면 콘솔창이 거의 전체화면이어야 적당한 해상도로 그려낼 수 있는데, 안드로이드 스튜디오에서 실행하여 작은 콘솔창으로 볼 것을 생각하니 불가능했다. 아스키아트 대신에 아스키 텍스트? 정도로 만족하기로 했다.

https://snskeyboard.com/asciitext/
위 링크에서 아스키텍스트로 변환이 가능하다. 다양한 글씨체를 지원해주고 있다. 기본으로 설정된 larry-3D로 하고 싶었지만, /\ 이게 안드로이드 스튜디오 콘솔창에서 경로로 인식이 되는지 링크를 생성해줘서 파래진다. 눌러보면 내컴퓨터가 열린다. 루트 폴더로 열리는 모양이다. 영 별로라서 열심히 글씨체를 찾아보니 starwars 글씨체가 괜찮았다.

0개의 댓글