인증 화면과 한글 문구
- 작성일: 2026-10-20
- 작성: 워커 F2 (Codex
gpt-6.1-sol, effort max) - 브랜치:
feature/ui-auth - WBS: 5.2 (C-06, 로그인, 회원가입, 메일 확인, 설정)
- 관련 문서: 시스템 구조와 데이터 모델 (12.4), 디자인 시스템 (2.3, 3, 5.1), 화면설계서 (3, 부록 A, C-06)
목표
인증 화면과 안내를 한국어로 바꾸고 디자인 토큰을 적용한다. S1의 필드 오류는 화면설계서 부록 A와 일치시킨다. 이메일 회원가입과 매직 링크, 비밀번호 로그인, 재인증, 설정의 기존 인증 흐름과 라우트는 유지한다.
한 일
| 파일 | 변경 |
|---|---|
lib/tickmark_web/live/user_live/{login,registration,confirmation,settings}.ex |
한국어 제목, 필드, 단추, 처리 중 문구와 안내. 인증은 max-w-sm, 설정은 max-w-xl 안에 역할 색상 카드 배치. 기존 폼 id 유지, 제목과 단추 id 추가 |
lib/tickmark_web/user_auth.ex, controllers/user_session_controller.ex |
로그인 필요, 재인증, 잘못된 링크, 인증 실패, 로그인과 로그아웃, 비밀번호 변경 flash만 한국어로 변경 |
lib/tickmark/accounts/user_notifier.ex |
회원가입 확인, 로그인, 이메일 변경 메일의 제목과 본문을 한국어로 변경 |
priv/gettext/ko/LC_MESSAGES/{errors,default}.po |
Ecto 기본 msgid 24개와 User 사용자 정의 msgid 3개, 공통 닫기와 작업 문구 번역. 복수형 9개는 msgstr[0] 하나 사용 |
lib/tickmark/engagements/engagement.ex |
필수 입력 검증 분리와 message:만 변경. 회계연도와 수행 중요성 CHECK에도 부록 A 문구 지정 |
| 인증 LiveView, UserAuth, 세션 컨트롤러 테스트 | 한국어 단언으로 변경. 로그인 두 폼과 제목, 회원가입 성공 flash, 만료 링크와 로그인 유지 쿠키 확인 |
test/tickmark_web/gettext_ko_test.exs |
translate_error/1 직접 호출, 단수와 복수의 count 보간, 공통 번역 테스트 3개 추가 |
test/tickmark/{engagements_test.exs}, test/tickmark_web/live/engagement_live_test.exs |
기존 영어 검증 문구 단언만 한국어 문구로 교체 |
결정과 트레이드오프
- 공통 Ecto와 User 오류는 기존
CoreComponents.translate_error/1의errors도메인을 이용한다. User 스키마를 바꾸는 대안 대신 PO만 추가해 context 테스트의 원문 오류 계약을 유지했다. - S1의 네 필드 문구는 화면설계서의 한국어를
message:에 직접 지정했다. 화면 전용 문구를 위한 영어 msgid와 번역을 추가하는 간접층 없이 면접에서 검증 규칙과 표시 문구를 함께 설명할 수 있다. - 부록 A에 없는 회계연도와 수행 중요성의 빈 값에도 각각 범위 안내와 양수 금액 안내를 사용했다. 회사명과 결산일은 필드별 필수 문구를 사용한다. 필드, cast, 검증 기준과 제약 이름은 바꾸지 않았다.
- 비밀번호 로그인은 기존 두 제출 단추 대신 "로그인 상태 유지" 체크박스와 "비밀번호로 로그인" 단추로 표현했다. 기존
remember_me파라미터와 인증 처리를 유지하며, 체크 여부에 따른 쿠키 생성과 미생성을 테스트했다. 매직 링크 확인 화면의 로그인 유지와 이번만 로그인 선택은 그대로 두었다. - 공통 header 컴포넌트의 제목이
text-lg이므로 인증 화면 안에text-xl font-semibold제목을 직접 두었다. 설정 카드 제목은text-base, 본문은text-sm, 보조 안내는text-muted다. F1 소유 공통 컴포넌트와 CSS는 수정하지 않았다. - F1의 로그인 후 홈 리디렉션에 대비해 세션 컨트롤러 테스트 3곳은 로그인 후
/users/settings에서 사용자 메뉴를 확인한다. 로그인 성공의 기존/리디렉션 단언은 유지했다.
막힌 점과 해결
- 작업을 중단한 장애는 없었다.
ko로케일 설정만으로 번역이 생기지 않으므로 누락된 카탈로그를 추가하고 실제 함수 호출로 확인했다. errors.po만 수정하고 다시 컴파일했을 때Compiling 1 file (.ex)가 출력됐다. Gettext 1.0에서 한국어 단일 복수형 헤더와 PO 변경 감지를 모두 확인했다.
검증
대상 테스트의 실제 출력:
$ MIX_TEST_PARTITION=9 mix test test/tickmark_web/live/user_live test/tickmark_web/gettext_ko_test.exs test/tickmark_web/user_auth_test.exs test/tickmark_web/controllers/user_session_controller_test.exs test/tickmark_web/live/engagement_live_test.exs test/tickmark/engagements_test.exs
Finished in 1.2 seconds (1.2s async, 0.00s sync)
Result: 121 passed
PO만 수정한 뒤 컴파일의 실제 출력:
$ MIX_ENV=test MIX_TEST_PARTITION=9 mix compile --warnings-as-errors
Compiling 1 file (.ex)
최종 precommit의 실제 마지막 출력:
$ MIX_TEST_PARTITION=9 mix precommit
Finished in 18.1 seconds (16.8s async, 1.2s sync)
Result: 523 passed
- 경고를 오류로 처리하는 컴파일, 미사용 의존성 정리, 포맷과 전체 테스트가 종료 코드 0으로 통과했다.
- Ecto POT msgid 24개와 번역 항목을 비교해 누락 0개를 확인했다. 복수형 9개 모두
msgstr[0]하나이며Plural-Forms: nplurals=1; plural=0;헤더를 사용한다. git diff --check통과.mix.lock, 라우터, config, User 스키마는 변경하지 않았다. CSS 파일을 수정하지 않아 별도 에셋 빌드는 실행하지 않았다.- 실제 브라우저에서의 시각 확인, F1 테마와 셸을 합친 화면, 운영 메일 발송은 검증하지 않았다. 외부 API와 메일 어댑터 설정을 바꾸지 않았다.
Elixir 학습 포인트
- Ecto changeset은 오류를
{msgid, opts}로 보관한다.to_form/1과 공통 input 컴포넌트가translate_error/1을 거치면서만 한국어가 된다. context 테스트의errors_on/1은 번역을 거치지 않아 원문 단언을 유지한다. - 오류 옵션에
count가 있으면dngettext가 복수형을 선택하고%{count}를 보간한다. 한국어는 단수와 복수를 나누지 않으므로 단일 번역을 사용하며 1과 12 모두 테스트했다. check_constraint/3의message:는 DB 제약 실패를 changeset 오류로 옮길 때 쓰인다. 화면의validate_number와 같은 문구를 지정해 검증 경로가 달라도 안내가 일치한다.phx-trigger-action은 LiveView 처리 뒤 기존 HTTP 인증 폼을 제출한다. 화면만 바꾸면서 기존 이벤트, action과 파라미터를 유지해야 세션과 재인증 처리가 이어진다.
다음 할 일
- 메인: 브랜치를 통합하고
docs/README.md색인에 이 문서를 추가한다. - 메인: F1 테마와 셸을 합친 뒤 인증 화면의 라이트와 다크 모드, 개발 메일함 안내를 브라우저에서 확인한다.
- 메인: W6 소유
test/tickmark_web/live/finding_live_test.exs:369의refute ... "can't be blank"는 한국어 번역 뒤 의미가 약해진다. 해당 파일은 수정하지 않았으며 한국어 일반 오류인 "필수 입력 항목입니다."의 부재를 확인하도록 보강할 수 있다. - 메인: 운영 메일 발송과 데모 계정은 배정된 WBS 5.3, 5.4에서 진행한다.
계약 변경 요청: 없음.
관련 커밋
- 기준 커밋:
f5f7f78. - 이 문서를 포함한 커밋:
feat(auth): 인증 화면과 검증 문구 한글화.