발행일

홈 화면의 "준비 중" 타일을 지웠다 — 세는 대상이 처음부터 틀려 있었다

홈 화면의 "준비 중" 타일을 지웠다

홈 화면 "데이터 현황"에는 타일이 셋 있습니다. 표준데이터, OID, 물리 아키텍처. 앞의 둘은 건수가 뜨는데 물리 아키텍처만 "준비 중" 이었어요.

물리 아키텍처 화면은 이미 운영 중이었습니다. 홈에서만 준비 중이었던 겁니다. 아래 탭도 비활성이라 "자주 찾는 / 최근 등록" 목록이 비어 있었고요.

데이터를 붙이는 건 몇 줄이면 될 줄 알았습니다. 이미 집계 함수가 있었거든요.

def get_arch_count(self):
    """물리 아키텍처(ASN.1) 데이터셋 건수를 반환"""
    return ASN1NodeManager.get_arch_dataset_count()

화면이 말하는 것과 다른 것을 세고 있었다

이 함수는 ASN.1 데이터셋을 셉니다. 화면 타일은 "물리 아키텍처" 라고 적혀 있고, 눌러서 가는 화면은 "서비스별 아키텍처" 목록입니다.

셋이 다른 것입니다.

  • ASN.1 데이터셋 — 메시지 구조 정의. 아키텍처 화면이 참조하는 자료
  • 물리 아키텍처 서비스(PhysicalArchitectureService) — 실제 목록에 뜨는 단위

준비 중이라 아무도 안 봤으니 아무도 안 걸렸어요. 데이터를 붙이는 순간 홈은 400을 말하는데 목록엔 12개인 상태가 됐을 겁니다. 며칠 뒤 표준데이터 타일에서 실제로 겪은 것과 같은 성격인데, 이쪽은 화면에 나오기 전에 잡았습니다.

세는 대상을 목록과 같은 축으로 바꿨습니다.

def _active_arch_services(self):
    """공개 목록(서비스별 아키텍처 검색)과 같은 축 — 비활성 서비스는 홈에도 안 나온다"""
    return PhysicalArchitectureService.objects.filter(is_active=True)

def get_arch_count(self):
    """공개된 물리 아키텍처 서비스 건수를 반환"""
    return self._active_arch_services().count()

is_active=True함수 하나에 가둔 게 의도입니다. 건수·자주 찾는·최근 등록 세 곳이 각자 filter(is_active=True)를 쓰면 나중에 한 곳만 빠집니다. 표준데이터 쪽에서 정확히 그런 식으로 어긋났던 걸 보고 나서 처음부터 이렇게 뒀어요.

이 코드에 남아 있는 결함

정직하게 적으면, 위 커밋에는 결함이 하나 그대로 있습니다.

def get_preferred_archs(self):
    """자주 찾는 물리 아키텍처 5건 (조회 통계가 없어 OID 와 같이 최신순)"""
    items = self._arch_items(self._active_arch_services().order_by("-created_at")[:5])
    return { "index": True, "title": _("자주 찾는 물리 아키텍처"), ... }

def get_recent_archs(self):
    """최근 등록된 물리 아키텍처 5건을 반환"""
    items = self._arch_items(self._active_arch_services().order_by("-created_at")[:5])
    return { "title": _("최근 등록된 물리 아키텍처"), ... }

두 함수가 똑같은 쿼리입니다. "자주 찾는"과 "최근 등록된"이 같은 5건을 보여줍니다. 탭 두 개가 나란히 있는데 내용이 동일해요.

이유는 주석에 적힌 대로 조회 통계가 없어서입니다. 이 시스템에 PageVisit 집계가 있긴 한데 표준데이터 인스턴스 URL 기준이라, 물리 아키텍처 서비스에는 안 붙어 있어요. OID 타일도 같은 이유로 같은 상태입니다("visit 통계 없으므로 최신순").

지금 상태를 정확히 말하면 이렇습니다.

"자주 찾는" 탭은 자주 찾는 걸 보여주지 않는다. 그 자리를 최신순으로 채워두고, 통계가 붙으면 그때 진짜로 만들 계획이다.

주석에는 적어뒀지만 화면에는 아무 표시가 없습니다. 사용자는 저게 인기순이라고 믿어요. 지금 이 화면에서 제일 정직하지 않은 부분이고, 고르자면 두 가지였습니다.

