λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Lect & Tip/node, Angular, React

μ• μžμΌ 개발 ν™˜κ²½μ—μ„œμ˜ UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈ

by st곡간 2025. 2. 26.

λͺ©μ°¨

    μ• μžμΌ 개발 ν™˜κ²½μ—μ„œμ˜ UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈ

    μ• μžμΌ(Agile) 개발 ν™˜κ²½μ—μ„œλŠ” λΉ λ₯Έ ν”Όλ“œλ°±κ³Ό 반볡적인 κ°œμ„ μ΄ 핡심 κ°€μΉ˜μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ ν™˜κ²½μ—μ„œ UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈμ€ 개발 초기 단계뢀터 μ‚¬μš©μž κ²½ν—˜μ„ κ²€μ¦ν•˜κ³ , κ°œλ°œμžμ™€ λ””μžμ΄λ„ˆ κ°„μ˜ μ›ν™œν•œ ν˜‘μ—…μ„ μ§€μ›ν•˜λŠ” μ€‘μš”ν•œ μš”μ†Œλ‘œ 자리 작고 μžˆμŠ΅λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬ와 λ¦¬μ•‘νŠΈ μŠ€ν† λ¦¬λΆ(Storybook) 등을 ν™œμš©ν•˜μ—¬ UI λ””μžμΈμ„ μ‹ μ†ν•˜κ²Œ μ‹œκ°ν™”ν•˜κ³  κ²€μ¦ν•˜λŠ” 방법, 그리고 이λ₯Ό ν†΅ν•œ 개발 ν”„λ‘œμ„ΈμŠ€μ™€ ν˜‘μ—… μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•΄ ꡬ체적으둜 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

    μ• μžμΌ 개발과 UI ν”„λ‘œν† νƒ€μ΄ν•‘μ˜ μ€‘μš”μ„±

    μ• μžμΌ κ°œλ°œμ€ 짧은 개발 주기와 지속적인 ν”Όλ“œλ°±μ„ 톡해 μ œν’ˆμ„ μ μ§„μ μœΌλ‘œ κ°œμ„ ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€. UI ν”„λ‘œν† νƒ€μ΄ν•‘μ€ μ΄λŸ¬ν•œ μ• μžμΌ 개발 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 핡심적인 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. 초기 λ‹¨κ³„μ—μ„œ ν”„λ‘œν† νƒ€μž…μ„ μ œμž‘ν•¨μœΌλ‘œμ¨, μ‚¬μš©μžμ™€ μ΄ν•΄κ΄€κ³„μžλ“€μ€ μ œν’ˆμ˜ λ””μžμΈ λ°©ν–₯κ³Ό κΈ°λŠ₯에 λŒ€ν•΄ λΉ λ₯΄κ²Œ μ˜κ²¬μ„ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 이후 μ‹€μ œ κ°œλ°œμ— μ•žμ„œ μš”κ΅¬μ‚¬ν•­μ„ λͺ…ν™•νžˆ ν•˜κ³ , λΆˆν•„μš”ν•œ μˆ˜μ • μž‘μ—…μ„ μ€„μ΄λŠ” 효과λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.

    ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄ λ””μžμ΄λ„ˆλŠ” μ™€μ΄μ–΄ν”„λ ˆμž„μ΄λ‚˜ μΈν„°λž™ν‹°λΈŒ ν”„λ‘œν† νƒ€μž…μ„ μ œμž‘ν•˜μ—¬ μ œν’ˆμ˜ 흐름과 μΈν„°λž™μ…˜μ„ 미리 κ²½ν—˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 도ꡬ듀은 Figma, Sketch, Adobe XD λ“± λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ œκ³΅ν•˜λ©°, 이λ₯Ό 톡해 μ‹€μ‹œκ°„ ν˜‘μ—…μ΄ κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€. κ°œλ°œμžμ™€ λ””μžμ΄λ„ˆκ°€ 같은 화면을 보며 λ…Όμ˜ν•˜λ©΄, λ””μžμΈκ³Ό κΈ°λŠ₯의 일관성을 μœ μ§€ν•  수 μžˆμ–΄ ν”„λ‘œμ νŠΈ μ „μ²΄μ˜ νš¨μœ¨μ„±μ΄ λ†’μ•„μ§‘λ‹ˆλ‹€.

    ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬλ₯Ό ν™œμš©ν•œ UI μ‹œκ°ν™”

    ν”„λ‘œν† νƒ€μ΄ν•‘ λ„κ΅¬λŠ” μ‚¬μš©μžμ˜ κ²½ν—˜μ„ μ‹€μ œμ™€ μœ μ‚¬ν•œ ν˜•νƒœλ‘œ μ‹œκ°ν™”ν•˜λŠ” 데 큰 도움을 μ€λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, Figmaλ₯Ό ν™œμš©ν•˜λ©΄ νŒ€μ›λ“€μ΄ λ™μ‹œμ— λ””μžμΈ νŒŒμΌμ— μ ‘κ·Όν•˜μ—¬ μˆ˜μ • 및 ν”Όλ“œλ°±μ„ μ‹€μ‹œκ°„μœΌλ‘œ 주고받을 수 있으며, μΈν„°λž™μ…˜μ„ ν¬ν•¨ν•œ ν”„λ‘œν† νƒ€μž…μ„ λΉ λ₯΄κ²Œ μ œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 초기 λ””μžμΈ 검증 λ‹¨κ³„μ—μ„œ μˆ˜μ • 사항을 λΉ λ₯΄κ²Œ λ°˜μ˜ν•˜κ³ , μ‚¬μš©μžμ˜ μš”κ΅¬μ— λ§žλŠ” UIλ₯Ό ꡬ좕할 수 μžˆμŠ΅λ‹ˆλ‹€.

    λ˜ν•œ, μ΄λŸ¬ν•œ 도ꡬ듀은 κ°œλ°œμžμ™€ λ””μžμ΄λ„ˆ κ°„μ˜ μ›ν™œν•œ μ†Œν†΅μ„ μœ„ν•΄ λ‹€μ–‘ν•œ ν”ŒλŸ¬κ·ΈμΈκ³Ό 연동 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ”λ°, μ΄λŠ” μ΅œμ’… μ œν’ˆμ— λŒ€ν•œ 이해도λ₯Ό 높이고, 개발 λ‹¨κ³„μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λ””μžμΈ 이슈λ₯Ό 사전에 λ°©μ§€ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

    λ¦¬μ•‘νŠΈ μŠ€ν† λ¦¬λΆ(Storybook)을 ν™œμš©ν•œ μ»΄ν¬λ„ŒνŠΈ λ””μžμΈ

    λ¦¬μ•‘νŠΈ μŠ€ν† λ¦¬λΆμ€ UI μ»΄ν¬λ„ŒνŠΈλ₯Ό λ…λ¦½μ μœΌλ‘œ 개발, ν…ŒμŠ€νŠΈ, λ¬Έμ„œν™”ν•  수 μžˆλŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€. μŠ€ν† λ¦¬λΆμ„ μ‚¬μš©ν•˜λ©΄ κ°œλ³„ μ»΄ν¬λ„ŒνŠΈλ₯Ό 격리된 ν™˜κ²½μ—μ„œ λ Œλ”λ§ν•˜κ³ , λ‹€μ–‘ν•œ μƒνƒœμ™€ λ³€ν˜•μ„ μ‹œκ°μ μœΌλ‘œ 확인할 수 μžˆμ–΄, μ»΄ν¬λ„ŒνŠΈμ˜ μž¬μ‚¬μš©μ„±κ³Ό μœ μ§€λ³΄μˆ˜μ„±μ„ 크게 ν–₯μƒμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

    μŠ€ν† λ¦¬λΆμ˜ μ£Όμš” μž₯점은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

    • 독립적인 μ»΄ν¬λ„ŒνŠΈ 개발: 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΆ„λ¦¬λœ μƒνƒœμ—μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°œλ°œν•  수 μžˆμ–΄, λΉ λ₯Έ ν”Όλ“œλ°±κ³Ό 디버깅이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • λ¬Έμ„œν™”: 각 μ»΄ν¬λ„ŒνŠΈμ˜ μ‚¬μš©λ²•, props, μΈν„°λž™μ…˜ 등을 λ¬Έμ„œν™”ν•˜μ—¬, νŒ€ λ‚΄ λ‹€λ₯Έ κ°œλ°œμžμ™€ λ””μžμ΄λ„ˆκ°€ μ‰½κ²Œ μ΄ν•΄ν•˜κ³  ν™œμš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
    • ν…ŒμŠ€νŠΈ μžλ™ν™”: μŠ€ν† λ¦¬λΆκ³Ό μ—°λ™λœ μ‹œκ°μ  νšŒκ·€ ν…ŒμŠ€νŠΈ 도ꡬλ₯Ό μ‚¬μš©ν•˜λ©΄, UI λ³€κ²½ μ‹œ λ°œμƒν•  수 μžˆλŠ” 였λ₯˜λ₯Ό 사전에 κ²€μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ•„λž˜λŠ” κ°„λ‹¨ν•œ μŠ€ν† λ¦¬λΆ 예제 μ½”λ“œμž…λ‹ˆλ‹€. λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈλ₯Ό μŠ€ν† λ¦¬λΆμœΌλ‘œ λ¬Έμ„œν™”ν•˜λŠ” 방법을 λ³΄μ—¬λ“œλ¦½λ‹ˆλ‹€.

    // Button.jsx
    import React from 'react';
    import PropTypes from 'prop-types';
    import styled from 'styled-components';
    
    const StyledButton = styled.button`
      background-color: ${(props) => props.primary ? '#1976d2' : '#e0e0e0'};
      color: ${(props) => props.primary ? '#ffffff' : '#333333'};
      padding: 10px 20px;
      border: none;
      border-radius: 4px;
      font-size: 1rem;
      cursor: pointer;
      transition: background-color 0.3s ease;
    
      &:hover {
        opacity: 0.85;
      }
    `;
    
    const Button = ({ primary, label, onClick }) => (
      <StyledButton primary={primary} onClick={onClick}>
        {label}
      </StyledButton>
    );
    
    Button.propTypes = {
      primary: PropTypes.bool,
      label: PropTypes.string.isRequired,
      onClick: PropTypes.func,
    };
    
    Button.defaultProps = {
      primary: false,
      onClick: () => {},
    };
    
    export default Button;
    // Button.stories.jsx
    import React from 'react';
    import Button from './Button';
    
    export default {
      title: 'Example/Button',
      component: Button,
    };
    
    const Template = (args) => <Button {...args} />;
    
    export const Primary = Template.bind({});
    Primary.args = {
      primary: true,
      label: 'Primary Button',
    };
    
    export const Secondary = Template.bind({});
    Secondary.args = {
      primary: false,
      label: 'Secondary Button',
    };

    μœ„ μ˜ˆμ œλŠ” λ²„νŠΌ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ…λ¦½μ μœΌλ‘œ κ°œλ°œν•˜κ³ , μŠ€ν† λ¦¬λΆμ„ 톡해 λ‹€μ–‘ν•œ μƒνƒœ(Primary, Secondary λ“±)λ₯Ό 미리 확인할 수 μžˆλ„λ‘ κ΅¬μ„±ν•œ μ‚¬λ‘€μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈκ°€ μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— ν†΅ν•©λ˜κΈ° 전에 λ””μžμΈκ³Ό κΈ°λŠ₯을 검증할 수 있으며, UI λ³€κ²½ μ‹œ νŒ€ λ‚΄ ν”Όλ“œλ°±μ„ μ‹ μ†ν•˜κ²Œ λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    개발 ν”„λ‘œμ„ΈμŠ€μ™€ ν˜‘μ—… μ‹œλ‚˜λ¦¬μ˜€

    μ• μžμΌ 개발 ν™˜κ²½μ—μ„œ UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈμ€ λ‹¨μˆœνžˆ 기술적인 츑면뿐만 μ•„λ‹ˆλΌ, νŒ€ λ‚΄ ν˜‘μ—… ν”„λ‘œμ„ΈμŠ€λ₯Ό ν˜μ‹ ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. 개발자, λ””μžμ΄λ„ˆ, 기획자 등이 κΈ΄λ°€ν•˜κ²Œ ν˜‘μ—…ν•˜λ©° μ•„λž˜μ™€ 같은 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό 톡해 νš¨μœ¨μ„±μ„ κ·ΉλŒ€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    1. 초기 아이디어 λ„μΆœ 및 μ™€μ΄μ–΄ν”„λ ˆμž„ μž‘μ„±
      • 기획 λ‹¨κ³„μ—μ„œ Figmaλ‚˜ Sketch와 같은 ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬλ₯Ό ν™œμš©ν•˜μ—¬ 기본적인 UI 흐름과 λ ˆμ΄μ•„μ›ƒμ„ μ‹œκ°ν™”ν•©λ‹ˆλ‹€.
      • κΈ°νšμžμ™€ λ””μžμ΄λ„ˆλŠ” 이λ₯Ό 기반으둜 ν”Όλ“œλ°±μ„ μ£Όκ³ λ°›μœΌλ©°, 초기 컨셉을 λͺ…ν™•ν•˜κ²Œ μ •λ¦¬ν•©λ‹ˆλ‹€.
    2. μΈν„°λž™ν‹°λΈŒ ν”„λ‘œν† νƒ€μž… μ œμž‘ 및 검증
      • μΈν„°λž™μ…˜μ„ ν¬ν•¨ν•œ ν”„λ‘œν† νƒ€μž…μ„ μ œμž‘ν•˜μ—¬, μ‚¬μš©μž κ²½ν—˜κ³Ό UI 흐름을 μ‹€μ œμ™€ μœ μ‚¬ν•˜κ²Œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
      • νŒ€ λ‚΄ 회의λ₯Ό 톡해 ν”„λ‘œν† νƒ€μž…μ„ κ³΅μœ ν•˜κ³ , μ‚¬μš©μ„± ν…ŒμŠ€νŠΈ 및 ν”Όλ“œλ°±μ„ λ°˜μ˜ν•©λ‹ˆλ‹€.
    3. λ¦¬μ•‘νŠΈ μŠ€ν† λ¦¬λΆμ„ ν™œμš©ν•œ μ»΄ν¬λ„ŒνŠΈ 개발
      • κ°œλ°œμžλŠ” μŠ€ν† λ¦¬λΆμ„ ν™œμš©ν•˜μ—¬ 독립적인 UI μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°œλ°œν•˜κ³ , 각 μ»΄ν¬λ„ŒνŠΈμ˜ λ‹€μ–‘ν•œ μƒνƒœλ₯Ό 미리 κ²€μ¦ν•©λ‹ˆλ‹€.
      • μŠ€ν† λ¦¬λΆμ€ μ»΄ν¬λ„ŒνŠΈ λ¬Έμ„œν™” λ„κ΅¬λ‘œμ„œ, νŒ€μ›λ“€μ΄ μ»΄ν¬λ„ŒνŠΈ μ‚¬μš©λ²•κ³Ό λ””μžμΈ κ°€μ΄λ“œλ₯Ό μ‰½κ²Œ μ°Έκ³ ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
    4. 지속적인 ν”Όλ“œλ°± 및 반볡 κ°œμ„ 
      • μŠ€ν† λ¦¬λΆκ³Ό ν”„λ‘œν† νƒ€μž… 도ꡬλ₯Ό 톡해 μ§€μ†μ μœΌλ‘œ ν”Όλ“œλ°±μ„ μˆ˜μ§‘ν•˜κ³ , UI λ””μžμΈ 및 κΈ°λŠ₯을 κ°œμ„ ν•©λ‹ˆλ‹€.
      • μ• μžμΌ μŠ€ν”„λ¦°νŠΈ νšŒμ˜μ—μ„œ 진행 상황을 κ³΅μœ ν•˜λ©°, 각 μ»΄ν¬λ„ŒνŠΈμ˜ μ„±λŠ₯κ³Ό λ””μžμΈ 일관성을 κ²€ν† ν•©λ‹ˆλ‹€.
    5. μ΅œμ’… 톡합 및 μ‚¬μš©μž ν…ŒμŠ€νŠΈ
      • λ…λ¦½μ μœΌλ‘œ 개발된 μ»΄ν¬λ„ŒνŠΈλ₯Ό 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— ν†΅ν•©ν•œ ν›„, μ‚¬μš©μž ν…ŒμŠ€νŠΈλ₯Ό 톡해 μ‹€μ œ μ‚¬μš© ν™˜κ²½μ—μ„œμ˜ λ¬Έμ œμ μ„ ν™•μΈν•©λ‹ˆλ‹€.
      • κ°œμ„  사항을 λ„μΆœν•˜μ—¬, λ‹€μŒ μŠ€ν”„λ¦°νŠΈμ—μ„œ λ°˜μ˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ 지속적인 κ°œμ„  사이클을 μœ μ§€ν•©λ‹ˆλ‹€.

    이와 같이, UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈμ€ μ• μžμΌ 개발 ν”„λ‘œμ„ΈμŠ€ λ‚΄μ—μ„œ μ€‘μš”ν•œ 역할을 ν•˜λ©°, νŒ€ λ‚΄ ν˜‘μ—…μ„ μ΄‰μ§„ν•˜κ³  μ΅œμ’… μ œν’ˆμ˜ 완성도λ₯Ό λ†’μ΄λŠ” 데 κΈ°μ—¬ν•©λ‹ˆλ‹€.

    κ²°λ‘ 

    μ• μžμΌ 개발 ν™˜κ²½μ—μ„œ UI ν”„λ‘œν† νƒ€μ΄ν•‘κ³Ό μ»΄ν¬λ„ŒνŠΈ λ””μžμΈμ€ λΉ λ₯Έ ν”Όλ“œλ°±κ³Ό 반볡적인 κ°œμ„ μ„ κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 핡심 λ„κ΅¬μž…λ‹ˆλ‹€. ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬ와 λ¦¬μ•‘νŠΈ μŠ€ν† λ¦¬λΆμ„ ν™œμš©ν•˜λ©΄, 초기 λ‹¨κ³„μ—μ„œ UI λ””μžμΈμ„ μ‹œκ°μ μœΌλ‘œ κ²€μ¦ν•˜κ³ , 독립적인 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°œλ°œν•˜λ©°, νŒ€μ› κ°„μ˜ ν˜‘μ—…μ„ μ›ν™œν•˜κ²Œ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ ‘κ·Ό 방식은 전체 개발 ν”„λ‘œμ„ΈμŠ€μ˜ νš¨μœ¨μ„±μ„ κ·ΉλŒ€ν™”ν•˜κ³ , μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•˜λŠ” 데 큰 역할을 ν•©λ‹ˆλ‹€.

    μ•žμœΌλ‘œλ„ λ³€ν™”ν•˜λŠ” 기술 νŠΈλ Œλ“œμ™€ μ‚¬μš©μž μš”κ΅¬μ— 맞좰, μ§€μ†μ μœΌλ‘œ UI ν”„λ‘œν† νƒ€μ΄ν•‘ 도ꡬ와 μ»΄ν¬λ„ŒνŠΈ λ””μžμΈ 기법을 λ°œμ „μ‹œν‚€κ³ , μ• μžμΌ 개발 방식에 맞좘 ν˜‘μ—… ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•ν™”ν•΄ λ‚˜κ°€μ‹œκΈΈ ꢌμž₯λ“œλ¦½λ‹ˆλ‹€. 이λ₯Ό 톡해 λ”μš± λΉ λ₯΄κ³  μ •ν™•ν•œ μ œν’ˆ 개발과 성곡적인 ν”„λ‘œμ νŠΈ 운영이 κ°€λŠ₯ν•  κ²ƒμž…λ‹ˆλ‹€.

    λ°˜μ‘ν˜•

    λŒ“κΈ€