반응형
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

프로젝트 개요

이번 프로젝트는 eGov 호환성 인증과 고객 샘플 제작 두 가지 주요 작업으로 진행되었다.

  1. eGov 호환성 인증 샘플 제작
    • 목표: 전자정부 표준 프레임워크와의 호환성 인증을 통해 제품의 신뢰성과 안정성을 검증받고, 공공기관 및 고객에게 공식적으로 인정받기 위함이었다.
    • 내용: 기존 버전 제품은 3.5 버전에서 인증을 받았고, 이번 버전 제품은 최신 4.2 버전으로 인증을 받기 위해 Spring Boot 기반으로 개발했다. 인증 샘플은 게시판 형태로, 페이징과 간단한 CRUD 기능을 제공한다. 공공 데이터를 활용했다.
  2. 고객 샘플 제작
    • 목표: 고객의 요구 사항을 충족하기 위해 전자정부 표준 프레임워크를 활용한 다양한 기능을 시연하는 샘플을 제작했다.
    • 내용: 고객이 필요로 하는 다양한 기능을 포함하여, 전통적인 JSP와 Spring 내장 데이터베이스를 사용하는 [3.10 샘플]과 최신 기술이 적용된 [4.2 샘플]을 개발했다. 고객의 요청사항을 충족하기 위해 다양한 기능을 추가하였고 요청에 따라 각 샘플을 배포할 예정이다.
  3. 각 샘플별 특징

[3.10 샘플]

  • 특징:
    • 프레임워크: 전자정부프레임워크 3.10 사용
    • View Layer: JSP(Java Server Pages)를 사용하여 뷰(View) 구현
    • Database: Spring 내장 데이터베이스 사용
    • 프로젝트 설정: XML 기반 설정 (e.g., applicationContext.xml)
    • 전통적인 Spring MVC 아키텍처: 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성된 전통적인 Spring MVC 패턴 사용
  • 장점:
    • 정부 기관 및 공공 프로젝트에서의 신뢰성
    • 광범위한 문서화 및 지원
    • JSP의 대중성
  • 단점:
    • 설정 복잡성
    • 낮은 생산성
    • 기술 스택의 낡음
    • 내장 데이터베이스의 한계

[4.2 샘플]

  • 특징:
    • 프레임워크: Spring Boot 기반 전자정부프레임워크 4.2 사용
    • View Layer: Thymeleaf를 사용하여 뷰(View) 구현
    • Database: H2DB 사용 (내장형 데이터베이스)
    • 프로젝트 설정: 간소화된 설정 (application.properties 또는 application.yml 파일에서 관리)
    • 자동 설정 및 내장 서버: Spring Boot의 자동 설정과 내장 서버(예: Tomcat)를 통해 빠른 개발과 배포 가능
  • 장점:
    • 간편한 설정
    • 현대적 템플릿 엔진
    • 빠른 개발 및 배포
    • 확장성 및 유연성
    • H2DB의 유용성
    • RESTful API의 용이한 구현
  • 단점:
    • 정부 기관에서는 아직 사용이 제한적
    • 내장 데이터베이스의 제약
    • Thymeleaf의 학습 곡선

Spring Boot를 선택한 이유와 특징

  • Spring Boot는 복잡한 설정을 최소화하고, 빠르게 애플리케이션을 개발할 수 있도록 지원하는 프레임워크이다. 자동 설정(Autoconfiguration), 내장 서버(Embedded Server), 스타터 종속성(Starter Dependency) 등을 제공하여 Spring 프로젝트를 쉽게 시작하고 관리할 수 있다.
  • 특징:
    • 간편한 설정
    • 자동 설정과 간소화된 설정 관리
    • 현대적인 뷰 템플릿
    • 강력한 내장형 데이터베이스
    • 확장성과 유연성
    • 통합된 개발 환경 제공

 

느낀 점

  1. 호환성 인증의 중요성: 전자정부 표준 프레임워크와의 호환성 인증은 제품의 신뢰성과 품질을 보장하고, 공공기관 및 대기업과의 계약 기회를 확대하는 데 큰 도움이 된다. 전자정부 표준 프레임워크를 이해하는데에 좋은 경험이 되었다.
  2. 기술적 도전: 최신 기술을 적용하면서도 기존 기술과의 호환성을 유지하는 것이 많은 도전이 되었고, 기술적 숙련도를 향상시킬 수 있었다. 특히나 springBoot를 사용하여 처음부터 만들어보는 경험이 유익했다.
  3. 일정 관리: 일정 지연 상황에서의 빠른 대응과 수정이 프로젝트 성공에 중요한 역할을 했음을 알게 되었다. 일정 관리를 더욱 철저히 해야겠다는 생각이 들었다.

 

 

