본문으로 건너뛰기
면접 학습
복습세션 →

이력서 기반

토픽 8 · Phase 2

이전 경력 — 포그리트(4grit) 시기

질문 4개
  1. Q8-1

    AngularJS → Vue 전면 마이그레이션을 어떻게 진행하셨나요? (#08)

    핵심 포인트

    • 빅뱅이 아닌 점진 전환 + 공용 컴포넌트 추출
    • "3회 이상 반복되는 UI"를 공용 컴포넌트화 룰
    • 페이지 단위 전환: 로그인 → 대시보드 → 페이지 CRUD → 리포트 순으로
    • 회고: 점진 전환은 안전하지만 초기 설계 비용이 있고, 커스터마이즈가 누적되면 재설계가 필요할 수도
    모범 답안먼저 답해보고 펼치기

    포그리트에서 AngularJS 기반 뷰저블 툴을 Vue로 전면 리팩토링했습니다. 원칙은 두 가지였어요. 첫째, 빅뱅 전환은 안 한다 — 라이브 서비스라 일정 단위로 멈출 수 없어서 페이지 단위로 자연스럽게 전환하는 점진 전략을 택했습니다. 로그인 → 대시보드 → 페이지 CRUD → 리포트 순으로 한 페이지씩 Vue로 옮겼고, 한 시점엔 두 프레임워크가 라우트 단위로 공존했어요.

    둘째, 3회 이상 반복되는 UI는 공용 컴포넌트로 추출한다는 룰을 정해 두고 진행했습니다. Input, Button, Modal, Select, Loading 같은 컴포넌트가 그렇게 만들어졌어요. 처음엔 단순한 prop 인터페이스로 시작해 화면 요구가 들어올 때마다 점진적으로 확장하는 방향이었습니다.

    회고하자면, 점진 전환이 안전하지만 공용 컴포넌트 초기 설계가 너무 단순하면 나중에 변형 요구가 누적되며 다시 깨질 수 있다는 걸 배웠어요. 이 학습이 이후 CLO에서 디자인 시스템 v1 → v2 (Compound Component) 전환의 사고로 이어졌습니다.

    이 답변, 어땠나요?

    꼬리 질문
    • Q-a. 두 프레임워크 공존 시 라우팅·상태 공유는 어떻게 했나요?

      라우팅은 페이지 단위로 자르니 자연스러웠고, 전역 상태는 사용자 인증·언어 설정처럼 양쪽이 다 알아야 하는 정도였어요. 그건 sessionStorage 또는 단순 객체 싱글턴으로 공유했습니다.

    • Q-b. AngularJS의 양방향 바인딩 사고에 익숙한 동료들의 학습 곡선은요?

      단방향 데이터 흐름이 처음엔 어색해 하시지만, props down · events up이라는 단순한 룰로 익숙해지셨어요. 페어 리뷰를 좀 더 적극적으로 했습니다.

    CS · 이론
    • Strangler Fig 패턴 (재등장): AngularJS → Vue도 같은 사고. 새 시스템을 키우며 옛 시스템을 잠식
    • Single-page application 라우팅: 페이지 단위 전환의 단위는 라우트
    • 양방향 바인딩 vs 단방향 데이터 흐름: AngularJS·Vue의 v-model vs React의 controlled component
  2. Q8-2

    삼성 글로벌 사이트 WCAG 접근성 검수는 어떤 일이었나요? 인상 깊었던 이슈가 있다면? (#09)

    핵심 포인트

    • 매년 상·하반기 2회, 삼성 스마트폰 페이지 전체 SWCAG (Samsung WCAG) 기준 검수
    • 역할: 이슈 발견 + 수정·개선 방향 제안
    • 구체 영역: 키보드 네비게이션, ARIA 속성, 명도 대비, 스크린 리더 대응
    • 본인 학습: "접근성은 별도 작업이 아니라 컴포넌트 기본 덕목"이라는 사고가 이때 정착
    모범 답안먼저 답해보고 펼치기

    삼성의 글로벌 사이트가 SWCAG라는 자체 가이드라인(WCAG 2.1 기반)을 따르는데, 매 반기마다 외부 검수단이 들어가서 이슈를 점검하는 작업이 있었어요. 저는 그 검수단의 일원으로 상·하반기 2회씩 참여해서 페이지 전체를 SWCAG 기준으로 점검하고 수정·개선 방향을 제안하는 역할을 했습니다.

    자주 발견됐던 이슈는 네 가지 패턴이었어요. (1) 키보드 네비게이션 깨짐 — 마우스로는 동작하지만 Tab으로는 도달 못 하는 카르셀 컨트롤, (2) ARIA 속성 오용role="button" 만 붙여 두고 tabindex를 안 주거나 키보드 핸들러가 없는 케이스, (3) 명도 대비 미달 — 4.5:1 기준에 미치지 못하는 회색 보조 텍스트, (4) 스크린 리더용 대체 텍스트 누락 — 장식용 이미지에 alt가 없거나 정보성 이미지에 빈 alt가 들어간 케이스.

    이 작업이 제게 남긴 가장 큰 학습은 **"접근성은 별도 작업이 아니라 컴포넌트 기본 덕목"**이라는 사고였어요. 이후 CLO에서 디자인 시스템을 만들 때부터 컴포넌트 단위로 키보드 핸들러·ARIA 속성·focus 관리를 기본 인터페이스에 포함시켰고, 토스증권 같은 금융 서비스에선 이 사고가 더 중요하다고 봅니다.

    이 답변, 어땠나요?

    꼬리 질문
    • Q-a. WCAG와 SWCAG의 차이는요?

      SWCAG는 삼성이 WCAG 2.1 AA 기준을 자사 가이드라인으로 확장한 것이에요. 표준은 WCAG, 기업 내부 적용 가이드는 SWCAG로 보시면 됩니다. 한국엔 KWCAG (한국형) 도 있어요.

    • Q-b. ARIA 속성을 잘못 쓰면 안 쓰느니만 못하다는 말이 있는데요?

      맞아요. WAI-ARIA 첫 번째 룰이 "if you can use a native element, use it" 입니다. div + role="button"보단 button 태그를 쓰고, semantic HTML이 1순위, ARIA는 보완책이에요. 검수 중에도 ARIA 오용 케이스가 가장 흔한 이슈였습니다.

    • Q-c. 토스증권에서 접근성을 어떻게 챙길 수 있을까요?

      디자인 시스템 컴포넌트의 기본 인터페이스에 키보드 핸들러·focus 관리·ARIA 속성을 박아 두는 게 가장 효과적이에요. 컴포넌트가 잘 되어 있으면 화면 단위 작업에서 자연스럽게 따라옵니다. 더불어 storybook에 a11y addon을 두고 PR 단계에서 자동 검사가 돌아가게 하면 회귀를 막을 수 있어요.

    CS · 이론
    • WCAG 2.1 / 2.2: 4가지 원칙 (Perceivable, Operable, Understandable, Robust) + 적합성 레벨 A/AA/AAA
    • WAI-ARIA: 네이티브 HTML로 표현 못 하는 인터랙션을 시맨틱하게 표현하는 보완 규격
    • 명도 대비 (Contrast ratio): WCAG AA 기준 일반 텍스트 4.5:1, 큰 텍스트 3:1
    • focus management: 모달 오픈 시 첫 포커스, 모달 닫을 때 트리거 요소로 포커스 복귀, focus trap
    • Screen reader 동작: VoiceOver (macOS/iOS), NVDA·JAWS (Windows), TalkBack (Android)
    • eslint-plugin-jsx-a11y, axe-core, @storybook/addon-a11y: 자동 검사 도구
  3. Q8-3

    뷰저블리 툴 SCSS·BEM 리팩토링은 어떤 작업이었나요? (#10)

    핵심 포인트

    • 단일 CSS 파일 + 비일관 클래스 → SCSS 모듈화 + BEM 네이밍 도입
    • 변수·믹스인으로 테마·공통 스타일 재사용
    • "작은 규약이라도 일관성이 큰 효과를 만든다"는 학습
    모범 답안먼저 답해보고 펼치기

    뷰저블리 툴 페이지의 스타일이 모든 페이지를 단일 CSS 파일에서 관리하는 상태였어요. 코딩 컨벤션이 없어서 비슷한 UI인데 클래스명이 페이지마다 다르고, 새 화면을 만들 때 어떤 클래스를 재사용할 수 있는지 파악이 어려웠습니다. 가독성·유지보수성 둘 다 떨어지는 상태였어요.

    리팩토링은 두 단계로 갔어요. 첫째, BEM 방법론 참고로 클래스 네이밍 통일block__element--modifier 형태로 같은 의미의 UI는 같은 이름이 되도록 정리. 팀 전체 컨벤션을 정립하기 전에 일단 네이밍부터 맞추니 코드 리딩이 즉시 좋아졌어요. 둘째, 단일 CSS → SCSS 모듈화 — 색상·간격·타이포 같은 공통 값을 변수로, 자주 쓰이는 패턴(미디어 쿼리, 그라디언트 등)을 믹스인으로 분리해서 재사용 가능하게 만들었습니다.

    회고하자면 "작은 규약이라도 일관성이 큰 효과를 만든다"는 걸 체감한 작업이었어요. 컴포넌트 추상화나 빌드 시스템 같은 거대한 개선이 아니라 단순 네이밍 통일만으로도 팀의 코드 리딩 비용이 눈에 띄게 줄었습니다. 이 사고가 이후 CLO 디자인 시스템에서 토큰·시맨틱 네이밍을 강조하는 방향으로 이어졌습니다.

    이 답변, 어땠나요?

    꼬리 질문
    • Q-a. BEM 외에 다른 네이밍 방법론(SMACSS, OOCSS, Atomic CSS)은 검토했나요?

      그 시점엔 BEM이 가장 보편적이었고, 학습 자료가 풍부해서 팀 도입이 빨랐어요. 지금 선택한다면 Tailwind 같은 utility-first나 CSS-in-JS의 자동 클래스명 생성으로 가서 아예 네이밍 규약 자체를 시스템에 위임하는 방향이 자연스럽다고 봅니다.

    • Q-b. CSS-in-JS와 SCSS 중 지금 다시 고른다면?

      시점에 따라 다릅니다. RSC 도입 환경이면 vanilla-extract나 Tailwind 같은 zero-runtime, 클라 위주면 Emotion·styled-components, 빠른 시제품이면 Tailwind. SCSS는 여전히 견고한 옵션이지만 컴포넌트 단위 스코프와 type-safety에서 CSS-in-JS / utility-first가 우세해서 우선순위는 낮아졌어요.

    CS · 이론
    • BEM (Block Element Modifier): CSS 네이밍 방법론. block__element--modifier
    • OOCSS·SMACSS·Atomic CSS·Tailwind: 시대별 CSS 방법론의 흐름
    • SCSS 핵심 기능: 변수, 믹스인, nesting, partials/imports, functions
    • CSS specificity와 충돌: 단일 CSS의 가장 큰 함정. 모듈화·BEM·CSS-in-JS는 모두 이 문제를 푸는 다른 답
    • CSS Modules vs CSS-in-JS vs Utility-first: 현대 CSS의 세 갈래
  4. Q8-4

    뷰저블리 다국어 반응형 랜딩(KO/JA/EN) 작업의 핵심 어려움은 뭐였나요? (#11)

    핵심 포인트

    • 언어별 줄바꿈 차이·문장 길이 차이로 콘텐츠 크기 고정이 어려움
    • 일본어는 화면 크기별 세밀한 줄바꿈 조정이 필요
    • 해법: px 대신 % / rem 위주 레이아웃, 기획·디자인과 사전 협의로 예외 분기 최소화
    • 회고: 콘텐츠 크기 고정을 지양 + 예외 분기는 초기 설계 단계에서 디자이너와 같이 줄이기
    모범 답안먼저 답해보고 펼치기

    한국어·일본어·영어 세 언어를 한 페이지에서 지원하는 랜딩이라, 같은 박스 안에 들어가는 텍스트 길이가 언어마다 30~50% 차이가 났어요. 콘텐츠 박스 크기를 고정하면 어느 언어에선 잘리고 어느 언어에선 빈 공간이 남는 문제가 즉시 생겼습니다. 일본어는 특히 화면 크기별로 줄바꿈을 세밀하게 맞춰야 자연스러워요.

    핵심 해법은 두 가지였습니다. 첫째, px 대신 % / rem 위주 레이아웃. 박스를 콘텐츠 길이에 따라 늘어나도록 만들고, 부모는 비율로 배치해서 언어별로 자연스럽게 적응되게 했어요. 둘째, 언어별 예외 분기를 코드 레벨에서 줄이기 위해 디자이너와 사전 협의. 처음부터 "이 카피의 일본어 길이가 한국어 대비 X% 길어지는데 이 박스에서 받을 수 있나"를 디자이너와 같이 검증해서, 카피 자체를 다듬거나 박스 자체를 유연하게 설계하는 식으로 풀었습니다.

    회고하자면, 반응형·다국어는 코드로 푸는 일보다 콘텐츠와 디자인 의사결정에서 풀리는 비율이 훨씬 크다는 걸 배웠어요. 코드는 콘텐츠 변동에 견고하게 대응하면 되고, 변동의 폭 자체는 초기 설계에서 좁혀야 한다는 사고입니다.

    이 답변, 어땠나요?

    꼬리 질문
    • Q-a. CLS (Cumulative Layout Shift) 같은 Core Web Vitals 관점에서는 어떤 고려를 하셨나요?

      폰트 로딩으로 인한 FOUT 시 텍스트 길이가 바뀌면 레이아웃이 흔들려요. 그래서 폰트 fallback의 metrics를 의도적인 폰트와 비슷하게 맞추거나(font-display: swap + size-adjust), 박스를 충분히 유연하게 만들어 흔들림이 시각적으로 보이지 않게 하는 정도가 실무 처방입니다.

    • Q-b. 지금 다국어를 짠다면 어떤 라이브러리를 쓰시겠어요?

      Next.js 환경이면 next-intl 또는 i18next, React 단독이면 react-i18next가 표준이에요. 토큰화·복수형·날짜 형식까지 잘 지원합니다. 본 케이스 시점엔 EJS + JSON 기반 직접 구현이었지만, 지금은 라이브러리 도입이 자연스러워요.

    • Q-c. RTL(아랍어 등) 지원도 고려해 본 적 있나요?

      본 케이스에선 KO/JA/EN만 다뤄서 RTL은 다루지 않았지만, 디자인 시스템에서는 logical property (margin-inline-start 등) 를 사용하면 LTR/RTL 자동 대응이 가능합니다. CLO·토스 모두 RTL이 핵심 시장은 아니지만 시스템 설계 사고로는 의식해 둘 만합니다.

    CS · 이론
    • i18n vs l10n: i18n = 국제화(다국어 지원 가능 구조), l10n = 현지화(특정 언어로 번역)
    • CLS / Layout Shift: Core Web Vitals 중 시각적 안정성 지표. 0.1 이하가 권장
    • font-display, size-adjust: 폰트 로딩 시 레이아웃 흔들림 제어
    • CSS Logical Properties: writing-mode·direction 변경 시 자동 대응 가능한 속성 (margin-inline-start 등)
    • i18n 라이브러리들: i18next, react-i18next, next-intl, FormatJS — 복수형·플레이스홀더·날짜 포맷 처리