4-1. 🏗️ 핵심 기능 기본구조
4.1 프로젝트 소스 구성
홍익인간CMS는 크게 두 개의 주요 모듈로 구성되어 있습니다.
4.1.1 BO (humanframe.backoffice)
관리자 영역 및 기본 시스템 구동, 스케줄러 등 메타 데이터를 관리하는 프로젝트입니다. CMS의 기본 관리자 기능 및 시스템 운영에 필요한 요소가 있으며, 개발자가 직접 수정 가능합니다.
주요 패키지 구조
aop.aspect
관리자 AOP 구현, 관리자 게시판 권한 검증, 관리자 로그 저장, 사용자 게시판 권한 검증 및 설정 조회
- admin: 관리자 관련 AOP (AdminBbsAspect, AdminLogAspect, AdminPrivacyAspect 등)
- web: 사용자 관련 AOP (UsrChkAuthBeforeAspect, UsrChkPermNttBeforeAspect 등)
common
공통 기능 정의 - 공통코드맵, DB 코드 관리자 구분하여 시스템 운영 시 등록 변경이 필요하지 않은 코드 데이터를 모은 것으로 가급적 수정을 금하며, 수정 시 주의가 필요함
controller
스프링 컨트롤러 클래스 모음, 시스템 운영 및 CMS기반 프로그램 컨트롤러
| 📁 패키지 | 📋 설명 |
|---|---|
| ajax | AJAX 요청 처리 컨트롤러 |
| banner | 배너 관리 컨트롤러 |
| bbs | 게시판 관리 컨트롤러 |
| cm | 공통 관리 컨트롤러 |
| cntnts | 콘텐츠 관리 컨트롤러 |
| comm | 공통 컨트롤러 |
| dashboard | 대시보드 컨트롤러 |
| fnct | 기능 관련 컨트롤러 |
| front | 프론트엔드 관련 컨트롤러 |
| index | 인덱스 페이지 컨트롤러 |
| login | 로그인 관련 컨트롤러 |
| mber | 회원 관리 컨트롤러 |
| media | 미디어 관리 컨트롤러 |
| metadata | 메타데이터 관리 컨트롤러 |
| mng | 관리 기능 컨트롤러 |
| oauth | OAuth 인증 관련 컨트롤러 |
| pblcate | 발행 관련 컨트롤러 |
| popup | 팝업 관리 컨트롤러 |
| privacy | 개인정보 관리 컨트롤러 |
| site | 사이트 관리 컨트롤러 |
| stats | 통계 관리 컨트롤러 |
dao
Data Access Object 모음, 각종 DAO
interceptor
관리자 Interceptor 구현, 관리자 로그인 체크, URI 파라미터 검증 등
scheduler
시스템 스케줄러 관리, 미니게시판 JSON데이터 생성, 메뉴통계 데이터 생성
service
스프링 서비스 및 구현 클래스
- impl: 서비스 구현 클래스
session
관리자 및 사용자 Session 클래스
tld.button
JSP Tag Library 등 태그 클래스
util
각종 유틸리티 클래스
view
RssViewer 클래스
vo
Value Object 클래스
4.1.2 WEB (humanframe.web)
CMS의 사용자 영역에 대한 자바 클래스 및 Frontend Presentation(화면자원, 사용자 컨텐츠 처리)를 위한 각종 리소스(jsp, xml, js, css 등)로 구성됩니다. 주로, CMS 기본 기능이 아닌 추가 기능에 대한 전체 프로그램 소스(Java class, jsp, xml 등)는 이 프로젝트에 포함됩니다.
주요 패키지 구조
common
공통기능정의 - 공통코드맵, 공통상수 등
controller
스프링 컨트롤러 클래스 모음, 추가 개발 프로그램 컨트롤러
- admin: 관리자 기능 컨트롤러
- front: 프론트엔드 컨트롤러
dao
Data Access Object 모음, 각종 DAO
filter
XSSWebFilter, MberLoginFilter 등
interceptor
사용자 URIInterceptor 구현, 전달 URI 검증 및 URI에 따른 메뉴정보 연결
security
암호화 관련 클래스
service
스프링 서비스 및 구현 클래스
- impl: 서비스 구현 클래스
vo
Value Object 클래스
4.2 리소스 구성
4.2.1 Spring Context 설정 파일
홍익인간CMS는 다양한 Spring Context 설정 파일을 통해 시스템의 동작을 정의합니다.
context-backoffice.xml
관리자 사용자 세션 bean 정의
context-crypto.xml
암호화 bean 정의
context-datasource.xml
데이터베이스 연결 설정
context-mapper.xml
MyBatis 매퍼 설정
context-properties.xml
시스템 속성 설정
context-scheduler.xml
스케줄러 bean 정의, 미니게시판, 메뉴통계
context-transaction.xml
트랜잭션 관리 설정
human-resource.xml
리소스 관련 설정
4.2.2 웹앱 구조
웹 애플리케이션은 다음과 같은 주요 디렉토리로 구성되어 있습니다:
common
공통 리소스
data
데이터 파일
humanframe
CMS 핵심 리소스
- admin: 관리자 페이지 리소스
- theme: 사용자 테마 리소스
- global: 공통 리소스
json
JSON 데이터 파일
webeditor
웹 에디터 리소스
webeditorplus
확장 웹 에디터 리소스
WEB-INF
웹 애플리케이션 설정 및 클래스 파일
- jsp: JSP 파일
- config: 설정 파일
- tld: 태그 라이브러리 정의 파일
4.3 사용자 관리
4.3.1 인증 및 권한 관리
홍익인간CMS는 사용자 인증 및 권한 관리를 위해 Spring Security와 자체 개발된 권한 관리 시스템을 함께 사용합니다.
주요 기능
- 사용자 로그인/로그아웃
- 권한 그룹 관리
- 메뉴별 접근 권한 설정
- 게시판별 권한 설정
- IP 기반 접근 제어
권한 관리 구조
사용자/관리자
권한 그룹
메뉴/기능
주요 클래스
humanframe.backoffice.interceptor.CMSAdminInterceptor: 관리자 권한 검증humanframe.backoffice.aop.aspect.admin.AdminBbsAspect: 권한 검증 AOPhumanframe.backoffice.aop.aspect.admin.AdminPrivacyAspect: 개인정보 접근 검증 AOP
// [코드 위치] humanframe.backoffice.aop.aspect.admin.AdminBbsAspect
@Aspect
@Order(1)
@Component
public class AdminBbsAspect {
// 관리자 권한 체크
@Pointcut("execution(* humanframe.backoffice..AdminBbsType*Controller.form(..))"
+ "|| execution(* humanframe.backoffice..AdminBbsType*Controller.list(..))"
+ "|| execution(* humanframe.backoffice..AdminBbsType*Controller.view(..))"
+ "|| execution(* humanframe.backoffice..AdminBbsType*Controller.action(..))"
+ "|| execution(* humanframe.backoffice..AdminBbsType*Controller.answer(..))")
private void checkAdminBbsAuth() {}
@Before(value = "checkAdminBbsAuth()")
private void beforeCheckAdminBbsAuth(
JoinPoint joinPoint)throws Exception {
// ... 중간 생략 (권한 검증 로직) ...
}
}
4.3.2 세션 관리
홍익인간CMS는 사용자 및 관리자 세션을 별도로 관리하며, 세션 타임아웃, 동시 접속 제어 등의 기능을 제공합니다.
주요 기능
- 세션 생성 및 관리
- 세션 타임아웃 설정
- 동시 접속 제어
- 세션 정보 암호화
주요 클래스
humanframe.backoffice.session.MngrSession: 관리자 세션 클래스humanframe.backoffice.session.MberSession: 사용자 세션 클래스
// [코드 위치] humanframe.backoffice.session.MngrSession
public class MngrSession implements Serializable {
private static final long serialVersionUID = 1L;
private String mngrId;
private String mngrNm;
private String authorTy;
private String[] siteNos;
private String[] siteMenus;//for cntnts
private String[] fnctNos;//for fnct
private String[] bbsNos;//for bbs
// 세션 정보 설정 및 조회 메소드
// ...
}
4.3.3 사용자 정보 관리
사용자 정보 관리는 회원 가입, 정보 수정, 탈퇴 등의 기능을 포함합니다.
주요 기능
- 회원 가입/수정/탈퇴
- 비밀번호 암호화
- 이메일/SMS 인증
- 소셜 로그인 연동
- 개인정보 보호 기능
주요 클래스
humanframe.backoffice.controller.mber.AdminMberController: 회원 관리 컨트롤러humanframe.backoffice.service.MberService: 회원 관리 서비스humanframe.backoffice.dao.MberDAO: 회원 관리 DAO
4.4 콘텐츠 관리
4.4.1 메뉴 관리
홍익인간CMS는 웹사이트의 메뉴 구조를 효율적으로 관리할 수 있는 기능을 제공합니다.
주요 기능
- 계층형 메뉴 구조 관리
- 메뉴 순서 변경
- 메뉴별 권한 설정
- 메뉴 활성화/비활성화
- 메뉴 통계 관리
주요 클래스
humanframe.backoffice.controller.mng.AdminMngMenuController: 메뉴 관리 컨트롤러humanframe.backoffice.service.MngMenuService: 메뉴 관리 서비스humanframe.backoffice.dao.MngMenuDAO: 메뉴 관리 DAO
메뉴 관리 화면
관리자 페이지의 "CMS관리 > 메뉴관리" 메뉴에서 메뉴 구조를 트리 형태로 관리할 수 있습니다.
4.4.2 사이트/메뉴 배포 시스템
홍익인간 CMS는 관리자 페이지에서의 사이트 및 메뉴 변경사항이 사용자 페이지에 즉시 반영되지 않고, '배포(Publication)' 과정을 통해 반영되는 구조를 가지고 있습니다. 이는 관리자가 변경사항을 검토하고 확인한 후에 실제 사용자 페이지에 적용할 수 있도록 하는 안전장치입니다.
테이블 관계
TN_SITE
↓
TN_PBLCATE_SITE
TN_SITE_MENU
↓
TN_PBLCATE_SITE_MENU
- TN_SITE ↔ TN_PBLCATE_SITE
- TN_SITE: 관리자가 편집하는 사이트 정보 테이블
- TN_PBLCATE_SITE: 배포 후 사용자에게 실제로 보여지는 사이트 정보 테이블
- TN_SITE_MENU ↔ TN_PBLCATE_SITE_MENU
- TN_SITE_MENU: 관리자가 편집하는 메뉴 정보 테이블
- TN_PBLCATE_SITE_MENU: 배포 후 사용자에게 실제로 보여지는 메뉴 정보 테이블
배포 프로세스
✏️ 정보 수정
관리자가 TN_SITE 또는 TN_SITE_MENU 테이블의 정보를 수정합니다.
🚀 배포 실행
관리자가 '배포' 기능을 실행합니다.
📋 정보 복사
시스템은 수정된 정보를 TN_PBLCATE_SITE 또는 TN_PBLCATE_SITE_MENU 테이블에 복사합니다.
🌐 사용자 페이지 반영
사용자 페이지는 TN_PBLCATE_SITE와 TN_PBLCATE_SITE_MENU 테이블의 정보를 기반으로 사이트와 메뉴를 표시합니다.
배포 시스템의 장점
안정성
관리자의 변경사항이 검증 없이 바로 사용자 페이지에 반영되지 않아 안정적인 서비스 제공이 가능합니다.
검증
관리자는 변경사항을 배포하기 전에 충분히 검토할 수 있습니다.
일괄 적용
여러 변경사항을 한 번에 배포할 수 있어 사이트 구조 변경 시 일관성을 유지할 수 있습니다.
롤백 가능성
문제 발생 시 이전 상태로 되돌리기가 용이합니다.
4.4.3 게시판 관리
다양한 유형의 게시판을 생성하고 관리할 수 있는 기능을 제공합니다.
게시판 유형
| 📋 유형 | 📝 설명 |
|---|---|
| Type 1 | 일반형 게시판 |
| Type 2 | 답글형 게시판 |
| Type 3 | 이미지 게시판 |
| Type 4 | 동영상 게시판 |
| Type 5 | Q&A 게시판 |
| Type 6 | FAQ 게시판 |
| Type 7 | 일정형 게시판 |
| Type 8 | 링크형 게시판 |
주요 기능
- 게시판 생성/수정/삭제
- 게시물 관리
- 댓글 관리
- 첨부파일 관리
- 게시판별 권한 설정
- 게시물 검색 및 필터링
주요 클래스
humanframe.backoffice.controller.bbs.AdminBbsController: 게시판 관리 컨트롤러humanframe.backoffice.controller.bbs.AdminBbsSettingController: 게시판 설정 컨트롤러humanframe.backoffice.controller.bbs.AdminBbsType1Controller: 일반 게시판 컨트롤러humanframe.backoffice.service.BbsSettingService: 게시판 관리 서비스humanframe.backoffice.dao.BbsSettingDAO: 게시판 설정 DAOhumanframe.backoffice.dao.BbsTypeDAO: 게시판 유형별 DAO
// [코드 위치] humanframe.backoffice.service.BbsSettingService
@SuppressWarnings("rawtypes")
public interface BbsSettingService {
/**
* 게시판 목록을 조회한다.
*
* @param listVO 검색 조건
* @return 게시판 목록
*/
public HumanListVO boardListVo(HumanListVO listVO) throws Exception;
/**
* 게시판 정보를 조회한다.
*
* @param bbsNo 게시판 번호
* @return 게시판 정보
*/
public BbsSettingVO retrieveBoardSetting(int bbsNo) throws Exception;
// ... 기타 메소드
}
4.4.4 콘텐츠 관리
페이지를 구성할 콘텐츠를 관리할 수 있는 기능을 제공합니다.
주요 기능
- 콘텐츠 생성/수정/삭제
- 템플릿 기반 페이지 관리
- HTML 에디터 지원
- SEO 최적화 설정
- 콘텐츠 미리보기
- 콘텐츠 버전 관리
주요 클래스
humanframe.backoffice.controller.cntnts.AdminCntntsController: 콘텐츠 관리 컨트롤러humanframe.backoffice.service.CntntsService: 콘텐츠 관리 서비스humanframe.backoffice.dao.CntntsDAO: 콘텐츠 관리 DAOhumanframe.backoffice.vo.CntntsVO: 콘텐츠 VO
4.5 파일 및 미디어 관리
4.5.1 파일 업로드/다운로드
홍익인간CMS는 다양한 파일의 업로드 및 다운로드를 안전하게 처리하는 기능을 제공합니다.
주요 기능
- 다중 파일 업로드
- 파일 타입 제한
- 파일 크기 제한
- 파일 암호화
- 다운로드 권한 관리
- 다운로드 통계
파일 업로드 처리 흐름
클라이언트 요청
MultipartResolver
파일 유효성 검증
파일 저장
메타데이터 DB 저장
주요 클래스
humanframe.backoffice.controller.media.AdminMediaController: 미디어 관리 컨트롤러humanframe.backoffice.service.FileService: 파일 관리 서비스humanframe.backoffice.util.FileDownload: 파일 다운로드 유틸리티humanframe.backoffice.util.FileUtil: 파일 보조 유틸리티
// FileUtil 클래스의 일부
/** 파일명 정상여부 검증 **/
public static boolean isValidFileName(String fileName) {
// 알파벳, 숫자, 한글, 한자, 일본어, 괄호, 대괄호, 중괄호, 하이픈, 밑줄, 마침표, 공백을 허용하고
// 윈도우에서 파일명에 사용할 수 없는 문자 (\ / : * ? " < > |)는 제외한 정규식
final String FILE_NAME_PATTERN = "^[\w\-.()\[\]{} 가-힣一-鿿-ゟ゠-ヿ]+$";
final Pattern pattern = Pattern.compile(FILE_NAME_PATTERN);
if (fileName == null || fileName.trim().isEmpty()) {
return false;
}
Matcher matcher = pattern.matcher(fileName);
return matcher.matches();
}
4.5.2 이미지 처리
이미지 파일에 대한 특화된 처리 기능을 제공합니다.
주요 기능
- 이미지 리사이징
- 썸네일 생성
- 이미지 워터마크
- 이미지 최적화
- 이미지 갤러리
주요 클래스
humanframe.backoffice.service.FileService: 파일 관리 서비스humanframe.backoffice.util.ImageProcess: 이미지 다운로드 유틸리티net.coobird.thumbnailator.Thumbnails: 썸네일 생성 라이브러리
FileServiceImpl 클래스의 일부 (썸네일생성)
public void creatFileInfo(
Map<String, MultipartFile> fileMap
, int upperNo
, String srvcId
, Map<String,Object> reqMap) throws Exception {
// ... (중간생략)
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
try {
if ((EgovStringUtil.equals("jpg", fileExtsn)
|| EgovStringUtil.equals("gif", fileExtsn)
|| EgovStringUtil.equals("png", fileExtsn)
|| EgovStringUtil.equals("bmp", fileExtsn))) {
Thumbnails.of(tempFile).size(StaticValues.SMALL_THUMB_SIZE_X, StaticValues.SMALL_THUMB_SIZE_Y)
.toFile(new File(WebUtil.filePathReplaceAll(filePath + "/"+ srvcId +"/" + toDay + "/" + StaticValues.SMALL_THUMB_PREFIX+"_"+ newFileName)));
Thumbnails.of(tempFile).size(StaticValues.MEDIUM_THUMB_SIZE_X, StaticValues.MEDIUM_THUMB_SIZE_Y)
.toFile(new File(WebUtil.filePathReplaceAll(filePath + "/"+ srvcId +"/" + toDay + "/" + StaticValues.MEDIUM_THUMB_PREFIX+"_"+ newFileName)));
Thumbnails.of(tempFile).size(StaticValues.LARGE_THUMB_SIZE_X, StaticValues.LARGE_THUMB_SIZE_Y)
.toFile(new File(WebUtil.filePathReplaceAll(filePath + "/"+ srvcId +"/" + toDay + "/" + StaticValues.LARGE_THUMB_PREFIX+"_"+ newFileName)));
}
}
// ... (중간생략)
}
// ... (중간생략)
}
4.5.3 미디어 관리
이미지, 동영상 등 다양한 미디어 파일을 관리하는 기능을 제공합니다.
주요 기능
- 미디어 파일 업로드
- 미디어 메타데이터 관리
- 미디어 플레이어 연동
- 스트리밍 서비스 연동
주요 클래스
humanframe.backoffice.controller.media.AdminMediaController: 미디어 관리 컨트롤러humanframe.backoffice.service.MediaService: 미디어 관리 서비스humanframe.backoffice.dao.MediaDAO: 미디어 관리 DAOhumanframe.backoffice.vo.MediaVO: 미디어 VO