후기와 배운 점

후기:

  • 프로젝트 리딩 경험: 이번 프로젝트를 통해 처음으로 PL로서 WBS를 짜고 프로젝트를 리딩해본 경험이 큰 도움이 되었음을 느꼈다. 프로젝트 관리와 고객 요구 사항 충족의 중요성을 배웠다.

배운 점:

  1. 효율적인 일정 관리: 일정 관리와 리스크 대응의 중요성을 실감했으며, 일정 지연 상황에서의 대응 전략이 프로젝트 성공에 필수적임을 깨달았다.
  2. 기술적 숙련도 향상: 최신 기술을 적용하면서도 기존 기술과의 호환성을 유지하는 방법에 대해 많은 것을 배웠고, 기술적 도전 과제를 해결하는 데 도움을 받았다.
  3. 워크와 소통: 팀원들과의 효과적인 소통과 협업이 프로젝트 목표 달성에 큰 영향을 미쳤음을 알게 되었다. 팀워크의 중요성을 다시 한 번 느꼈다.
  4. PL 역할의 시야 확대: PL이 처음이었는데 프로젝트를 전반적으로 리딩하는 경험이 IT 프로젝트를 넓게 보는 시야를 제공했다.
  5. 기술 비교 분석: 같은 기능을 하는 샘플을 각각 다른 환경으로 만들어보며 비교분석을 통해 기술적 이해도가 높아졌다.
  6. 일정 분배와 프로젝트 핸들링: 일정을 분배하고 샘플별 난이도를 나누는 과정에서 프로젝트 핸들링이 쉽지 않음을 깨달았다. 회의를 통해 이를 더 잘 분배하고 사용하기 위한 전략을 세웠으며, 회의록을 꼼꼼히 작성했다.
반응형
LIST
반응형
SMALL

기존 샘플에 추가 샘플을 붙이는 방식으로 하려고 했으나...

공수가 좀 들더라도 새로운 기술을 적용해보는 방식도 도전해보는 것으로 결정되었다.

 

따라서 변경된 샘플은 총 두가지.

 

1. 기존 spring 방식인 3.10에 추가 샘플을 붙인다.(jsp 작업만 하면 됨)

2. 새로운 방식인 spring boot로 4.2 샘플을 새롭게 생성한다.

 

또한 인증용 샘플도 4.2로 만들 예정이기 때문에 boot로 생성해보기로 했다.


일단 뭐부터 해볼까 하다가 GPT에게 물어봄.

 

Q. egovframework 4.2에서 java 17 버전으로 spring boot로 프로젝트를 만들고 싶어 최초 설정 방법을 알려줘

 

 

전자정부 프레임워크 4.2에서 Java 17 버전을 사용하여 Spring Boot 프로젝트를 생성하는 방법을 단계별로 설명하겠습니다. 전자정부 프레임워크는 기본적으로 Spring 기반으로 되어 있으므로, Spring Boot를 사용하는 것이 가능합니다. 다음 단계에 따라 설정을 진행하면 됩니다.

 

1. 개발 환경 준비

필수 도구 설치:

  • Java 17 (JDK 17)
  • IntelliJ IDEA 또는 Eclipse IDE
  • Maven 또는 Gradle
  • 전자정부 프레임워크 4.2 라이브러리

2. Spring Boot 프로젝트 생성

Spring Initializr 사용: Spring Initializr를 사용하여 기본 Spring Boot 프로젝트를 생성할 수 있습니다.

  • 웹 브라우저에서 Spring Initializr로 이동합니다.
  • 다음과 같이 설정합니다:
    • Project: Maven Project
    • Language: Java
    • Spring Boot: 2.7.x 또는 3.x (Spring Boot 최신 버전)
    • Project Metadata: 그룹, 아티팩트, 이름, 설명 등을 입력합니다.
    • Packaging: Jar
    • Java: 17
    • Dependencies: Spring Web, Spring Data JPA, MySQL Driver 등 필요한 의존성을 추가합니다.
  • Generate 버튼을 클릭하여 프로젝트를 다운로드하고 압축을 풉니다.

