AI 웹 개발 : UI/UX 개선 + 코드 최적화로 게시판 완성하기 (초보자ㆍ비전공자를 위한 AI 웹 개발 실무 시리즈) | Part 5

우리는 Part 1 ~ Part 4에서 게시판 구조 설계 → 반응형 레이아웃 → 글/댓글 기능 → 검색·필터·페이징까지 구현해 왔습니다.
이번 Part 5는 ‘기능 구현’이 아니라 ‘완성도’를 끌어올리는 단계입니다.

실무에서 “동작은 한다”“잘 만든 서비스다”의 차이는 바로 UI/UX 디테일과 코드 품질에서 갈립니다.
이번 편에서는 다음 세 가지를 중심으로 게시판을 실제 서비스 수준으로 마무리합니다.

AI와 협업하여 웹개발을 하는 개발자를 AI를 활용해 시각화 한 이미지입니다.
본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
AI와 협업하여 웹개발을 하는 개발자를 AI를 활용해 시각화 한 이미지입니다.
본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

Part 5에서 완성할 것

  1. UI/UX 개선
    • 사용자 피드백을 고려한 인터랙션 정리
    • 시각적 밀도 조절 (가독성, 여백, 강조)
    • 모바일 UX 최적화
  2. 코드 구조 및 성능 최적화
    • 중복 코드 제거
    • 렌더링/이벤트 처리 개선
    • 유지보수 가능한 구조로 정리
  3. Cursor AI를 활용한 리팩토링 워크플로우
    • “어떻게 질문해야 제대로 고쳐주는지”
    • 실제로 써먹을 수 있는 단계별 프롬프트

1. UI/UX 개선: 기능은 그대로, 사용성은 다르게

1-1. 사용자가 헷갈리는 지점부터 정리

게시판에서 사용자가 가장 많이 겪는 불편은 다음과 같습니다.

  • 현재 페이지 위치를 알기 어렵다.
  • 검색 후 무슨 조건이 적용됐는지 모른다.
  • 버튼은 많은데 어디를 눌러야 할지 눈에 안 들어온다.

👉 해결의 핵심은 “정보를 줄이는 게 아니라, 계층을 명확히 하는 것” 입니다.

1-2. 시각적 계층 구조 만들기

Before

  • 모든 텍스트 크기 비슷
  • 버튼 색상 통일
  • 강조 요소가 없음

After

  • 제목 / 메타 정보 / 본문 명확히 분리
  • 주요 액션 버튼만 컬러 강조
  • 나머지는 중립 색상 유지

적용 예:

  • 글 제목: 가장 큰 폰트 + 굵기 강조
  • 작성자/날짜: 작은 폰트 + 회색 톤
  • “글쓰기”, “검색” 버튼만 메인 컬러

UX는 ‘디자인 센스’가 아니라 우선순위의 문제입니다.

1-3. 모바일 UX 최적화

Part 2에서 반응형 레이아웃을 만들었지만, 모바일 UX는 반응형과 다릅니다.

체크 포인트

  • 버튼 간 간격 충분한가?
  • 한 손 조작 기준으로 주요 버튼이 배치됐는가?
  • 테이블이 모바일에서 읽기 가능한가?

개선 방식

  • 테이블 → 모바일에서는 카드형 리스트로 전환
  • 페이지네이션 → 숫자 축소 + 이전/다음 중심
  • 검색 필터 → 접었다 펼 수 있게 처리

2. 코드 최적화 : “돌아가는 코드”→ “관리되는 코드”

2-1. Part 4까지의 코드 문제점

기능을 빠르게 만들다 보면 보통 이런 상태가 됩니다.

  • 비슷한 fetch 로직이 여러 군데 존재
  • 이벤트 리스너 중복
  • 전역 변수 증가
  • UI 렌더링과 데이터 로직이 섞임

👉 지금 정리하지 않으면, 기능 추가할수록 수정 비용이 기하 급수적으로 증가하게 되며 추후 유지보수도 어려워집니다.

2-2. 코드 정리 전략