방법장점포기하는 것판단
① 탭을 하나로 줄이고 "최근 등록"만거짓말이 사라짐표준데이터·OID 타일과 구조가 달라짐. 통계 붙으면 탭을 다시 만들어야 함보류
② 지금처럼 두고 통계 대기 (현재)세 타일 구조가 같음사용자가 인기순이라고 믿음채택했지만 부채

②로 뒀는데, 이건 세 타일이 다 같은 문제를 갖고 있어서 혼자 고칠 수 없었기 때문입니다. 물리 아키텍처만 탭을 하나로 줄이면 그것대로 이상해져요. PageVisit을 서비스 URL까지 확장하는 게 정답이고, 그 전까지는 셋 다 같은 부채를 집니다.

퀵메뉴 — flex-1을 쓰면 안 되는 자리

홈 상단 퀵메뉴도 같이 정리했습니다. 등록 신청 2종과 Open API 사용 신청을 빼고 검색·탐색 4종(표준데이터 검색·OID 검색·서비스별 아키텍처·데이터 맵)으로 바꿨어요.

기준은 홈에서 처음 하는 행동입니다. 처음 온 사람이 신청부터 하지는 않아요. 찾아보고 나서 신청합니다. 신청 카드는 나중에 돌아올 예정이라 문서에 적어뒀습니다.

여기서 CSS 하나가 걸렸습니다. 카드가 flex-1이었어요.

5개일 때:  [  카드  ][  카드  ][  카드  ][  카드  ][  카드  ]
4개로 줄이면: [   카드   ][   카드   ][   카드   ][   카드   ]   ← 커짐

flex-1은 남은 공간을 나눠 갖습니다. 카드를 하나 빼면 남은 카드가 커져요. 개수가 바뀔 때마다 카드 크기가 달라지고, 그 안의 아이콘·글자 균형이 매번 깨집니다.

폭을 13.8rem 고정으로 바꿨습니다. 5개일 때의 크기를 그대로 유지하는 값이에요. 신청 카드가 돌아와도 크기가 안 변합니다.

13.8rem이라는 어중간한 값이 마음에 들지는 않습니다. "5개일 때 이렇게 보였다"를 숫자로 굳힌 거라, 컨테이너 폭이 바뀌면 근거를 잃어요. 다만 개수에 따라 크기가 춤추는 것보다는 낫다고 봤습니다.

아이콘도 하나 정리했습니다. 데이터 맵이 Open API 아이콘을 빌려 쓰고 있었어요. 둘 다 홈에 있으면 같은 그림이 두 번 나옵니다. 전용 아이콘을 추가했습니다.

검증

  • 홈 물리 아키텍처 건수 = 서비스별 아키텍처 목록 건수 확인(is_active=True 기준).
  • 비활성 서비스를 하나 만들어 홈·목록 양쪽에서 안 나오는 것 확인.
  • 타일 클릭 → 목록 이동 경로 확인. 타일이 링크를 갖게 된 건 이번이 처음이라(그전엔 "준비 중" 텍스트), 링크 대상이 실제로 그 목록인지 봐야 했습니다.
  • 퀵메뉴 카드 5개 → 4개로 줄여도 카드 크기 불변 확인.

남은 것 · 한계

  • "자주 찾는" 탭이 최신순입니다. 물리 아키텍처·OID 둘 다요. PageVisit을 서비스 URL까지 확장하기 전까지 안 풀립니다. 지금은 주석에만 적혀 있고 화면은 침묵해요 — 이 글에서 제일 정직하지 않은 부분입니다.
  • 13.8rem"5개일 때 이렇게 보였다"를 굳힌 숫자입니다. 컨테이너 폭이 바뀌면 근거가 없어져요. grid-template-columns: repeat(5, 1fr)로 열 수를 고정하는 게 더 나은 표현일 텐데, 카드가 5개를 넘을 때의 줄바꿈을 안 정해서 미뤘습니다.
  • 등록 신청 카드 2종은 "추후 복귀 예정" 인데 조건이 없습니다. 언제 어떤 근거로 돌아오는지 안 적어뒀어요.
  • 물리 아키텍처는 표준데이터 집계처럼 홈·목록 정합을 테스트로 잠그지 않았습니다. 지금은 같은 함수를 쓰지만, 목록 뷰가 조건을 하나 더 붙이는 순간 표준데이터와 똑같이 갈라집니다. 같은 실수를 할 자리를 알면서 안 막아뒀어요.

관련 글: 같은 표준데이터를 두 화면이 198건과 134건으로 세고 있었다 · 화면이 없어진 기능을 설명하고 있었다