3. 프로젝트에 전자정부 프레임워크 설정 추가

전자정부 프레임워크 라이브러리를 Maven 의존성으로 추가합니다. pom.xml 파일을 열고, 필요한 의존성을 추가합니다.

xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>egov-board</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <name>egov-board</name>
    <description>Demo project for Spring Boot and eGovFramework</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- eGovFramework Dependencies -->
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.ptl.mvc</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.fdl.cmmn</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.egovframe.rte</groupId>
            <artifactId>org.egovframe.rte.fdl.idgnr</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- Additional Dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

4. 애플리케이션 설정

application.properties 설정: src/main/resources/application.properties 파일에 데이터베이스 설정과 기타 설정을 추가합니다.

properties
# Database configuration
spring.datasource.url=jdbc:mysql://localhost:3306/yourdatabase
spring.datasource.username=yourusername
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

 

5. 엔티티, 레포지토리, 서비스 및 컨트롤러 작성

엔티티 클래스 작성: src/main/java/com/example/egovboard/domain/Board.java

java
package com.example.egovboard.domain;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;

@Entity
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private String author;
    private LocalDateTime createdDate = LocalDateTime.now();

    // Getters and Setters
}

 

 

 

레포지토리 인터페이스 작성: src/main/java/com/example/egovboard/repository/BoardRepository.java

java
package com.example.egovboard.repository;

import com.example.egovboard.domain.Board;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
}
 
 

서비스 인터페이스 및 구현 작성: src/main/java/com/example/egovboard/service/BoardService.java

java
package com.example.egovboard.service;

import com.example.egovboard.domain.Board;
import java.util.List;

public interface BoardService {
    List<Board> getAllBoards();
    Board getBoardById(Long id);
    Board saveBoard(Board board);
    void deleteBoard(Long id);
}
 
 
 

src/main/java/com/example/egovboard/service/BoardServiceImpl.java

java
package com.example.egovboard.service;

import com.example.egovboard.domain.Board;
import com.example.egovboard.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BoardServiceImpl implements BoardService {

    @Autowired
    private BoardRepository boardRepository;

    @Override
    public List<Board> getAllBoards() {
        return boardRepository.findAll();
    }

    @Override
    public Board getBoardById(Long id) {
        return boardRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException("Board not found"));
    }

    @Override
    public Board saveBoard(Board board) {
        return boardRepository.save(board);
    }

    @Override
    public void deleteBoard(Long id) {
        boardRepository.deleteById(id);
    }
}
 
 

컨트롤러 클래스 작성: src/main/java/com/example/egovboard/controller/BoardController.java

java
package com.example.egovboard.controller;

import com.example.egovboard.domain.Board;
import com.example.egovboard.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/boards")
public class BoardController {

    @Autowired
    private BoardService boardService;

    @GetMapping
    public List<Board> getAllBoards() {
        return boardService.getAllBoards();
    }

    @GetMapping("/{id}")
    public Board getBoardById(@PathVariable Long id) {
        return boardService.getBoardById(id);
    }

    @PostMapping
    public Board createBoard(@RequestBody Board board) {
        return boardService.saveBoard(board);
    }

    @PutMapping("/{id}")
    public Board updateBoard(@PathVariable Long id, @RequestBody Board boardDetails) {
        Board board = boardService.getBoardById(id);
        board.setTitle(boardDetails.getTitle());
        board.setContent(boardDetails.getContent());
        board.setAuthor(boardDetails.getAuthor());
        return boardService.saveBoard(board);
    }

    @DeleteMapping("/{id}")
    public void deleteBoard(@PathVariable Long id) {
        boardService.deleteBoard(id);
    }
}
 
 
 

6. 애플리케이션 실행

모든 설정이 완료되었으면, 애플리케이션을 실행합니다. src/main/java/com/example/egovboard/EgovBoardApplication.java 파일을 생성하고 메인 클래스를 작성합니다.