① 역할 기준으로 분리

  • data 관련 로직
  • UI 렌더링 로직
  • 이벤트 처리 로직

② “한 함수 = 한 책임” 원칙

  • 검색 조건 생성 함수
  • 게시글 리스트 렌더 함수
  • 페이지네이션 렌더 함수

③ 불필요한 DOM 접근 최소화

  • 반복되는 querySelector 제거
  • 캐싱 후 재사용

2-3. 성능 관점에서의 개선

  • 불필요한 재렌더링 제거
  • 검색/필터 변경 시 전체 초기화 대신 부분 갱신
  • 이벤트 위임 방식 적용

이 단계에서 코드 길이는 오히려 줄어드는 경우가 많습니다.
최적화 = 복잡해지는 게 아니라, 단순해지는 과정입니다.


3. Cursor AI로 리팩토링하는 “실전 프롬프트 전략”

여기서 많은 사람이 실수합니다.

❌ “이 코드 최적화해줘”
❌ “리팩토링해줘”

이렇게 던지면 의도와 다른 결과가 나오게 됩니다.
핵심은 “어떻게 명령하느냐” 에 따라 달라집니다.

3-1. Cursor에게 지시하는 기본 원칙

Cursor는 “단계적 지시”에 가장 강합니다.
아래 순서대로 입력하는 것을 추천 드립니다.

[Cursor AI 바로가기]

Step 1. 역할과 목표를 먼저 정의

너는 실무 웹 개발자야.
현재 게시판 프로젝트의 프론트엔드 코드를
유지보수성과 성능을 기준으로 개선하려고 해.
기능 변경 없이 구조만 개선해줘.
Cursor AI 에 입력한 프롬프트.
본 이미지는 이해를 돕기 위해 직접 캡쳐한 화면입니다. 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI 에 입력한 프롬프트.
본 이미지는 이해를 돕기 위해 직접 캡쳐한 화면입니다. 저작권은 블로그 주인 제로에게 있습니다.

Cursor가 만든 소스코드(일부발췌)

/**
     * 검색 기능 초기화
     */
    function initSearch() {
        const searchForm = document.querySelector('.search-form');
        const searchInput = document.getElementById('search-keyword');
        const searchBtn = document.querySelector('.search-btn');

        if (!searchForm || !searchInput || !searchBtn) return;

        // 검색 버튼 클릭 이벤트
        searchBtn.addEventListener('click', handleSearch);

        // Enter 키 이벤트
        searchInput.addEventListener('keypress', function(e) {
            if (e.key === 'Enter') {
                e.preventDefault();
                handleSearch();
            }
        });
    }
/**
     * 필터 기능 초기화
     */
    function initFilter() {
        const sortFilter = document.getElementById('sort-filter');
        
        if (!sortFilter) return;

        sortFilter.addEventListener('change', function(e) {
            const sortValue = e.target.value;
            // 정렬 로직 구현 (현재는 구조만 제공)
            console.log('정렬 방식:', sortValue);
        });
    }

Cursor가 만든 소스코드 설명

  • 별도 파일 분리: board.js 생성으로 HTML과 로직 분리
  • IIFE 패턴 적용: 전역 스코프 오염 방지
  • 이벤트 핸들러 구조화: 검색, 필터, 페이지네이션 기능 모듈화
Cursor AI가 생성한 게시판 페이지. 이벤트 핸들러 구조화로 모듈화를 구현한 모습입니다.
이해를 돕기 위해 제공하는 캡쳐 화면으로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI가 생성한 게시판 페이지. 이벤트 핸들러 구조화로 모듈화를 구현한 모습입니다.
이해를 돕기 위해 제공하는 캡쳐 화면으로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

Step 2. 개선 기준을 명확히 제시

리팩토링 기준은 다음이야.
1. 중복 코드 제거
2. 함수 단위 책임 분리
3. 전역 변수 최소화
4. 렌더링 로직과 데이터 로직 분리
Cursor AI에 입력한 프롬프트.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지입니다. 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI에 입력한 프롬프트.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지입니다. 저작권은 블로그 주인 제로에게 있습니다.

Cursor가 생성한 소스코드(일부발췌)

