반응형
SMALL

egovFrame 4.2 에서 기본 템플릿인 simple homepage에 기존 샘플을 붙이기로 했다.

여기서 제공하는 구조를 갖다 쓰기 위함....

 

기존에 쓰던 샘플도 HSQL 을 사용해서 DB연결을 했고 샘플 전용 SQL 파일을 넣어 테이블을 생성해서 활용했다.

이번에도 해당 테이블을 활용해보도록 하자.

 

1. 구조파악

 

resources 아래 프로젝트 구조

1️⃣ shtdb.sql (DB 스크립트 파일)

HSQLDB를 사용할 때, 초기 테이블 생성 및 샘플 데이터 삽입을 위한 SQL 스크립트 파일.

HSQLDB는 Java 기반의 오픈 소스 관계형 데이터베이스(RDBMS)로, 로컬에서 개발할 때 자바 내장 DB를 사용해서 간단한 SQL문 실행과 테스트를 진행할 수 있다.

특징으로는 서버를 껐다가 켜면 데이터가 초기화된다.

shtdb.sql 같은 SQL 파일이 HSQLDB에서 데이터를 초기화하기 위해 사용되는 것.

 

따라서 내부에 보면 

 

  • CREATE TABLE ... (테이블 생성)
  • INSERT INTO ... (초기 데이터 삽입)
  • ALTER TABLE ... (제약 조건 추가)

이런 내용들이 들어가 있음.

 

 

 

2️⃣ globals.properties (전역 설정 파일 - DB 연결 등)

eGovFrame에서 사용하는 전역 설정값을 저장하는 파일이다.

DB 연결 정보, 파일 경로, 공통 변수 등을 정의한다.

#-----------------------------------------------------------------------
#
#   globals.properties : 시스템 
#   
#-----------------------------------------------------------------------
#   1.  key = value 구조입니다.
#   2.  key값은 공백문자를 포함불가, value값은 공백문자를 가능
#   3.  key값으로 한글을 사용불가,   value값은 한글사용이 가능
#   4.  줄을 바꿀 필요가 있으면 '\'를 라인의 끝에 추가(만약  '\'문자를 사용해야 하는 경우는 '\\'를 사용)
#   5.  Windows에서의 디렉토리 표시 : '\\' or '/'  ('\' 사용하면 안됨)
#   6.  Unix에서의 디렉토리 표시 : '/'
#   7.  주석문 처리는  #사용
#   8.  value값 뒤에 스페이스가 존재하는 경우 서블릿에서 참조할때는 에러발생할 수 있으므로 trim()하거나 마지막 공백없이 properties 값을 설정할것
#-----------------------------------------------------------------------

# 운영서버 타입(WINDOWS, UNIX)
Globals.OsType = WINDOWS

# G4C 연결용 IP (localhost)
Globals.LocalIp = 127.0.0.1

# DB서버 타입(mysql,oracle,altibase,tibero) - datasource 및 sqlMap 파일 지정에 사용됨
Globals.DbType = hsql
Globals.UserName=sa
Globals.Password=

# mysql
#Globals.DriverClassName=net.sf.log4jdbc.DriverSpy
#Globals.Url=jdbc:log4jdbc:mysql://127.0.0.1:3306/sht

#oracle
#Globals.DriverClassName=oracle.jdbc.driver.OracleDriver
#Globals.Url=jdbc:oracle:thin:@127.0.0.1:1521:egovfrm

#Altibase
#Globals.DriverClassName=Altibase.jdbc.driver.AltibaseDriver
#Globals.Url=jdbc:Altibase://127.0.0.1:1721/egovfrm?encoding=UTF-8

#Tibero
#Globals.DriverClassName=com.tmax.tibero.jdbc.TbDriver
#Globals.Url=jdbc:tibero:thin:@127.0.0.1:1821:egovfrm

#cubrid
#Globals.DriverClassName=cubrid.jdbc.driver.CUBRIDDriver
#Globals.Url=jdbc:cubrid:127.0.0.1:33000:sht:::?charset=utf-8

#Hsql - local hssql 사용시에 적용
Globals.DriverClassName=net.sf.log4jdbc.DriverSpy
Globals.Url=jdbc:log4jdbc:hsqldb:hsql://127.0.0.1/sampledb

# MainPage Setting
Globals.MainPage = /cmm/main/mainPage.do

# 파일 확장자 화이트리스트(허용목록) : 파일 확장자를 (.)과 함께 연이어서 사용하며 (.)로 시작한다.
Globals.fileUpload.Extensions.Images = .gif.jpg.jpeg.png
Globals.fileUpload.Extensions = .gif.jpg.jpeg.png.xls.xlsx

# File ID 암호화 키
# 주의 : 반드시 기본값 "egovframe"을 다른것으로 변경하여 사용하시기 바랍니다.
Globals.File.algorithmKey = egovframe

 

설명이 잘 나와있음.

 

기본값으로 내장 DB인 hsql로 설정되어 있고, 만약 다른 DB정보를 연결하기 원한다면 아래 #으로 주석처리 되어있는 것들에 주석을 풀어서 DB 연결을 해주면 된다.

 

  • MainPage Setting : 애플리케이션이 실행될 때 기본으로 열리는 페이지가 /cmm/main/mainPage.do 로 되어있음
  • Globals.fileUpload.Extensions.Images → 이미지 업로드 허용 확장자: .gif, .jpg, .jpeg, .png
  • Globals.fileUpload.Extensions → 일반 파일 업로드 허용 확장자: .gif, .jpg, .jpeg, .png, .xls, .xlsx

        서버에서 특정 확장자의 파일만 업로드할 수 있도록 화이트리스트(허용 목록) 설정

  • Globals.File.algorithmKey = egovframe : 파일 ID를 암호화할 때 사용하는 기본 키 값(보안상 변경 필요)

 

 

3️⃣ mapper-config.xml (MyBatis 설정 파일)

MyBatis의 매퍼(Mapper) 설정 파일.

SQL 쿼리를 XML 기반으로 정의하고, Java 객체와 매핑하는 역할을 한다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

	<!--Mybatis 설정 -->
	<settings>
		<!-- 전통적인 데이터베이스 컬럼명 형태인 A_COLUMN을 CamelCase형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 -->
		<setting name="mapUnderscoreToCamelCase" value="true"></setting>
		<!--  파라미터에 Null 값이 있을 경우 에러 처리 -->
		<setting name="jdbcTypeForNull" value="VARCHAR"></setting>
	</settings>
	
	<!-- Type Aliases 설정-->
	<typeAliases>
		<typeAlias alias="egovMap" 			type="org.egovframe.rte.psl.dataaccess.util.EgovMap" />
		<typeAlias alias="FileVO"			type="egovframework.com.cmm.service.FileVO" />
		<typeAlias alias="ComDefaultCodeVO" type="egovframework.com.cmm.ComDefaultCodeVO" />
		<typeAlias alias="comDefaultVO"		type="egovframework.com.cmm.ComDefaultVO" />
	</typeAliases>
    
</configuration>

 

[Type Aliases(타입 별칭) 설정]

  • MyBatis에서 객체 타입을 짧게 사용할 수 있도록 별칭(Alias)을 정의함.
  • 예를 들어, <resultType>에서 org.egovframe.rte.psl.dataaccess.util.EgovMap을 쓰는 대신 egovMap으로 사용할 수 있음.