java
package com.example.egovboard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EgovBoardApplication {

    public static void main(String[] args) {
        SpringApplication.run(EgovBoardApplication.class, args);
 
 

 


 

흠...  Spring Initializr 사용: Spring Initializr를 사용하여 기본 Spring Boot 프로젝트를 생성할 수 있습니다.

여기서부터 시작해본다.

 

 

 

빌드 자동화 툴인 maven을 사용했지만 spring boot는 gradle이 기본설정값이고 요즘은 거의 gradle을 쓴다.

https://leedohyun1985.tistory.com/39

 

maven과 gradle 사이에서 고민했는데, 1차적 목표가 호환성 확인 샘플을 제작하는 것이므로 이미 4.2로 호환성 확인을 한 타사 가이드 문서를 참조했더니 Maven을 사용하고 있었다.

전자정부프레임워크는 spring framework의 maven을 기본적으로 채용했기 때문에 기존부터 사용되는 것인데, 이 부분은 따로 변경하지 않고 그대로 하기로 했다.

 

snapshot은 dev 버전이라 보통 안쓴다고 함.

생성해보려고 버전을 보는데 2점대가 없다.

 

찾다가 Spring Initializr로 만드는 것은 포기함...

 

 

 

실행환경 2.7.12 지원이니 spring boot 3점대는 지원하지 않는다는 말이다.

스프링 부트 3.2.0 버전은
JDK17 이상이 필요하며 21까지 호환되고
스프링 프레임워크도 6.1.1 이상이 필요합니다.
참고) https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/getting-started.html#getting-started

표준프레임워크 4.2 버전은
JDK 1.8을 기본으로
스프링 프레임워크 5.3.27 버전이 적용되었으므로
스프링 부트 3.2.0 버전과의 호환은 어렵습니다.
참고) https://www.egovframe.go.kr/home/sub.do?menuNo=13

 

Q&A에 이렇게 있는거 보니 initializr에 있는 3.3.1을 못쓰는 것 같음... 지금 보니까 버전별 구성에도 이렇게 써있네.... SpringBoot 2.7.12 지원이라고. 부트 버전을 맞춰줘야 할 듯.

 

 

https://www.egovframe.go.kr/home/qainfo/qainfoRead.do?pagerOffset=0&searchKey=&searchValue=&menuNo=69&qaId=QA_00000000000023372

 

묻고 답하기 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

www.egovframe.go.kr

 

 

https://egovframe.go.kr/home/qainfo/qainfoRead.do?menuNo=69&qaId=QA_00000000000023597

 

묻고 답하기 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

egovframe.go.kr

 


문의글 찾아보니... 지금 spring 5.3.27인데 spring 6에 spring boot 3을 지원하려면 다음 버전이 나와야하는 것. 2024-03-13 문의이니까 현재는 그렇게 못쓰는게 결론이다.

 

스프링 6이랑 자카르타 전환 업그레이드는 추후에 오니까 지금 완전 최신으로는 또 못한다는거임.

 

Tip) 표준프레임워크가 잘 적용되었는지 확인해주는 적용지원 서비스가 있다고 함.
https://www.egovframe.go.kr/home/sub.do?menuNo=67
https://www.egovframe.go.kr/home/qainfo/qainfoRead.do?menuNo=69&qaId=QA_00000000000021972
위에 게시글 보고 boot 프로젝트에서 라이브러리 추가하고 해서 할 수 있다고 함.

 

 


 

 

 

ㅇㅋ... BOOT로 다시 만들어봅니다.

 

나중에 비교할 수 있게 group id는 맞춰줬음.

 

 

 

 next 눌러서 예제 만들면 예제소스 포함해서 만들어짐.

 

 

얘는 Run As 에서 첫번쨰꺼 실행이 아님. 저번에 보니까 boot는 실행버튼이 다르더만.

 

spring boot app 으로 실행하니 콘솔에 spring 마크가 뜨면서 실행되다가 failed to start가 뜬다.

 

일단 8080 부터 변경해주자. 이거 server.xml 말고 application.properties 를 수정해줘야한다고 함.

 

server.port=8080

# 수동 Bean이 자동 Bean을 오버라이딩하게 설정
spring.main.allow-bean-definition-overriding=true

# open-in-view(혹은 Open-Session-In-View(OSIV))
# true(기본값) : 사용자에게 응답 또는 view가 렌더링될 때까지 영속성 컨텍스트 유지
# false : 트랜젝션이 종료될 때 영속성 컨텍스트 종료
spring.jpa.open-in-view=false

 

이거 10002로 안겹치게 수정해줌.

 

jdk 맞춰주고 실행해주니까 샘플 실행이 된다.

카테고리 id 누르면 수정페이지로도 들어가지고 crud가 된다.

이 샘플 데이터 가지고 기본적으로 호환성 샘플을 만들어봐야함.

반응형
LIST
반응형
SMALL

1. 호환성 인증용 샘플 제작 및 인증절차 확인