// ============================================
    // 데이터 모듈 (Data Module)
    // ============================================
    const DataManager = {
        /**
         * 검색어 처리
         */
        processSearch: function(keyword) {
            const trimmedKeyword = keyword.trim();
            // 검색 로직 구현 (데이터 처리만 담당)
            return {
                keyword: trimmedKeyword,
                isValid: trimmedKeyword.length > 0
            };
        },

        /**
         * 정렬 처리
         */
        processSort: function(sortValue) {
            // 정렬 로직 구현 (데이터 처리만 담당)
            return {
                sortType: sortValue,
                sortOrder: sortValue === 'latest' ? 'desc' : 'asc'
            };
        },

        /**
         * 페이지네이션 처리
         */
        processPagination: function(pageInfo) {
            // 페이지네이션 로직 구현 (데이터 처리만 담당)
            return {
                currentPage: pageInfo.page || 1,
                action: pageInfo.action || 'move'
            };
        }
    };

Cursor가 생성한 소스코드 설명

  • DataManager: 데이터 처리만 담당 (검색, 정렬, 페이지네이션 데이터 처리)
  • Renderer: UI 업데이트만 담당 (검색 결과, 정렬 결과, 페이지네이션 렌더링)
  • 각 모듈은 데이터 처리 후 Renderer를 호출해 UI 업데이트
Cursor AI가 생성한 페이지.
이해를 돕기 위해 제공하는 캡쳐로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI가 생성한 페이지.
이해를 돕기 위해 제공하는 캡쳐로 본 이미지의 저작권은 블로그 주인 제로에게 있습니다.

Step 3. 작업 단위를 제한

먼저 게시글 목록 렌더링 부분만 리팩토링해줘.
전체 파일을 한 번에 수정하지 말고,
변경 이유를 주석으로 설명해줘.
Cursor AI 에 입력한 프롬프트
이해를 돕기위해 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI 에 입력한 프롬프트
이해를 돕기위해 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.

Cursor 가 생성한 소스코드(일부발췌)

