게시판 스킨 아키텍처

게시판 스킨 아키텍처

게시판 스킨의 구조와 설계 원칙을 학습합니다.

스킨 구조 개요

기본 파일 구성

board_skin/
├── conf/
│   └── info.xml          # 스킨 정보
├── list.html             # 목록 템플릿
├── view.html             # 상세보기 템플릿
├── write.html            # 쓰기/수정 템플릿
├── comment.html          # 댓글 템플릿
├── css/
│   └── style.css         # 스타일시트
├── js/
│   └── script.js         # JavaScript
└── images/
    └── icons/            # 이미지 리소스

템플릿 시스템

기본 템플릿 구조

<!-- list.html 기본 구조 -->
<div class="board-list">
    <div class="board-header">
        <!-- 게시판 제목 및 설명 -->
    </div>

    <div class="board-toolbar">
        <!-- 검색, 필터, 정렬 옵션 -->
    </div>

    <div class="board-content">
        <!-- 게시물 목록 -->
    </div>

    <div class="board-footer">
        <!-- 페이지네이션, 쓰기 버튼 -->
    </div>
</div>

데이터 플로우

컨트롤러 → 뷰 데이터 전달

// BoardController에서 템플릿으로 전달되는 주요 변수들
$oTemplate->assign(array(
    'document_list' => $document_list,     // 게시물 목록
    'page_navigation' => $page_navigation, // 페이지네이션
    'search_option' => $search_option,     // 검색 옵션
    'module_info' => $module_info,         // 모듈 설정
    'logged_info' => $logged_info,         // 로그인 정보
    'grant' => $grant                      // 권한 정보
));

스킨 커스터마이징

CSS 변수 활용

:root {
    --board-primary-color: #007bff;
    --board-secondary-color: #6c757d;
    --board-border-color: #dee2e6;
    --board-background-color: #ffffff;
    --board-text-color: #212529;
    --board-spacing-unit: 1rem;
}

.board-list {
    background-color: var(--board-background-color);
    color: var(--board-text-color);
    border: 1px solid var(--board-border-color);
}

반응형 설계

/* 모바일 우선 접근 */
.board-list {
    width: 100%;
    overflow-x: auto;
}

/* 태블릿 */
@media (min-width: 768px) {
    .board-list {
        display: grid;
        grid-template-columns: 1fr 200px;
    }
}

/* 데스크톱 */
@media (min-width: 1024px) {
    .board-list {
        max-width: 1200px;
        margin: 0 auto;
    }
}

컴포넌트 패턴

재사용 가능한 컴포넌트

<!-- 게시물 아이템 컴포넌트 -->
<include target="components/document-item.html" document="{$document}" />

<!-- 페이지네이션 컴포넌트 -->
<include target="components/pagination.html" page_navigation="{$page_navigation}" />

<!-- 검색 폼 컴포넌트 -->
<include target="components/search-form.html" search_option="{$search_option}" />

성능 최적화

이미지 최적화

<!-- 썸네일 지연 로딩 -->
<img data-src="{$document->getThumbnail(300, 200)}" 
     alt="{$document->getTitle()}" 
     class="lazy-load thumbnail" />

JavaScript 최적화

// 필요한 경우에만 스크립트 로드
if (document.querySelector('.gallery-view')) {
    import('./modules/gallery.js').then(module => {
        module.initGallery();
    });
}

접근성 고려사항

ARIA 속성 활용

<nav aria-label="게시판 내비게이션">
    <ul role="menubar">
        <li role="menuitem" aria-current="page">
            <a href="#">목록</a>
        </li>
    </ul>
</nav>

<main role="main" aria-label="게시판 내용">
    <!-- 게시판 컨텐츠 -->
</main>

다음 단계

스킨 아키텍처를 이해했다면, 갤러리 게시판에서 실제 구현을 학습하세요.