2. eGov 고객용 샘플 제작

 

 

호환성확인을 받은 sw의 연동가이드 문서를 참조하면 인증용 샘플은 앞서 확인한 전자정부프레임워크 기본 샘플에 솔루션을 붙이는 것과 비슷하다. UI의 차이정도만 있을 뿐, 데이터도 그대로 사용하고 CRUD 도 간단하게 연결하면 되어서 큰 문제가 없음.

 

가장 중요한 작업은 사실 상 eGov 고객용 샘플 제작이 메인이다.

기존에 eGov 고객 배포 샘플이 있고, 3.10 버전으로 제작되었다.

어쨌든 가장 좋은 방식은 기존에 작성된 샘플에서 버전만 올려서 사용하는 것인데... 여러가지로 시도해보기로 했다.

 

 

결론) 3.10 -> 4.2 버전으로 마이그레이션하기.

 


▼ 시도1. 붙여넣기(실패)

더보기

pom.xml을 비교해서 따져봐야함.

우선 껍데기는 대충 실행 완료인 것 같고....

음.... 우선 두가지를 만들어보자.

 

1) 3.10 샘플을 그대로 옮겨서 실행해보기!

 

기본 패키지랑 기존이랑 비교해봄

 

1차 시도 : 프로젝트 두개 띄워놓고 그대로 옮겨보기

잘 안들어간다

 

백업을 위해서 workspace 그대로 들어가서 압축파일을 만들어버리면 나중에 프로젝트 import는 압축파일을 package Explorer 에 던져놓기만 하면 된다.

 

기존 dispatcher-servlet.xml 비교해서 붙여넣기

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <context:component-scan base-package="egovframework">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    </context:component-scan>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="webBindingInitializer">
            <bean class="egovframework.example.cmmn.web.EgovBindingInitializer"/>
        </property>
    </bean>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="localeChangeInterceptor" />
            </list>
        </property>
    </bean>
    
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
    <!-- 쿠키를 이용한 Locale 이용시 <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/> -->
    <bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language" />
    </bean>

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="cmmn/egovError"/>
        <property name="exceptionMappings">
            <props>
                <prop key="org.springframework.dao.DataAccessException">cmmn/dataAccessFailure</prop>
                <prop key="org.springframework.transaction.TransactionException">cmmn/transactionFailure</prop>
                <prop key="org.egovframe.rte.fdl.cmmn.exception.EgovBizException">cmmn/egovError</prop>
                <prop key="org.springframework.security.AccessDeniedException">cmmn/egovError</prop>
            </props>
        </property>
    </bean>

    <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1"
	    p:viewClass="org.springframework.web.servlet.view.JstlView"
	    p:prefix="/WEB-INF/jsp/egovframework/example/" p:suffix=".jsp"/>

    <!-- For Pagination Tag -->
    <bean id="imageRenderer" class="egovframework.example.cmmn.web.EgovImgPaginationRenderer"/>

    <bean id="paginationManager" class="org.egovframe.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
        <property name="rendererType">
            <map>
                <entry key="image" value-ref="imageRenderer"/>
            </map>
        </property>
    </bean>
	<!-- /For Pagination Tag -->

    <mvc:view-controller path="/cmmn/validator.do" view-name="cmmn/validator"/>
</beans>

 

 

다행히 주석이 잘 달려있음

<!-- 패키지 내 Controller, Service, Repository 클래스의 auto detect를 위한 mvc 설정 -->
    <context:component-scan base-package="egovframework">

 

 

이건 3.10과 동일하게 주석처리함

    <!-- 서블릿컨네이너상의 exception에 대한 오류 페이지를 연결하는 mvc 설정-->
    <!--
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="defaultErrorView" value="cmmn/egovError"/>
        <property name="exceptionMappings">
            <props>
                <prop key="org.springframework.dao.DataAccessException">cmmn/dataAccessFailure</prop>
                <prop key="org.springframework.transaction.TransactionException">cmmn/transactionFailure</prop>
                <prop key="org.egovframe.rte.fdl.cmmn.exception.EgovBizException">cmmn/egovError</prop>
                <prop key="org.springframework.security.AccessDeniedException">cmmn/egovError</prop>
            </props>
        </property>
    </bean>
   	-->

 

 