const DataManager = {
        /**
         * 게시글 데이터 저장소
         * 변경 이유: HTML에 하드코딩된 데이터를 JavaScript로 분리하여
         * 데이터와 렌더링 로직을 분리하고, 향후 API 연동 시 쉽게 교체 가능하도록 함
         */
        posts: [
            { id: 1, title: '첫 번째 게시글 제목입니다', author: '홍길동', date: '2024-01-15', views: 123 },
            { id: 2, title: '두 번째 게시글 제목입니다', author: '김철수', date: '2024-01-14', views: 456 },
            { id: 3, title: '세 번째 게시글 제목입니다', author: '이영희', date: '2024-01-13', views: 789 },
            { id: 4, title: '네 번째 게시글 제목입니다', author: '박민수', date: '2024-01-12', views: 234 },
            { id: 5, title: '다섯 번째 게시글 제목입니다', author: '최지영', date: '2024-01-11', views: 567 }
        ],

        /**
         * 게시글 목록 조회
         * 변경 이유: 데이터 접근을 함수로 캡슐화하여 향후 필터링, 정렬 등의
         * 로직을 추가할 때 유연하게 대응 가능하도록 함
         */
        getPosts: function() {
            return this.posts;
        },

Cursor 가 생성한 소스코드 설명

  • HTML에 하드코딩된 데이터를 JavaScript로 분리
  • 향후 API 연동 시 쉽게 교체 가능
Cursor AI가 생성한 페이지.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI가 생성한 페이지.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.

Step 4. 검증 요청

기존 기능과 동작이 동일한지 체크 포인트를 정리해줘.
추가로 개선 가능한 부분이 있다면 목록으로만 제안해줘.

👉 이 흐름을 따르면 **“AI에게 코드 맡기기”가 아니라
“AI를 주니어 개발자처럼 쓰는 방식”**이 된다.

Cursor AI에 입력한 프롬프트.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.
Cursor AI에 입력한 프롬프트.
이해를 돕기 위해 직접 캡쳐하여 제공하는 이미지로 저작권은 블로그 주인 제로에게 있습니다.

Cursor AI가 생성한 소스코드(일부발췌)


### 1. 게시글 목록 렌더링
- [ ] **게시글 개수**: 5개 게시글이 모두 표시되는가?
- [ ] **게시글 순서**: 번호 순서대로 표시되는가? (1, 2, 3, 4, 5)
- [ ] **게시글 데이터**: 제목, 작성자, 날짜, 조회수가 원본과 동일한가?
  - 게시글 1: "첫 번째 게시글 제목입니다", 홍길동, 2024.01.15, 123
  - 게시글 2: "두 번째 게시글 제목입니다", 김철수, 2024.01.14, 456
  - 게시글 3: "세 번째 게시글 제목입니다", 이영희, 2024.01.13, 789
  - 게시글 4: "네 번째 게시글 제목입니다", 박민수, 2024.01.12, 234
  - 게시글 5: "다섯 번째 게시글 제목입니다", 최지영, 2024.01.11, 567

### 2. HTML 구조 및 클래스명
- [ ] **컨테이너**: `.post-list` 클래스가 유지되는가?
- [ ] **게시글 아이템**: `.post-item` 클래스가 각 게시글에 적용되는가?
- [ ] **하위 요소 클래스명**:
  - `.post-number` (게시글 번호)
  - `.post-title` (제목 컨테이너)
  - `.post-link` (제목 링크)
  - `.post-author` (작성자)
  - `.post-date` (작성일)
  - `.post-views` (조회수)
- [ ] **시맨틱 태그**: `<article>`, `<time>` 태그가 올바르게 사용되는가?
- [ ] **링크**: `detail.html`로 연결되는가?

Cursor AI가 생성한 소스코드 설명

  1. 게시글 목록: 5개 게시글이 모두 표시되는지
  2. HTML 구조: 클래스명과 시맨틱 태그가 유지되는지
  3. 접근성: ARIA 속성이 모두 유지되는지
  4. 데이터 일치: 제목, 작성자, 날짜, 조회수가 원본과 동일한지
  5. JavaScript 기능: 검색, 필터, 페이지네이션 이벤트가 동작하는지

4. Part 5를 끝으로, 이 시리즈에서 얻어야 할 것

이 시리즈의 핵심은 게시판 자체가 아닙니다.

  • AI를 활용해 웹 기능을 설계하는 사고 방식
  • 기능 구현 이후 품질을 끌어올리는 방법
  • Cursor를 “자동 코더”가 아니라 개발 파트너로 쓰는 법

이 감각이 잡히면,

  • 쇼핑몰
  • 관리자 페이지
  • 대시보드
  • 사내 업무 시스템

어떤 주제든 혼자서 끝까지 완성할 수 있습니다.

전체 소스코드 보기 => [제로의 GitHub 저장소 바로가기]


마무리

Part 1 ~ Part 5까지 따라왔다면,
여러분들은 이제 AI로 웹 서비스를 끝까지 만들어본 경험을 한 것입니다.

여러분들의 이 경험은 AI로 랜딩페이지를 만들어 판매하는 부업러,
초급 개발자로서 첫 걸음을 내딛는 분들에게도 좋은 경험이 될 것이라 생각합니다.

이제 “기능 구현자”가 아니라
“완성도를 책임지는 개발자” 단계로 넘어갈 차례입니다.

이전 편 다시보기

AI 웹 개발 : 쇼핑몰 페이지 편(Part1~Part5) 다시보기
AI 웹 개발 : 반응형 게시판 기본 레이아웃 만들기 (초보자ㆍ비전공자를 위한 AI 웹 개발 실무 시리즈) | Part 2
AI 웹 개발 : 반응형 게시판 글쓰기 & 댓글 기능 구현하기 (초보자ㆍ비전공자를 위한 AI 웹 개발 실무 시리즈) | Part 3
AI 웹 개발 : 페이징·검색·필터 기능 구현하기 (초보자ㆍ비전공자를 위한 AI 웹 개발 실무 시리즈) | Part 4

 AI 코딩 시리즈 다시보기

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