<select id="getFileList" resultType="FileVO">
    SELECT * FROM FILE_TABLE;
</select>

 

기존 시스템의 ibatis 구조

기존 예제는 ibatis를 썼기 때문에 egovframework> sqlmap > config > hsql(각 DB별 폴더) 와 같은 구조로 되어있을꺼다.

하지만 이번 샘플은 mybatis로 사용할 것이기 때문에 구조가 다를 수 있음.

현재 mybatis는 egovframework> mapper > config > mapper-config.xml 에서 전체 관리한다.

 

4️⃣ let > ... > xxx_SQL_hsql.xml (HSQLDB용 SQL 매퍼 파일)

eGovFrame에서 HSQLDB 전용 SQL 쿼리를 담은 MyBatis 매퍼 파일.

폴더 구조에 따라서 분류된 각각의 역할에 맞는 SQL문이 들어있다.

화면에 보이는 EgovFile_SQL_hsql.xml 같은 파일은 File 기능과 관련된 SQL문을 모아놨을거다.

다른 EgovFile_SQL_*.xml 파일들은 각각 다른 DB (MySQL, Oracle 등)에 맞춰 작성된 것.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="FileManageDAO">


	<resultMap id="fileList" type="egovframework.com.cmm.service.FileVO">
		<result property="atchFileId" column="ATCH_FILE_ID"/>
		<result property="fileCn" column="FILE_CN"/>
		<result property="fileExtsn" column="FILE_EXTSN"/>
		<result property="fileMg" column="FILE_SIZE"/>
		<result property="fileSn" column="FILE_SN"/>
		<result property="fileStreCours" column="FILE_STRE_COURS"/>
		<result property="orignlFileNm" column="ORIGNL_FILE_NM"/>
		<result property="streFileNm" column="STRE_FILE_NM"/>
		<result property="creatDt" column="CREAT_DT"/>			
	</resultMap>
    

 	<select id="FileManageDAO.selectFileList" parameterType="FileVO" resultMap="fileList">
 		
			SELECT 
				a.ATCH_FILE_ID, b.FILE_CN, b.FILE_SN, b.FILE_STRE_COURS, b.STRE_FILE_NM,
				b.FILE_EXTSN, b.ORIGNL_FILE_NM, b.FILE_SIZE, a.CREAT_DT
			FROM
				LETTNFILE a, LETTNFILEDETAIL b
			WHERE
				a.ATCH_FILE_ID = #{atchFileId}
			AND 
				a.ATCH_FILE_ID = b.ATCH_FILE_ID
			AND 
				a.USE_AT = 'Y'				
			ORDER BY b.FILE_SN	
 		
 	</select>
    
    ...

 

그러니까 내가 뭔가를 DB의 내용을 수정하는 SQL 문을 추가한다면 여기에 폴더를 추가해서 분류해놔야한다.

 

 

 

 

 

 

2. SQL 파일 붙여넣고 연결하기

resources > db > shtdb.sql 부터 확인해보자.

 

Simple Homepage 실행 시 기본적으로 생성되는 DB SQL인 shtdb.sql의 내용은 아래와 같다.