이건 3.10에만 있고 주석처리되어있음

    <!-- 로그인 체크가 필요한 URL과 로그인 여부를 체크해준다 -->
	<!--
	<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/cop/com/*.do"/>
            <mvc:mapping path="/cop/bbs/*Master*.do"/>
            <mvc:mapping path="/uat/uia/*.do"/>
            <mvc:exclude-mapping path="/uat/uia/actionLogin.do"/>
            <mvc:exclude-mapping path="/uat/uia/egovLoginUsr.do"/>
		    <bean class="egovframework.com.cmm.interceptor.AuthenticInterceptor" />
        </mvc:interceptor>
    </mvc:interceptors>
     -->

 

이건 3.10에 있음. 4.2에 추가해줌

	<!-- json 관련 설정 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0">
    
    </bean>
    <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" p:contentType="application/json;charset=UTF-8">
    </bean>
    <!-- json 관련 설정 끝-->

 

 

그 다음 web-inf 아래에 있는 web.xml 비교해서 추가해주기

 

3.10에 이렇게 쓰여있는거 주석만 넣어주기

    <!-- 템플릿 소스에서는 아래의 필터사용 대신 JSP 출력시 <c:out> 태그를 사용하는 것을 기본정책으로 한다  -->
    <!-- egovframework.rte.ptl.mvc.filter.HTMLTagFilter egovframework.com.cmm.filter.HTMLTagFilter-->

 

3.10에 있는 session-timeout 추가해주기

	<session-config>
        <session-timeout>600</session-timeout>
    </session-config>

 

 

나머진 동일함.

 

당연한거겠지만... 구조가 다르고 단순히 3.9 -) 3.10 이수준의 업그레이드가 아니라 메인 버전이 업그레이드 되면서 변경된 부분들이 많았다.

SQL 부분도 문제지만 java 설정값들을 다 맞춘다는게 바보같은 생각이었음...

이쯤 하다가 다른 방법을 찾아보기로 함.

 


 

▼ 시도2. 3.10에서 4.0, 4.0에서 4.1... 한단계씩 올리기

 

좀 더 확인해보니 버전을 한단계씩 올릴 수 있도록 마이그레이션 페이지가 있는것을 확인했다.

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rtemigration4.0

 

egovframework:rtemigration4.0 [eGovFrame]

표준프레임워크 4.0는 Spring Framework 5.3.6 버전을 지원가능하게 업그레이드를 진행하였으나, 전체 오픈소스SW 업그레이드에 따라 일부 변경이 필요합니다. 또한, 각 프로젝트의 상황 및 환경에 따

www.egovframe.go.kr

 

3.10 에서 4.0으로 올리는 것이 가장 복잡하고, 4.0에서 4.1이나 4.1에서 4.2로 올리는 것은 비슷하다.

 

 

사실상 pom.xml 수정만 하는 것 같음.

사실상 크게 바뀐건 두개.

버전 숫자를 변경하는 것과 패키지 명이 egovframework에서 org.egorframe.rte로 변경되었다.

 

표준프레임워크 4.0.0 버전부터 실행환경의 패키지명을 org.egovframe.rte로 변경하였으므로, 실행환경을 import한 소스에 변경된 패키지명을 사용하시기 바랍니다.
표준프레임워크 개발환경에서 Search 기능에서 기존의 패키지명인 egovframework.rte 로 검색한 후,
변경할 패키지명인 org.egovframe.rte로 일괄로 변경하여 사용할 수 있습니다.

 

 

일괄 변경 해보자.

 

 

 

이처럼 실행환경의 패키지명을 전부 search 해서 replace 해주는 작업을 한다.

 

 

또한 4.0에서 4.1, 4.2로 마이그레이션 하는 것도 문서를 보고 동일하게 진행한다.

 

 

 

마지막으로 eclipce 버전이 기존것임을 확인해서 4.2 버전으로 아예 실행파일 자체를 대치해주었다.

3.10 의 이클립스에서는 java compiler가 14까지밖에 안나왔음. 근데 이제 4.2로 덮어써서 워크스페이스를 변경하니까 17까지 뜸. 

jdk 버전도 올려야하는데 3.10 실행환경으로는 17까지 올릴 수가 없음. eclipse 폴더 자체를 4.2 버전으로 덮어쓰기 하니 버전이 잘 올라갔다. 

 

 

17로 변경하고 maven clean 하면 다시 1.8 디폴트로 변경되니 17로 맞춘 뒤 install을 해준다.

 

빌드 성공됨.

반응형
LIST
반응형
SMALL

+ Recent posts

반응형
LIST