CREATE MEMORY TABLE LETTCCMMNCLCODE(CL_CODE CHAR(3) NOT NULL PRIMARY KEY,CL_CODE_NM VARCHAR(60),CL_CODE_DC VARCHAR(200),USE_AT CHAR(1),FRST_REGIST_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20))
CREATE MEMORY TABLE LETTCCMMNCODE(CODE_ID VARCHAR(6) NOT NULL PRIMARY KEY,CODE_ID_NM VARCHAR(60),CODE_ID_DC VARCHAR(200),USE_AT CHAR(1),CL_CODE CHAR(3),FRST_REGIST_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),CONSTRAINT SYS_FK_86 FOREIGN KEY(CL_CODE) REFERENCES LETTCCMMNCLCODE(CL_CODE))
CREATE MEMORY TABLE LETTCCMMNDETAILCODE(CODE_ID VARCHAR(6) NOT NULL,CODE VARCHAR(15) NOT NULL,CODE_NM VARCHAR(60),CODE_DC VARCHAR(200),USE_AT CHAR(1),FRST_REGIST_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),PRIMARY KEY(CODE_ID,CODE),CONSTRAINT SYS_FK_89 FOREIGN KEY(CODE_ID) REFERENCES LETTCCMMNCODE(CODE_ID))
CREATE MEMORY TABLE LETTHEMPLYRINFOCHANGEDTLS(EMPLYR_ID VARCHAR(20) NOT NULL,CHANGE_DE CHAR(20) NOT NULL,ORGNZT_ID CHAR(20),GROUP_ID CHAR(20),EMPL_NO VARCHAR(20) NOT NULL,SEXDSTN_CODE CHAR(1),BRTHDY CHAR(20),FXNUM VARCHAR(20),HOUSE_ADRES VARCHAR(100) NOT NULL,HOUSE_END_TELNO VARCHAR(4),AREA_NO VARCHAR(4),DETAIL_ADRES VARCHAR(100) NOT NULL,ZIP VARCHAR(6) NOT NULL,OFFM_TELNO VARCHAR(20),MBTLNUM VARCHAR(20) NOT NULL,EMAIL_ADRES VARCHAR(50),HOUSE_MIDDLE_TELNO VARCHAR(4),PSTINST_CODE CHAR(8),EMPLYR_STTUS_CODE VARCHAR(15) NOT NULL,ESNTL_ID CHAR(20),PRIMARY KEY(EMPLYR_ID,CHANGE_DE))
CREATE MEMORY TABLE LETTNAUTHORGROUPINFO(GROUP_ID CHAR(20) NOT NULL PRIMARY KEY,GROUP_NM VARCHAR(60) NOT NULL,GROUP_CREAT_DE CHAR(20) NOT NULL,GROUP_DC VARCHAR(100))
CREATE MEMORY TABLE LETTNAUTHORINFO(AUTHOR_CODE VARCHAR(30) NOT NULL PRIMARY KEY,AUTHOR_NM VARCHAR(60) NOT NULL,AUTHOR_DC VARCHAR(200),AUTHOR_CREAT_DE CHAR(20) NOT NULL)
CREATE MEMORY TABLE LETTNBBS(NTT_ID NUMERIC(20) NOT NULL,BBS_ID CHAR(20) NOT NULL,NTT_NO NUMERIC(20),NTT_SJ VARCHAR(2000),NTT_CN LONGVARCHAR,ANSWER_AT CHAR(1),PARNTSCTT_NO NUMERIC(10),ANSWER_LC INTEGER,SORT_ORDR NUMERIC(8),RDCNT NUMERIC(10),USE_AT CHAR(1) NOT NULL,NTCE_BGNDE CHAR(20),NTCE_ENDDE CHAR(20),NTCR_ID VARCHAR(20),NTCR_NM VARCHAR(20),PASSWORD VARCHAR(200),ATCH_FILE_ID CHAR(20),FRST_REGIST_PNTTM TIMESTAMP NOT NULL,FRST_REGISTER_ID VARCHAR(20) NOT NULL,LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),PRIMARY KEY(NTT_ID,BBS_ID))
CREATE MEMORY TABLE LETTNBBSMASTER(BBS_ID CHAR(20) NOT NULL PRIMARY KEY,BBS_NM VARCHAR(255) NOT NULL,BBS_INTRCN VARCHAR(2400),BBS_TY_CODE CHAR(6) NOT NULL,BBS_ATTRB_CODE CHAR(6) NOT NULL,REPLY_POSBL_AT CHAR(1),FILE_ATCH_POSBL_AT CHAR(1) NOT NULL,ATCH_POSBL_FILE_NUMBER NUMERIC(2) NOT NULL,ATCH_POSBL_FILE_SIZE NUMERIC(8),USE_AT CHAR(1) NOT NULL,TMPLAT_ID CHAR(20),FRST_REGISTER_ID VARCHAR(20) NOT NULL,FRST_REGIST_PNTTM TIMESTAMP NOT NULL,LAST_UPDUSR_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP)
CREATE MEMORY TABLE LETTNBBSMASTEROPTN(BBS_ID CHAR(20) DEFAULT '' NOT NULL PRIMARY KEY,ANSWER_AT CHAR(1) DEFAULT '' NOT NULL,STSFDG_AT CHAR(1) DEFAULT '' NOT NULL,FRST_REGIST_PNTTM TIMESTAMP DEFAULT '1970-01-01 00:00:00.0' NOT NULL,LAST_UPDT_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20) DEFAULT '' NOT NULL,LAST_UPDUSR_ID VARCHAR(20))
CREATE MEMORY TABLE LETTNBBSUSE(BBS_ID CHAR(20) NOT NULL,TRGET_ID CHAR(20) NOT NULL,USE_AT CHAR(1) NOT NULL,REGIST_SE_CODE CHAR(6),FRST_REGIST_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20) NOT NULL,LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),PRIMARY KEY(BBS_ID,TRGET_ID),CONSTRAINT SYS_FK_98 FOREIGN KEY(BBS_ID) REFERENCES LETTNBBSMASTER(BBS_ID))
CREATE MEMORY TABLE LETTNEMPLYRINFO(EMPLYR_ID VARCHAR(20) NOT NULL PRIMARY KEY,ORGNZT_ID CHAR(20),USER_NM VARCHAR(60) NOT NULL,PASSWORD VARCHAR(200) NOT NULL,EMPL_NO VARCHAR(20),IHIDNUM VARCHAR(13),SEXDSTN_CODE CHAR(1),BRTHDY CHAR(20),FXNUM VARCHAR(20),HOUSE_ADRES VARCHAR(100) NOT NULL,PASSWORD_HINT VARCHAR(100) NOT NULL,PASSWORD_CNSR VARCHAR(100) NOT NULL,HOUSE_END_TELNO VARCHAR(4) NOT NULL,AREA_NO VARCHAR(4) NOT NULL,DETAIL_ADRES VARCHAR(100),ZIP VARCHAR(6) NOT NULL,OFFM_TELNO VARCHAR(20),MBTLNUM VARCHAR(20) NOT NULL,EMAIL_ADRES VARCHAR(50),OFCPS_NM VARCHAR(60),HOUSE_MIDDLE_TELNO VARCHAR(4) NOT NULL,GROUP_ID CHAR(20),PSTINST_CODE CHAR(8),EMPLYR_STTUS_CODE VARCHAR(15) NOT NULL,ESNTL_ID CHAR(20) NOT NULL,CRTFC_DN_VALUE VARCHAR(20),SBSCRB_DE TIMESTAMP,CONSTRAINT SYS_FK_101 FOREIGN KEY(GROUP_ID) REFERENCES LETTNAUTHORGROUPINFO(GROUP_ID) ON DELETE CASCADE)
CREATE MEMORY TABLE LETTNEMPLYRSCRTYESTBS(SCRTY_DTRMN_TRGET_ID VARCHAR(20) NOT NULL PRIMARY KEY,MBER_TY_CODE VARCHAR(15),AUTHOR_CODE VARCHAR(30) NOT NULL,CONSTRAINT SYS_FK_104 FOREIGN KEY(SCRTY_DTRMN_TRGET_ID) REFERENCES LETTNEMPLYRINFO(EMPLYR_ID),CONSTRAINT SYS_FK_113 FOREIGN KEY(AUTHOR_CODE) REFERENCES LETTNAUTHORINFO(AUTHOR_CODE))
CREATE MEMORY TABLE LETTNENTRPRSMBER(ENTRPRS_MBER_ID VARCHAR(20) NOT NULL PRIMARY KEY,ENTRPRS_SE_CODE CHAR(15),BIZRNO VARCHAR(10),JURIRNO VARCHAR(13),CMPNY_NM VARCHAR(60) NOT NULL,CXFC VARCHAR(50),ZIP VARCHAR(6) NOT NULL,ADRES VARCHAR(100) NOT NULL,ENTRPRS_MIDDLE_TELNO VARCHAR(4) NOT NULL,FXNUM VARCHAR(20),INDUTY_CODE CHAR(15),APPLCNT_NM VARCHAR(50) NOT NULL,APPLCNT_IHIDNUM VARCHAR(13),SBSCRB_DE TIMESTAMP,ENTRPRS_MBER_STTUS VARCHAR(15),ENTRPRS_MBER_PASSWORD VARCHAR(200),ENTRPRS_MBER_PASSWORD_HINT VARCHAR(100) NOT NULL,ENTRPRS_MBER_PASSWORD_CNSR VARCHAR(100) NOT NULL,GROUP_ID CHAR(20),DETAIL_ADRES VARCHAR(100),ENTRPRS_END_TELNO VARCHAR(4) NOT NULL,AREA_NO VARCHAR(4) NOT NULL,APPLCNT_EMAIL_ADRES VARCHAR(50) NOT NULL,ESNTL_ID CHAR(20) NOT NULL,CONSTRAINT SYS_FK_116 FOREIGN KEY(GROUP_ID) REFERENCES LETTNAUTHORGROUPINFO(GROUP_ID) ON DELETE CASCADE)
CREATE MEMORY TABLE LETTNFILE(ATCH_FILE_ID CHAR(20) NOT NULL PRIMARY KEY,CREAT_DT TIMESTAMP NOT NULL,USE_AT CHAR(1))
CREATE MEMORY TABLE LETTNFILEDETAIL(ATCH_FILE_ID CHAR(20) NOT NULL,FILE_SN NUMERIC(10) NOT NULL,FILE_STRE_COURS VARCHAR(2000) NOT NULL,STRE_FILE_NM VARCHAR(255) NOT NULL,ORIGNL_FILE_NM VARCHAR(255),FILE_EXTSN VARCHAR(20) NOT NULL,FILE_CN LONGVARCHAR,FILE_SIZE NUMERIC(8),PRIMARY KEY(ATCH_FILE_ID,FILE_SN),CONSTRAINT SYS_FK_119 FOREIGN KEY(ATCH_FILE_ID) REFERENCES LETTNFILE(ATCH_FILE_ID))
CREATE MEMORY TABLE LETTNGNRLMBER(MBER_ID VARCHAR(20) NOT NULL PRIMARY KEY,PASSWORD VARCHAR(200) NOT NULL,PASSWORD_HINT VARCHAR(100),PASSWORD_CNSR VARCHAR(100),IHIDNUM VARCHAR(13),MBER_NM VARCHAR(50) NOT NULL,ZIP VARCHAR(6) NOT NULL,ADRES VARCHAR(100) NOT NULL,AREA_NO VARCHAR(4) NOT NULL,MBER_STTUS VARCHAR(15),DETAIL_ADRES VARCHAR(100),END_TELNO VARCHAR(4) NOT NULL,MBTLNUM VARCHAR(20) NOT NULL,GROUP_ID CHAR(20),MBER_FXNUM VARCHAR(20),MBER_EMAIL_ADRES VARCHAR(50),MIDDLE_TELNO VARCHAR(4) NOT NULL,SBSCRB_DE TIMESTAMP,SEXDSTN_CODE CHAR(1),ESNTL_ID CHAR(20) NOT NULL,CONSTRAINT SYS_FK_122 FOREIGN KEY(GROUP_ID) REFERENCES LETTNAUTHORGROUPINFO(GROUP_ID) ON DELETE CASCADE)
CREATE MEMORY TABLE LETTNORGNZTINFO(ORGNZT_ID CHAR(20) NOT NULL PRIMARY KEY,ORGNZT_NM VARCHAR(20) NOT NULL,ORGNZT_DC VARCHAR(100))
CREATE MEMORY TABLE LETTNSCHDULINFO(SCHDUL_ID CHAR(20) NOT NULL PRIMARY KEY,SCHDUL_SE CHAR(1),SCHDUL_DEPT_ID VARCHAR(20),SCHDUL_KND_CODE VARCHAR(20),SCHDUL_BEGINDE TIMESTAMP,SCHDUL_ENDDE TIMESTAMP,SCHDUL_NM VARCHAR(255),SCHDUL_CN VARCHAR(2500),SCHDUL_PLACE VARCHAR(255),SCHDUL_IPCR_CODE CHAR(1),SCHDUL_CHARGER_ID VARCHAR(20),ATCH_FILE_ID CHAR(20),FRST_REGIST_PNTTM TIMESTAMP,FRST_REGISTER_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),REPTIT_SE_CODE CHAR(3))
CREATE MEMORY TABLE LETTNTMPLATINFO(TMPLAT_ID CHAR(20) NOT NULL PRIMARY KEY,TMPLAT_NM VARCHAR(255),TMPLAT_COURS VARCHAR(2000),USE_AT CHAR(1),TMPLAT_SE_CODE CHAR(6),FRST_REGISTER_ID VARCHAR(20),FRST_REGIST_PNTTM TIMESTAMP,LAST_UPDUSR_ID VARCHAR(20),LAST_UPDT_PNTTM TIMESTAMP)
CREATE MEMORY TABLE IDS(TABLE_NAME VARCHAR(20) DEFAULT '' NOT NULL PRIMARY KEY,NEXT_ID NUMERIC(30) DEFAULT 0 NOT NULL)
ALTER TABLE LETTHEMPLYRINFOCHANGEDTLS ADD CONSTRAINT SYS_FK_92 FOREIGN KEY(EMPLYR_ID) REFERENCES LETTNEMPLYRINFO(EMPLYR_ID)
ALTER TABLE LETTNBBS ADD CONSTRAINT SYS_FK_95 FOREIGN KEY(BBS_ID) REFERENCES LETTNBBSMASTER(BBS_ID)
ALTER TABLE LETTNEMPLYRSCRTYESTBS ADD CONSTRAINT SYS_FK_107 FOREIGN KEY(SCRTY_DTRMN_TRGET_ID) REFERENCES LETTNENTRPRSMBER(ENTRPRS_MBER_ID)
ALTER TABLE LETTNEMPLYRSCRTYESTBS ADD CONSTRAINT SYS_FK_110 FOREIGN KEY(SCRTY_DTRMN_TRGET_ID) REFERENCES LETTNGNRLMBER(MBER_ID)
SET WRITE_DELAY 20
SET SCHEMA PUBLIC
INSERT INTO LETTCCMMNCLCODE VALUES('LET','전자정부 프레임워크 경량환경 템플릿','전자정부 프레임워크 경량환경 템플릿','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM001','등록구분','게시판, 커뮤니티, 동호회 등록구분코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM003','업무구분','업무구분코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM004','게시판유형','게시판유형구분코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM005','템플릿유형','템플릿유형구분코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM009','게시판속성','게시판 속성','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM019','일정중요도','일정중요도 낮음/보통/높음 상태구분','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM030','일정구분','일정구분 코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNCODE VALUES('COM031','반복구분','일정 반복구분 코드','Y','LET','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM001','REGC01','단일 게시판 이용등록','단일 게시판 이용등록','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM001','REGC07','게시판사용자등록','게시판사용자등록','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM003','BBS','게시판','게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM004','BBST01','일반게시판','일반게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM004','BBST02','익명게시판','익명게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM004','BBST03','공지게시판','공지게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM004','BBST04','방명록','방명록','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM005','TMPT01','게시판템플릿','게시판템플릿','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM009','BBSA01','유효게시판','유효게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM009','BBSA02','갤러리','갤러리','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM009','BBSA03','일반게시판','일반게시판','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM019','A','높음','높음','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM019','B','보통','보통','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM019','C','낮음','낮음','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM030','1','회의','회의','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM030','2','세미나','세미나','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM030','3','강의','강의','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM030','4','교육','교육','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM030','5','기타','기타','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM031','1','당일','당일','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM031','2','반복','반복','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM031','3','연속','연속','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTCCMMNDETAILCODE VALUES('COM031','4','요일반복','요일반복','Y','2011-08-31 00:00:00.000000000','SYSTEM','2011-08-31 00:00:00.000000000','SYSTEM')
INSERT INTO LETTNORGNZTINFO VALUES ('ORGNZT_0000000000000','관리자부서','관리자부서')
INSERT INTO LETTNAUTHORGROUPINFO VALUES('GROUP_00000000000000','기본 그룹입니다','2011-08-31','기본 그룹')
INSERT INTO LETTNBBSMASTER VALUES('BBSMSTR_AAAAAAAAAAAA','공지사항','공지사항게시판','BBST03','BBSA03','Y','Y',2,5242880,'Y','TMPLAT_BOARD_DEFAULT','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000')
INSERT INTO LETTNBBSMASTER VALUES('BBSMSTR_BBBBBBBBBBBB','갤러리','갤러리게시판','BBST01','BBSA02','Y','Y',2,5242880,'Y','TMPLAT_BOARD_DEFAULT','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000')
INSERT INTO LETTNBBSUSE VALUES('BBSMSTR_AAAAAAAAAAAA','SYSTEM_DEFAULT_BOARD','Y','REGC01','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000')
INSERT INTO LETTNBBSUSE VALUES('BBSMSTR_BBBBBBBBBBBB','SYSTEM_DEFAULT_BOARD','Y','REGC01','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000','2011-08-31 12:00:00.000000000','USRCNFRM_00000000000')
INSERT INTO LETTNEMPLYRINFO VALUES('admin','ORGNZT_0000000000000','관리자','JfQ7FIatlaE5jj7rPYO8QBABX8yb7bNbQy4AKY1QIfc=','','','F','','','관리자 주소','','','','','','','','','','','','GROUP_00000000000000','00000000','P','USRCNFRM_00000000000','','2011-08-31 00:00:00.000000000')
INSERT INTO LETTNTMPLATINFO VALUES('TMPLAT_BOARD_DEFAULT','게시판 기본템플릿','/css/egovframework/cop/bbs/egovbbsTemplate.css','Y','TMPT01','SYSTEM','2011-08-31 00:00:00.000000000',NULL,NULL)
INSERT INTO IDS VALUES('BBS_ID',1)
INSERT INTO IDS VALUES('FILE_ID',1)
INSERT INTO IDS VALUES('SAMPLE',1)
INSERT INTO IDS VALUES('SCHDUL_ID',1)
INSERT INTO IDS VALUES('TMPLAT_ID',1)

 

전체 DB 초기화용 HSQLDB용 DDL과 일부 데이터 삽입 구문이 포함되어 있고, 테이블 구성은 아래와 같다.

 

✅ 주요 테이블 구성

 

공통 코드

  • LETTCCMMNCLCODE: 공통분류코드
  • LETTCCMMNCODE: 공통코드
  • LETTCCMMNDETAILCODE: 공통상세코드

게시판 관련

  • LETTNBBSMASTER: 게시판 마스터 (게시판 설정)
  • LETTNBBSMASTEROPTN: 게시판 옵션
  • LETTNBBSUSE: 게시판 사용정보 (조직별)
  • LETTNBBS: 게시글 테이블

사용자 관련

  • LETTNEMPLYRINFO: 일반 사용자(직원) 정보
  • LETTNEMPLYRSCRTYESTBS: 사용자-권한 매핑 테이블 (보안 설정)
  • LETTNAUTHORGROUPINFO: 권한 그룹 정보
  • LETTNAUTHORINFO: 권한 정보
  • LETTHEMPLYRINFOCHANGEDTLS: 사용자 변경 이력

회원 유형별 테이블

  • LETTNENTRPRSMBER: 기업 회원
  • LETTNGNRLMBER: 일반 회원

기타 테이블

  • LETTNFILE, LETTNFILEDETAIL: 파일 첨부 관련
  • LETTNSCHDULINFO: 일정 정보
  • LETTNTMPLATINFO: 템플릿 정보
  • LETTNORGNZTINFO: 조직 정보
  • IDS: ID 생성기 (NEXT_ID 저장용)

 

✅ 주요 제약 조건 및 외래키

  • 대부분의 테이블은 GROUP_ID, AUTHOR_CODE, BBS_ID 등을 통해 서로 연결됨
  • ON DELETE CASCADE가 있는 경우 하위 레코드 자동 삭제됨 (예: GROUP_ID FK)
  • 일부 테이블은 여러 테이블에서 FOREIGN KEY로 참조됨 (예: SCRTY_DTRMN_TRGET_ID는 다중 참조)

 

✅ 테이블 관계도 요약 (일부)

[LETTNBBS] ──▶ [LETTNBBSMASTER]
                │
                └─▶ [LETTNBBSMASTEROPTN]
                └─▶ [LETTNBBSUSE]

[LETTNEMPLYRINFO] ──▶ [LETTNAUTHORGROUPINFO]
     │                     ▲
     └─▶ [LETTNEMPLYRSCRTYESTBS] ──▶ [LETTNAUTHORINFO]
                                 └─▶ [LETTNENTRPRSMBER]
                                 └─▶ [LETTNGNRLMBER]

[LETTCCMMNCODE] ──▶ [LETTCCMMNCLCODE]
[LETTCCMMNDETAILCODE] ──▶ [LETTCCMMNCODE]

 

 

shtdb.sql은 냅두고 동일한 경로에 샘플 DB를 넣어준다.

 

.sql.mv.db 로 끝나는 파일도 같이 있는데, 로컬에서 작성한 샘플 데이터, 설정 정보 등을 그대로 다른 환경에서도 사용하고 싶을 때 같이 옮겨줘야 한다.

 

  • .mv.db    ->   "Multi-Version DB" 형식의 물리적 데이터 파일
  • .sql.trace.db   -> 트랜잭션 로그 파일로, 비정상 종료(예: 전원 꺼짐, 강제 종료 등) 시 복구를 도와줌.

요렇게 경로에 전부 옮겨준다.

 

이외에 또 다른 점을 보자면 mappers  아래에 template의 SQL 파일이 따로 있는데, 하위 폴더 만들어서 넣어준다.

폴더 만들어서 넣어줌

 

여기엔 아래와 같이 CRUD에 필요한 구체적인 SQL문이 들어있음.

	<select id="selectDept" resultType="egovMap" parameterType="java.util.HashMap">
		<![CDATA[
			/** selectDept */
			SELECT * FROM DEPT WHERE 1=1
		]]>
        
        <if test="loc != null ">
			AND LOC LIKE '%'||#{loc}||'%'
		</if>
		<if test="deptno != null ">
			AND DEPTNO = #{deptno}
		</if>
	</select>

 

이외에 기존 시스템과 다른 몇가지 파일들이 있는데,

기타 설정파일들

 

global.properties 보면 JDBC URL에 아래와 같이 써있다.

Globals.Url=jdbc:log4jdbc:hsqldb:hsql://127.0.0.1/sampledb

HSQLDB의 JDBC URL 패턴에 따라 모드가 다르다.

보면 지금 기본적으로 서버모드로 되어있음.

모드 JDBC URL 형식 설명
메모리 모드 jdbc:hsqldb:mem:mydb 메모리에서 실행됨. 프로그램 종료 시 데이터 사라짐.
파일 모드 jdbc:hsqldb:file:/path/to/db 파일 기반 DB. 종료 후에도 데이터 유지됨.
서버 모드 jdbc:hsqldb:hsql://host/dbname 네트워크 서버 방식. 여러 클라이언트가 접속 가능.

📌 서버 모드(Server Mode)란?

  • HSQLDB를 서버 프로세스로 실행하고, 클라이언트가 네트워크를 통해 접속하는 방식.
  • 데이터가 파일에 저장되므로 종료 후에도 유지됨.
  • 동시에 여러 애플리케이션이 같은 DB에 접근 가능함.
  • 보통 독립적인 HSQLDB 서버를 실행한 후 클라이언트가 접속하는 방식.

 

📌 서버 모드에서 실행 방법

  1. HSQLDB 서버를 실행해야 함.
java -cp hsqldb.jar org.hsqldb.server.Server --database.0 file:sampledb --dbname.0 sampledb

 

  1. 터미널로 hsqlbb.jar 있는 경로 들어가서 위 명령어를 실행하면 sampledb.script, sampledb.properties 같은 파일이 생성됨.
  2. 이후 jdbc:hsqldb:hsql://localhost/sampledb로 접속하면 정상 동작.

pom.xml에 이렇게 들어있는데, Maven이 자동으로 target/lib 또는 .m2/repository에 저장한다.

<dependency>
    <groupId>org.hsqldb</groupId>  <!-- HSQLDB 라이브러리 그룹 ID -->
    <artifactId>hsqldb</artifactId>  <!-- 라이브러리 이름 -->
    <version>2.7.2</version>  <!-- 사용하는 HSQLDB 버전 (최신 버전) -->
    <classifier>jdk8</classifier>  <!-- JDK 8 전용 버전 사용 -->
</dependency>

 

어쨌든 이렇게 하면 db 관련 설정파일이 생성된다.

  • db.properties (데이터베이스 설정 파일)
  • db.script (HSQLDB용 SQL 초기화 스크립트)

하지만 난 기존꺼 그냥 붙여넣음...

 

여기까지 resource 부분은 다 봤고 이 다음에는 java 파일을 설정해보자.

반응형
LIST
반응형
SMALL

Node.js란?

Node.js는 Chrome V8 엔진으로 구동되는 JavaScript 런타임 환경이다.
즉, JavaScript를 브라우저가 아닌 서버에서도 실행할 수 있도록 만든 플랫폼이다.

🚀 쉽게 말해?
원래 JavaScript는 웹 브라우저에서만 실행되던 언어인데,
Node.js 덕분에 서버에서도 실행할 수 있게 됐다!

 

Node.js는 비동기 방식을 기본적으로 사용한다.
즉, 한 가지 작업이 끝날 때까지 기다리지 않고, 다음 작업을 실행한다.

 

Node.js는 기본적으로 단일 스레드(Single-threaded)로 작동하지만,
비동기 작업을 활용해 여러 작업을 동시에 처리할 수 있다.
I/O 작업(파일 읽기, 네트워크 요청 등)은 블로킹 없이 처리된다.

 

Windows, macOS, Linux 등 다양한 운영체제에서 실행 가능

오픈소스로 누구나 자유롭게 사용 가능

 

Node.js는 package.json 파일에 프로젝트의 모든 정보를 기록한다. 각 항목의 의미는 다음과 같다.

name: 프로젝트 이름
version: 프로젝트 버전 정보
description: 프로젝트 설명
main: 노드 어플리케이션일 경우 진입점 경로. 프론트엔드 프로젝트일 경우 사용하지 않는다.
scripts: 프로젝트 명령어를 등록할 수 있다.초기화시 test 명령어가 샘플로 등록되어 있다
author: 프로그램 작성자
license: 라이센스



🚀 1. 자바스크립트의 발전 속도 vs. 브라우저의 지원 속도

자바스크립트는 계속 새로운 기능이 추가되지만, 브라우저가 그 기능을 바로 지원하지 못하는 경우가 많다.
👉 최신 기능을 쓰려면 "징검다리 역할"을 하는 도구가 필요하다.
대표적으로 "Babel(바벨)"이 있는데, 이건 최신 자바스크립트 코드를 옛날 브라우저에서도 실행되도록 변환해 준다.

 


🔧 2. 개발을 더 편하게 해주는 도구들

프론트엔드 개발을 할 때는 여러 가지 도구들이 필요하다.
예를 들어:
✔ Webpack(웹팩): 여러 개의 자바스크립트, CSS, 이미지 같은 파일을 하나의 번들(Bundle)로 묶어주는 도구다.

👉 웹 개발을 하다 보면, 파일이 너무 많아지고 관리하기 힘들어지기 때문!
👉 여러 개의 파일을 하나로 합쳐서 성능을 최적화하면, 웹사이트 로딩 속도가 빨라진다!

🔹 웹팩이 하는 일
- 자바스크립트 파일 묶기 (import 또는 require로 불러온 파일들을 하나로 합침)
- CSS, 이미지 파일도 포함 가능 (예: SCSS, SASS, LESS 변환)
- 코드 압축 & 최적화 (파일 크기를 줄여서 로딩 속도를 빠르게!)
- 실시간 변경 적용 (Hot Reloading) (파일을 수정하면 자동으로 반영됨)

 

 

✔ NPM: 패키지 관리자로, 필요한 라이브러리를 쉽게 설치하고 관리할 수 있도록 도와줌
👉 개발할 때 남들이 만든 유용한 기능을 가져다 쓰면 더 빠르고 효율적으로 작업 가능!
👉 하지만, 일일이 파일을 다운로드하면 업데이트 관리가 어렵고 버전 충돌 위험이 있음.
👉 NPM을 사용하면, 명령어 하나로 패키지 설치 및 업데이트 가능!

 


이런 도구들은 Node.js 기반에서 동작하므로, Node.js가 설치되어 있어야 개발 환경을 만들 수 있다.

 


🎨 3. 고급 언어를 사용하려면 변환 과정이 필요하다

기본적인 HTML, CSS, JavaScript 외에도, 개발자들이 더 편하게 사용할 수 있는 언어들이 있다.

 

✔ TypeScript(타입스크립트): 자바스크립트를 더 체계적으로 작성할 수 있도록 도와줌

👉  마이크로소프트(Microsoft)에서 개발한 자바스크립트(JavaScript)의 상위 집합(Superset) 언어로, 자바스크립트의 기능을 확장하면서 정적 타입 검사(Static Type Checking) 및 객체 지향 프로그래밍(OOP) 기능을 추가한 언어이다.
👉  즉, TypeScript = JavaScript + 타입 시스템 + ES6 이상의 기능들


✔ SASS(사스): CSS를 더 강력하고 효율적으로 작성할 수 있도록 도와주는 CSS 전처리기(Preprocessor)

👉   CSS의 단점을 보완하여 변수, 중첩, 믹스인, 상속 등 프로그래밍적인 기능을 추가할 수 있다.
👉   SASS 파일(.scss 또는 .sass)을 작성한 후, 일반 CSS 파일로 변환해야 한다.

 

더보기

✅ SASS는 CSS를 더 강력하고 효율적으로 사용할 수 있도록 도와주는 도구다.
✅ 변수, 중첩, 믹스인, 상속 등 코드 재사용 기능을 제공하여 유지보수가 쉬워진다.
✅ SASS 파일을 작성한 후, CSS로 변환해야 웹에서 사용할 수 있다.
✅ 웹 개발에서 CSS보다 SASS를 많이 사용하며, 웹팩(Webpack)과 함께 자동 변환하는 것이 일반적

 

✏ SASS 기본 문법


SASS는 두 가지 문법을 제공한다.
1️⃣ .scss (가장 많이 사용됨, 일반 CSS와 비슷한 문법)
2️⃣ .sass (중괄호 {}와 세미콜론 ; 없이 들여쓰기로 구분)

🔹 1. 변수 사용 ($)

// SASS (SCSS 문법)
$main-color: #3498db; // 변수 선언

body {
  background-color: $main-color; // 변수 사용
}

//⬇ CSS 변환 후 ⬇
body {
  background-color: #3498db;
}

✔ 색상, 폰트 크기, 여백 등을 변수로 관리하면 유지보수가 쉬워진다!

 

🔹 2. 중첩(Nesting)

// SASS
.navbar {
  background: #333;
  color: white;
  
  a {
    text-decoration: none;
    color: inherit;

    &:hover {
      color: yellow;
    }
  }
}


//⬇ CSS 변환 후 ⬇
.navbar {
  background: #333;
  color: white;
}

.navbar a {
  text-decoration: none;
  color: inherit;
}

.navbar a:hover {
  color: yellow;
}

✔ 중첩을 사용하면 CSS 계층 구조를 더 직관적으로 표현할 수 있다.

 

 

🔹 3. 믹스인(Mixin) – 코드 재사용

// SASS
@mixin button-style {
  padding: 10px 20px;
  border-radius: 5px;
  background-color: blue;
  color: white;
}

// 믹스인 사용
.button {
  @include button-style;
}


//⬇ CSS 변환 후 ⬇
.button {
  padding: 10px 20px;
  border-radius: 5px;
  background-color: blue;
  color: white;
}

✔ 반복되는 스타일을 함수처럼 만들어서 재사용할 수 있다!

 

🔹 4. 상속(Extend) – 스타일 공유

// SASS
%box-style {
  border: 1px solid #ddd;
  padding: 10px;
  border-radius: 5px;
}

.card {
  @extend %box-style;
  background: white;
}

.alert {
  @extend %box-style;
  background: red;
  color: white;
}


//⬇ CSS 변환 후 ⬇
.card, .alert {
  border: 1px solid #ddd;
  padding: 10px;
  border-radius: 5px;
}

.card {
  background: white;
}

.alert {
  background: red;
  color: white;
}

✔ 공통 스타일을 상속받아 중복을 줄이고 코드 유지보수를 쉽게 할 수 있다.

 

 


하지만!
👉 브라우저는 TypeScript와 SASS를 직접 이해하지 못한다.
👉 그래서 "트랜스파일러"라는 변환 도구를 사용해서 자바스크립트와 CSS로 변환해야 한다.

 

 

대표적인 트랜스파일러 = Babel(바벨)

 

🎯 Babel(바벨)이란?

최신 자바스크립트 코드를 구형 브라우저에서도 실행할 수 있도록 변환해주는 도구(트랜스파일러)다.

 

자바스크립트는 계속 새로운 기능이 추가되지만, 모든 브라우저가 최신 기능을 바로 지원하는 것은 아니다.
✔ 크롬, 파이어폭스 같은 최신 브라우저는 대부분 지원하지만,
✔ 인터넷 익스플로러(IE)나 오래된 브라우저에서는 실행되지 않는 경우가 많다.

👉 Babel을 사용하면 최신 문법을 옛날 브라우저에서도 실행 가능하도록 변환할 수 있다!

👉  React, Vue 같은 최신 프레임워크를 사용할 때 (JSX 같은 문법을 변환하는 데에도 사용됨)

 

Babel이 변환하는 대표적인 문법
1. 화살표 함수 (=>) 변환

// 최신 문법 (ES6+)
const add = (a, b) => a + b;

// ES5 (옛날 브라우저도 실행 가능)
var add = function (a, b) {
    return a + b;
};

 

2. const, let 같은 최신 변수 선언 변환

// 최신 문법 (ES6+)
const name = "Alice";
let age = 25;

// ES5
var name = "Alice";
var age = 25;

 

3. 클래스 문법 변환

// 최신 문법 (ES6+)
class Person {
    constructor(name) {
        this.name = name;
    }
}

// ES5
function Person(name) {
    this.name = name;
}

 

Babel은 단독으로 사용하기도 하지만, 보통 Webpack과 함께 사용하여 자동 변환한다.

 


💡 결론
최신 웹 개발 환경을 만들려면, 단순히 HTML + CSS + JavaScript만 쓰는 게 아니라,
✔ Babel, Webpack 같은 도구를 사용해야 하고
✔ TypeScript, SASS 같은 고급 언어를 변환할 필요도 있으며
✔ 이 모든 걸 관리하려면 Node.js 환경이 필요하다!

즉, Node.js는 최신 프론트엔드 개발의 기반이 되는 필수 도구라고 볼 수 있다!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
LIST

'[ javascript ]' 카테고리의 다른 글

스프레드 연산자 (...)란?  (0) 2025.02.27
대표적인 es6 문법 정리  (0) 2024.12.30
부동소수점 이슈  (0) 2024.03.29
Node.js & npm 업데이트 하기  (1) 2024.03.22
리액트란?  (0) 2024.03.19
반응형
SMALL

Tomcat만 주구장창 쓰다보니 Jeus는 잘 모름...

Jeus 를 쓰는 고객사를 방문해서 보다보니 구조가 달라 지원에 어려움을 느꼈다.

정확히 한번 정리할 필요성을 느껴 정리해보는 글...


 

Tomcat과 Jeus는 둘 다 웹 애플리케이션 서버(WAS, Web Application Server)이지만, 기능과 역할에서 차이가 있다.
Tomcat은 경량 WAS이고, Jeus는 엔터프라이즈급 WAS이다.

 

📌 1. 기본 개요

  Tomcat Jeus
제작사 Apache Software Foundation TmaxSoft
라이선스 오픈소스 (무료) 상용 소프트웨어 (유료)
주요 용도 가벼운 웹 애플리케이션 실행 (JSP, Servlet) 기업용 WAS, 대규모 시스템 운영
J2EE 지원 여부 부분 지원 (Servlet, JSP만 가능) 완전한 J2EE 지원 (EJB, JMS, JTA 등 포함)

 

 

📌 2. 기술적인 차이

  Tomcat Jeus
설치 경로 /opt/tomcat/ 또는 /home/tomcat/ /home/jeus/
웹 애플리케이션 배포 경로 /webapps/ /domains/{도메인}/applications/
배포 방식 WAR 파일 배포 또는 폴더 배치 WAR 또는 EAR 배포
서버 실행 ./startup.sh ./startServer.sh {도메인} {서버명}
서버 종료 ./shutdown.sh ./stopServer.sh {도메인} {서버명}
관리 콘솔 제공 X (별도 툴 필요) O (jeusadmin CLI, 웹 콘솔 지원)
클러스터링 지원 부분 지원 (추가 설정 필요) O (기본 기능 포함)
멀티 도메인 지원 X (Tomcat 인스턴스를 따로 띄워야 함) O (도메인 기반 다중 서버 운영 가능)
트랜잭션 처리 X (Servlet/JSP 수준) O (JTA, EJB 지원)

 

📌 3. 실행 구조 차이

✔ Tomcat 실행 구조

/home/tomcat/
 ├── bin/           # 실행 파일 (startup.sh, shutdown.sh)
 ├── conf/          # 설정 파일 (server.xml 등)
 ├── logs/          # 로그 파일
 ├── webapps/       # 배포된 웹 애플리케이션 (WAR, JSP, HTML 파일 위치)
 ├── work/          # 실행 중인 애플리케이션 캐시
 ├── temp/          # 임시 파일

 

📌 웹 애플리케이션 배포 방식

  • /webapps/ROOT/에 index.html, index.jsp 등을 배치하면 자동 실행됨
  • 브라우저에서 http://localhost:8080/로 접속 가능

Jeus  실행 구조

/home/jeus/
 ├── bin/            # 실행 파일 (startServer.sh, stopServer.sh 등)
 ├── config/         # 설정 파일
 ├── domains/        # 도메인별 설정 및 애플리케이션 배포
 │   ├── mydomain/
 │   │   ├── applications/  # 웹 애플리케이션 배포 폴더 (WAR, JSP, HTML 파일 위치)
 │   │   ├── servers/       # 실행 중인 서버 관리
 │   │   ├── config/        # 도메인별 설정 파일
 ├── lib/            # 라이브러리
 ├── logs/           # 로그 파일
 ├── deploy/         # 자동 배포 폴더 (WAR, EAR 파일 배치 가능)

 

📌 웹 애플리케이션 배포 방식

  • /domains/{도메인}/applications/ROOT/에 index.html, index.jsp 등을 배치
  • 브라우저에서 http://localhost:8080/로 접속 가능

📌 4. 주요 차이점 정리

  Tomcat  Jeus
속도 가볍고 빠름 상대적으로 무거움
운영 환경 소규모 프로젝트, 개발용 엔터프라이즈 환경, 대기업, 금융권
설치 및 관리 쉽고 간단함 복잡한 설정 필요
보안 기본적인 보안만 제공 기업용 보안 기능 포함
부하 분산 직접 구현 필요 기본적으로 로드 밸런싱 지원
J2EE 표준 지원 Servlet, JSP만 지원 EJB, JMS, JTA 등 전체 지원
가격 무료 유료 (라이선스 비용 필요)

 


📌 5. 언제 Tomcat을 쓰고, 언제 Jeus를 써야 할까?

✔ Tomcat이 적합한 경우
✅ 빠르게 웹 서비스를 개발하고 배포해야 할 때
✅ JSP, Servlet 정도만 사용하고, 트랜잭션, EJB 등의 기능이 필요 없을 때
✅ 비용 절감이 중요한 프로젝트 (오픈소스, 무료 사용 가능)
✅ 단일 서버에서 운영하는 소규모 웹 서비스

 

✔ Jeus가 적합한 경우
✅ 엔터프라이즈 환경에서 안정적으로 운영해야 할 때
✅ 대규모 트랜잭션 처리, 복잡한 비즈니스 로직이 필요한 경우
✅ 보안 및 고가용성이 중요한 금융, 공공기관, 대기업 환경
✅ 여러 대의 서버를 클러스터링해서 운영해야 할 때

 


✅ Tomcat에서 HTML/JS 파일 실행 방식

Tomcat에서는 webapps/ROOT/ 폴더에 HTML/JS 파일을 넣고, startup.sh를 실행하면 브라우저에서 확인할 수 있다.

cd /home/tomcat/bin ./startup.sh

 

📌 파일 저장 위치

/home/tomcat/webapps/ROOT/index.html /home/tomcat/webapps/ROOT/js/script.js

 

📌 브라우저에서 실행 확인

http://localhost:8080/index.html

 

 

✅ Jeus에서 HTML/JS 파일 실행 방식

Jeus에서는 Tomcat과 폴더 구조와 실행 방식이 다르다.
Jeus는 보통 WAR 파일을 배포하는 방식을 사용하지만, 정적 파일을 직접 배포할 수도 있다.

 

2️⃣ HTML/JS 파일 저장 위치

📌 Jeus에서 정적 파일을 직접 넣으려면 다음 경로를 사용해야 한다.
(Tomcat의 webapps/ROOT 역할)

/home/jeus/domains/mydomain/applications/ROOT/

 

📌 예제 파일 위치

/home/jeus/domains/mydomain/applications/ROOT/index.html
/home/jeus/domains/mydomain/applications/ROOT/js/script.js

 

📌 브라우저에서 실행 확인

http://localhost:8080/index.html

 

 

✅ Jeus 서버 실행 방법

Jeus는 Tomcat의 startup.sh처럼 startServer.sh를 사용한다.

1️⃣ Jeus 실행

cd /home/jeus/bin
./startServer.sh mydomain server1

 

🔹 mydomain → 실행할 도메인 이름
🔹 server1 → 실행할 서버 인스턴스

 

2️⃣ Jeus 중지

cd /home/jeus/bin 
./stopServer.sh mydomain server1
 

✅ 최종 정리

  Tomcat Jeus
정적 파일 위치 /webapps/ROOT/ /domains/mydomain/applications/ROOT/
서버 실행 ./startup.sh ./startServer.sh mydomain server1
서버 중지 ./shutdown.sh ./stopServer.sh mydomain server1
브라우저에서 확인 http://localhost:8080/index.html http://localhost:8080/index.html

 

반응형
LIST
반응형
SMALL

스프레드 연산자(...)는 배열, 객체, 문자열 등의 요소를 개별적으로 펼쳐서 사용할 수 있도록 해주는 JavaScript 연산자.

 

FullCalendar 사용할 때 아래처럼 eventSources에 일정을 배열로 넣어야하는데,

eventSources: [
    {
        id: "대한민국 공휴일",
        googleCalendarId: "ko.south_korea#holiday@group.v.calendar.google.com",
        color: "#FF0000",
        editable: false
    },
    {
        id: "일정2",
        color: "#FF0000",
        editable: false
    },
    ...
]

 

특정 eventList를 Map형태로 뽑아 전체를 넣기 위해 아래같이 사용함.

eventSources: [
    eventList.map(event => ({
        id: event.id,
        groupId: event.id,
        events: [],
        backgroundColor: event.bgColor,
    })), // ❌ 이렇게 하면 안됨
    {
        id: "대한민국 공휴일",
        googleCalendarId: "ko.south_korea#holiday@group.v.calendar.google.com",
        color: "#FF0000",
        editable: false
    }
]

문제는 eventList.map(...)이 이미 배열을 반환하기 때문에 이중배열([ [...mappedEvents], {...} ]) 형태가 되어 추가되지 않음.

 

이럴 때 사용하는게 스프레드 연산자!

   //이렇게 사용해야 한다.  
   eventSources: [
        ...eventList.map(event => ({ // 기본 이벤트 항목 추가
            id: event.id,
            groupId: event.id,
            events: [],
            backgroundColor: event.bgColor,
        })),
        {
            id: "대한민국 공휴일", // 대한민국 공휴일 추가
            googleCalendarId: "ko.south_korea#holiday@group.v.calendar.google.com",
            color: "#FF0000",
            editable: false
        }
    ],

 

 


📌 1. 배열에서의 스프레드 연산자 활용

배열을 복사하거나, 합칠 때 사용됩니다.

✅ 예제 1: 배열 복사 (얕은 복사)

const arr1 = [1, 2, 3];
const arr2 = [...arr1]; // arr1을 복사

console.log(arr2); // [1, 2, 3]


arr2 = [...arr1]를 사용하면 arr1의 개별 요소가 펼쳐져서 새로운 배열이 생성됩니다.

 

✅ 예제 2: 배열 합치기

const arr1 = [1, 2, 3];
const arr2 = [4, 5, 6];

const merged = [...arr1, ...arr2]; // 두 배열을 합침

console.log(merged); // [1, 2, 3, 4, 5, 6]


arr1과 arr2의 요소들이 개별적으로 풀려서 하나의 배열로 합쳐짐.

 

✅  예제 3: 배열의 중첩 구조 해결

const arr1 = [1, 2, 3];
const arr2 = [arr1, 4, 5];

console.log(arr2);
// [[1, 2, 3], 4, 5] <-- 배열이 중첩됨

const arr3 = [...arr1, 4, 5]; // 스프레드 연산자로 펼침

console.log(arr3);
// [1, 2, 3, 4, 5] <-- 중첩되지 않고 개별 요소가 추가됨

스프레드 연산자를 사용하면 배열의 중첩 없이 개별 요소로 추가할 수 있음.

 

📌 2. 객체에서의 스프레드 연산자 활용

객체를 복사하거나, 속성을 병합할 때 유용합니다.

 

✅ 예제 4: 객체 복사

 
const obj1 = { name: "Alice", age: 25 };
const obj2 = { ...obj1 }; // obj1을 복사

console.log(obj2); // { name: "Alice", age: 25 }

기존 객체를 새로운 객체로 복사하는 방법.

 

✅ 예제 5: 객체 속성 병합

 
const obj1 = { name: "Alice", age: 25 };
const obj2 = { job: "Developer", city: "Seoul" };

const mergedObj = { ...obj1, ...obj2 };

console.log(mergedObj);
// { name: "Alice", age: 25, job: "Developer", city: "Seoul" }

 

 

반응형
LIST

'[ javascript ]' 카테고리의 다른 글

Node.js 뜯어보기  (0) 2025.03.20
대표적인 es6 문법 정리  (0) 2024.12.30
부동소수점 이슈  (0) 2024.03.29
Node.js & npm 업데이트 하기  (1) 2024.03.22
리액트란?  (0) 2024.03.19
반응형
SMALL

+ Recent posts

반응형
LIST