Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[SpringMVC] 20240112 [프로그램 소스] 본문

[Spring MVC]/Program source (Spring MVC)

[SpringMVC] 20240112 [프로그램 소스]

Jelly-fish 2024. 1. 12. 12:03

SpringMVCStudy

■■■ Spring MVC 프로젝트 실습 04 ■■■

○ Prespective
   : JavaEE

○ 다이나믹 웹 프로젝트 생성 (비STS 버전)
   : Mvc04

○ 기본 환경 구성 및 라이브러리 설정
   : Mvc00 (우리가 임의로 구성해둔 샘플)로 부터
     src, WebContent 디렉터리 복사 & 덮어쓰기

○ 실습 성격
   : 직원 관리 프로그램(Spring MVC 버전)
     데이터 송수신 관련 실습(Spring MVC 버전)
     JDBC 모듈 추가 활용
     SimpleDriverDataSource 클래스(객체) 활용

( * 『CRUD』
    Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. ) 

○ 기능 구현(데이터 각 유형별 CRUD 실습)
   - 직원 정보 입력, 출력, 수정, 삭제 기능 구현.
   - 지역 정보 입력, 출력, 수정, 삭제 기능 구현.
   - 부서 정보 입력, 출력, 수정, 삭제 기능 구현.
   - 직위 정보 입력, 출력, 수정, 삭제 기능 구현.
   - 로그인 / 로그아웃 기능 구현
     → 관리자 및 일반 직원 로그인 구분.
   ==> Spring MVC, JSP/Servlet, Oracle, HTML/CSS/Javascript, AJAX
     , jQuery, EL, JSTL 표현 등 사용.

○ 사전 작업 → 테이블 및 시퀀스, 주요 쿼리문, 샘플 데이터 등 구성
   - EMPLOYEE 직원
   - REGION 지역
   - DEPARTMEN 부서
   - POSITION 직위
   - 샘플 데이터 입력...


○ 물리적 파일 구성
   #00. Mvc04_scott.sql → 데이터베이스 관련 객체 구성 및 실습 데이터 준비

   #01. Employee.java → DTO 계층.  직원 데이터 자료형 클래스.
   #02. Department.java → DTO 계층.  부서 데이터 자료형 클래스.
   #03. Region.java → DTO 계층.  지역 데이터 자료형 클래스.
   #04. Position.java → DTO 계층.  직위 데이터 자료형 클래스.

   #05. IEmployeeDAO.java → 인터페이스.
   #06. IDepartmentDAO.java → 인터페이스.
   #07. IRegionDAO.java → 인터페이스.
   #08. IPositionDAO.java → 인터페이스.

   #09 EmployeeDAO.java → 데이터베이스 액션 처리 클래스
                                   직원 데이터 CRUD 액션
                                   Connection 객체에 대한 의존성 주입 준비
                                   (인터페이스 속성 구성 / setter 구성)

   #10 DepartmentDAO.java → 데이터베이스 액션 처리 클래스
                                   부서 데이터 CRUD 액션
                                   Connection 객체에 대한 의존성 주입 준비
                                   (인터페이스 속성 구성 / setter 구성)

   - RegionDAO.java → 데이터베이스 액션 처리 클래스
                                   지역 데이터 CRUD 액션
                                   Connection 객체에 대한 의존성 주입 준비
                                   (인터페이스 속성 구성 / setter 구성)

   - PositionDAO.java → 데이터베이스 액션 처리 클래스
                                   직위 데이터 CRUD 액션
                                   Connection 객체에 대한 의존성 주입 준비
                                   (인터페이스 속성 구성 / setter 구성)


   - EmployeeMenu.jsp → 메인 메뉴 뷰 페이지.
   로그아웃 기능 포함.
   - menuStyle.css → 메뉴 스타일 구성.

   - EmployeeList.jsp → 직원 리스트 출력 페이지.
   - main.css → 메인 스타일 구성.



   - IMemberDAO.java → 인터페이스
   - MemberDAO.java → 데이터베이스 액션 처리 클래스
                                   Connection 객체에 대한 의존성 주입
                                   (의존성 주입을 위한 준비 필요)

   - EmployeeListController.java→ 사용자 정의 컨트롤러 클래스
     (employeelist.action)         리스트 출력 액션
                                   DAO 객체에 대한 의존성 주입 
                                   (의존성 주입을 위한 준비 필요)

   - web.xml → DispatcherServlet 객체 등록
                                   URL 매핑 주소 등록

   - dispatcher-servlet.xml → 컨트롤러 객체 등록
                                   URL 매핑 주소 등록
                                   SimpleDriverDataSource 객체 등록
                                   의존 객체 주입 설정 
                                   DAO 객체 등록


   - employeelist.action → 이클립스 실행 과정에서 요청을 위한 빈 파일

   - EmployeeInsertFormController.java
     (employeeinsertform.action)

   - EmployeeInsertController.java
     (employeeinsert.action)

   - AjaxController.java
     (ajax.action)

   - Ajax.jsp

   - EmployeeUpdateForm.jsp

   - EmployeeUpdateFormController.java
     (employeeupdateform.action)

   - EmployeeUpdateController.java
     (employeeupdate.action)

   - EmployeeDeleteController.java
     (employeedelete.action)

   - LoginForm.jsp

   - LoginFormController.java
   - LoginController.java

   - LogoutController.java

   - EmpList.jsp


            :
            :
 
   - DepartmentList.jsp
   - DepartmentInsertForm.jsp
   - DepartmentUpdateForm.jsp
 
   - DepartmentListController.java
   - DepartmentInsertFormController.java
   - DepartmentInsertController.java
   - DepartmentUpdateFormController.java
   - DepartmentUpdateController.java
   - DepartmentDeleteController.java

   

   - RegionList.jsp
   - RegionInsertForm.jsp
   - RegionUpdateForm.jsp

            :
            :
   - PositionList.jsp
   - PositionInsertForm.jsp
   - PositionUpdateForm.jsp
  
   

○ 사용자 최초 요청 주소
   http://localhost:3306/Mvc04/employeelist.action → 관리자
   http://localhost:3306/Mvc04/emplist.action → 일반직원





※ 추후 우리는... 실무 프로젝트를 수행하는 과정에서...
   컨트롤러를 액션 단위가 아닌, 업무 단위로 묶어 작업 및 처리하게 될 것이다.
   이후, 어노테이션을 활용하여 컨트롤러를 지정해서 처리하는 방법도 수행하게 될 것이다.
   하지만, 이번 실습 과정에서 기본 액션 단위의 컨트롤러 구성을 수행해 봄으로써
   Model-View-Controller 의 기능 및 처리 흐름에 대한 이해와 파악을 제대로 할 수 있도록 한다.

 

 

 

Mvc04_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT

--○ 실습 테이블 생성(지역 : REGION)
CREATE TABLE REGION
( REGIONID      NUMBER              -- 지역 아이디   -- PK
, REGIONNAME    VARCHAR2(30)        -- 지역 명
, CONSTRAINT REGION_ID_PK PRIMARY KEY(REGIONID)
);
--==>> Table REGION이(가) 생성되었습니다.

---○ 시퀀스 생성(지역 : REGIONSEQ)
CREATE SEQUENCE REGIONSEQ
NOCACHE;
--==>> Sequence REGIONSEQ이(가) 생성되었습니다.


--○ 지역 데이터 입력 
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '서울');
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '경기');
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '인천');
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '대전');
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '광주');
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '대구');
--==>> 1 행 이(가) 삽입되었습니다. * 6

--○ 지역 리스트 확인
SELECT REGIONID, REGIONNAME
FROM REGION;
--> 한 줄 구성
SELECT REGIONID, REGIONNAME FROM REGION
;
--==>>
/*
REGIONID	REGIONNAME
1	        서울
2	        경기
3       	인천
4	        대전
5	        광주
6	        대구
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.

--○ 실습 테이블 생성(직위 : POSITION)
CREATE TABLE POSITION
( POSITIONID    NUMBER          -- 직위 아이디   --  PK
, POSITIONNAME  VARCHAR2(30)    -- 직위 명
, MINBASICPAY   NUMBER          -- 최소 기본급
, CONSTRAINT POSITION_ID_PK PRIMARY KEY(POSITIONID)
);
--==>> Table POSITION이(가) 생성되었습니다.


--○ 시퀀스 생성(직위 : POSITIONSEQ)
CREATE SEQUENCE POSITIONSEQ
NOCACHE;
--==>> Table POSITION이(가) 생성되었습니다.


--○ 직위 데이터 입력
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY)
VALUES(POSITIONSEQ.NEXTVAL, '사원', 1000000);
--> 한 줄 구성
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY) VALUES(POSITIONSEQ.NEXTVAL, '사원', 1000000);
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY) VALUES(POSITIONSEQ.NEXTVAL, '대리', 2000000);
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY) VALUES(POSITIONSEQ.NEXTVAL, '과장', 3000000);
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY) VALUES(POSITIONSEQ.NEXTVAL, '부장', 4000000);
--==>> 1 행 이(가) 삽입되었습니다. * 4



--○ 직위 리스트 확인
SELECT POSITIONID, POSITIONNAME, MINBASICPAY
FROM POSITION;
--> 한 줄 구성
SELECT POSITIONID, POSITIONNAME, MINBASICPAY FROM POSITION
;
--==>>
/*
POSITIONID	POSITIONNAME	MINBASICPAY
1	        사원	        1000000
2	        대리	        2000000
3	        과장	        3000000
4	        부장	        4000000
*/

--○ 커밋
COMMIT;
--==>> 커밋 완료.


--○ 실습 테이블 생성(부서 : DEPARTMENT)
CREATE TABLE DEPARTMENT
( DEPARTMENTID      NUMBER              -- 부서 아이디   -- PK
, DEPARTMENTNAME    VARCHAR2(30)        -- 부서 명
, CONSTRAINT DEPARTMENT_ID_PK PRIMARY KEY(DEPARTMENTID)
);
--==>> Table DEPARTMENT이(가) 생성되었습니다.


--○ 시퀀스 생성(부서 : DEPARTMENTSEQ)
CREATE SEQUENCE DEPARTMENTSEQ
NOCACHE;
--==>> Sequence DEPARTMENTSEQ이(가) 생성되었습니다.

--○ 데이터 입력
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME)
VALUES(DEPARTMENTSEQ.NEXTVAL, '개발부');
--> 한 줄 구성
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME) VALUES(DEPARTMENTSEQ.NEXTVAL, '개발부');
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME) VALUES(DEPARTMENTSEQ.NEXTVAL, '기획부');
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME) VALUES(DEPARTMENTSEQ.NEXTVAL, '영업부');
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME) VALUES(DEPARTMENTSEQ.NEXTVAL, '자재부');
--==>> 1 행 이(가) 삽입되었습니다. * 4



--○ 부서 리스트 확인
SELECT DEPARTMENTID, DEPARTMENTNAME
FROM DEPARTMENT;
--> 한 줄 구성
SELECT DEPARTMENTID, DEPARTMENTNAME FROM DEPARTMENT
;
--==>>
/*
DEPARTMENTID	DEPARTMENTNAME
1	            개발부
2	            기획부
3	            영업부
4	            자재부
*/


--○ 커밋
COMMIT;
--==>> 커밋 완료.



--○ 실습 테이블 생성(직원 : EMPLOYEE)
--  사원번호, 사원명, 주민번호, 생년월일, 양음력, 전화번호, 부서, 직위, 지역, 기본급, 수당
CREATE TABLE EMPLOYEE
( EMPLOYEEID    NUMBER                  -- 사원 번호        -- PK
, NAME          VARCHAR2(30)            -- 사원 명
, SSN           VARCHAR2(20)            -- 주민번호         -- 암호화 기능 적용(TYPE CHECK~!!!)
, BIRTHDAY      DATE                    -- 생년월일
, LUNAR         NUMBER(1) DEFAULT 0     -- 양음력           -- CK (양력0, 음력1)
, TELEPHONE     VARCHAR2(40)            -- 전화번호
, DEPARTMENTID  NUMBER                  -- 부서 아이디      -- FK
, POSITIONID    NUMBER                  -- 직위 아이디      -- FK
, REGIONID      NUMBER                  -- 지역 아이디      -- FK
, BASICPAY      NUMBER                  -- 기본급
, EXTRAPAY      NUMBER                  -- 수당
, CONSTRAINT EMPLOYEE_ID_PK PRIMARY KEY(EMPLOYEEID)
, CONSTRAINT EMPLOYEE_DEPARTMENTID_FK FOREIGN KEY(DEPARTMENTID)
             REFERENCES DEPARTMENT(DEPARTMENTID)
, CONSTRAINT EMPLOYEE_POSITIONID_FK FOREIGN KEY(POSITIONID)
             REFERENCES POSITION(POSITIONID)
, CONSTRAINT EMPLOYEE_REGIONID_FK FOREIGN KEY(REGIONID)
             REFERENCES REGION(REGIONID)
, CONSTRAINT EMPLOYEE_LUNAR_CK CHECK(LUNAR=0 OR LUNAR=1)
);
--==>> Table EMPLOYEE이(가) 생성되었습니다.



--○ 시퀀스 생성(직원 : EMPLOYEESEQ)
CREATE SEQUENCE EMPLOYEESEQ
NOCACHE;
--==>> Sequence EMPLOYEESEQ이(가) 생성되었습니다.


--○ 직원 데이터 입력 (쿼리문 폐기)
INSERT INTO EMPLOYEE(EMPLOYEEID, NAME, SSN, BIRTHDAY, LUNAR
                   , TELEPHONE, DEPARTMENTID, POSITIONID, REGIONID, BASICPAY, EXTRAPAY)
VALUES(EMPLOYEESEQ.NEXTVAL, '강혜성', CRYPTPACK.ENCRYPT('9710171234567', '9710171234567')
        , TO_DATE('1997-10-17', 'YYYY-MM-DD'), 0, '010-6380-7047', 1, 2, 1
        , 2500000, 1500000);        -- 이백오십만, 백오십만
--==>> 1 행 이(가) 삽입되었습니다.


--※ 세션 설정
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
--==>> Session이(가) 변경되었습니다.


--○ 확인
SELECT *
FROM EMPLOYEE;
--==>> 1	강혜성	�o��^�Ǩ��	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000


--○ 커밋
COMMIT;
--==>> 커밋 완료.


DESC EMPLOYEE;
--==>>
/*
이름           널?       유형           
------------ -------- ------------ 
EMPLOYEEID   NOT NULL NUMBER       
NAME                  VARCHAR2(30) 
SSN                   VARCHAR2(20) 
BIRTHDAY              DATE         
LUNAR                 NUMBER(1)    
TELEPHONE             VARCHAR2(40) 
DEPARTMENTID          NUMBER       
POSITIONID            NUMBER       
REGIONID              NUMBER       
BASICPAY              NUMBER       
EXTRAPAY              NUMBER   
*/

--(* 원래는, LUNAR에 대한 테이블이 있어야 한다. 0, 1에 대한 의미를 담은 레코드.)

--○ 직원 데이터 조회 쿼리문 구성

SELECT E.EMPLOYEEID
     , E.NAME
     , E.SSN
     , TO_CHAR(E.BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY
     , E.LUNAR
     , DECODE(E.LUNAR, 0, '양력', 1, '음력') AS LUNARNAME
     , E.TELEPHONE
     , E.DEPARTMENTID
     , (SELECT DEPARTMENTNAME
        FROM DEPARTMENT
        WHERE DEPARTMENTID=E.DEPARTMENTID) AS DEPARTMENTNAME
    , E.POSITIONID
    , (SELECT POSITIONNAME
       FROM POSITION
       WHERE POSITIONID=E.POSITIONID) AS POSITIONNAME
    , E.REGIONID
    , (SELECT REGIONNAME
       FROM REGION
       WHERE REGIONID=E.REGIONID) AS REGIONNAME
    , E.BASICPAY
    , E.EXTRAPAY
    , NVL(E.BASICPAY, 0) + NVL(E.EXTRAPAY, 0) AS PAY
FROM EMPLOYEE E;
--==>>
/*
EMPLOYEEID	NAME	SSN	        BIRTHDAY	LUNAR	LUNARNAME	TELEPHONE	    DEPARTMENTID	DEPARTMENTNAME	POSITIONID	POSITIONNAME	REGIONID	REGIONNAME	BASICPAY	EXTRAPAY	PAY
1	        강혜성	�o��^�Ǩ��	1997-10-17	0	    양력	    010-6380-7047	1	            개발부	        2	        대리	        1	        서울	    2500000	    1500000	    4000000
*/

--○ 뷰 생성(EMPLOYEEVIEW)
CREATE OR REPLACE VIEW EMPLOYEEVIEW
AS
SELECT E.EMPLOYEEID
     , E.NAME
     , E.SSN
     , TO_CHAR(E.BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY
     , E.LUNAR
     , DECODE(E.LUNAR, 0, '양력', 1, '음력') AS LUNARNAME
     , E.TELEPHONE
     , E.DEPARTMENTID
     , (SELECT DEPARTMENTNAME
        FROM DEPARTMENT
        WHERE DEPARTMENTID=E.DEPARTMENTID) AS DEPARTMENTNAME
    , E.POSITIONID
    , (SELECT POSITIONNAME
       FROM POSITION
       WHERE POSITIONID=E.POSITIONID) AS POSITIONNAME
    , E.REGIONID
    , (SELECT REGIONNAME
       FROM REGION
       WHERE REGIONID=E.REGIONID) AS REGIONNAME
    , E.BASICPAY
    , E.EXTRAPAY
    , NVL(E.BASICPAY, 0) + NVL(E.EXTRAPAY, 0) AS PAY
FROM EMPLOYEE E;
--==>> View EMPLOYEEVIEW이(가) 생성되었습니다.


--○ 지역 데이터 조회 쿼리문 구성
--   단, 지역 데이터 삭제 가능여부(DELCHECK) 확인 포함

SELECT R.REGIONID, R.REGIONNAME
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE REGIONID=R.REGIONID) AS DELCHECK
FROM REGION R;
--==>>
/*
  REGIONID REGIONNAME                       DELCHECK
---------- ------------------------------ ----------
         1 서울                                    1  → 삭제 불가
         2 경기                                    0  → 삭제 가능
         3 인천                                    0  → 삭제 가능
         4 대전                                    0  → 삭제 가능
         5 광주                                    0  → 삭제 가능
         6 대구                                    0  → 삭제 가능
*/
--> 『서울』의 지역 데이터는 삭제가 불가능한 상황이며
--  『경기』『인천』『대전』『광주』『대구』의 지역 데이터는
--  삭제가 가능한 상황임을 판별할 수 있는 쿼리문


-- [이건 내 풀이!!]============================================================
SELECT R.REGIONID, COUNT(E.EMPLOYEEID) AS 지역참조직원수
     , DECODE(COUNT(E.EMPLOYEEID), 0, '삭제 가능', '삭제 불가') AS DELCHECK
FROM REGION R
    LEFT OUTER JOIN EMPLOYEE E
                 ON R.REGIONID=E.REGIONID
GROUP BY R.REGIONID
ORDER BY REGIONID ASC;
--============================================================================

-- [2024/01/12]

--○ 뷰 생성(REGIONVIEW)
CREATE OR REPLACE VIEW REGIONVIEW
AS
SELECT R.REGIONID, R.REGIONNAME
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE REGIONID=R.REGIONID) AS DELCHECK
FROM REGION R;
--==>> View REGIONVIEW이(가) 생성되었습니다.


--○ 직위 데이터 조회 쿼리문 구성
--   단, 직위 데이터 삭제 가능여부(DELCHECK) 확인 포함
SELECT P.POSITIONID, P.POSITIONNAME, P.MINBASICPAY
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE POSITIONID=P.POSITIONID) AS DELCHECK
FROM POSITION P;
--==>>
/*
POSITIONID POSITIONNAME                   MINBASICPAY   DELCHECK
---------- ------------------------------ ----------- ----------
         1 사원                               1000000          0  → 삭제 가능
         2 대리                               2000000          1  → 삭제 불가
         3 과장                               3000000          0  → 삭제 가능
         4 부장                               4000000          0  → 삭제 가능 
*/


--○ 뷰 생성(POSITIONVIEW)
CREATE OR REPLACE VIEW POSITIONVIEW
AS
SELECT P.POSITIONID, P.POSITIONNAME, P.MINBASICPAY
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE POSITIONID=P.POSITIONID) AS DELCHECK
FROM POSITION P;
--==>> View POSITIONVIEW이(가) 생성되었습니다.



--○ 부서 데이터 조회 쿼리문 구성
--   단, 부서 데이터 삭제 가능여부(DELCHECK) 확인 포함
SELECT D.DEPARTMENTID, D.DEPARTMENTNAME
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE DEPARTMENTID=D.DEPARTMENTID) AS DELCHECK
FROM DEPARTMENT D;
--==>>
/*
DEPARTMENTID DEPARTMENTNAME                   DELCHECK
------------ ------------------------------ ----------
           1 개발부                                  1
           2 기획부                                  0
           3 영업부                                  0
           4 자재부                                  0
*/

--○ 뷰 생성(DEPARTMENTVIEW)
CREATE OR REPLACE VIEW DEPARTMENTVIEW
AS
SELECT D.DEPARTMENTID, D.DEPARTMENTNAME
     , (SELECT COUNT(*)
        FROM EMPLOYEE
        WHERE DEPARTMENTID=D.DEPARTMENTID) AS DELCHECK
FROM DEPARTMENT D;
--==>> View DEPARTMENTVIEW이(가) 생성되었습니다.


--○ 직위별 최소 기본급 조회 쿼리문 구성
SELECT MINBASICPAY
FROM POSITION
WHERE POSITIONID=1;     -- 사원
--> 한 줄 구성
SELECT MINBASICPAY FROM POSITION WHERE POSITIONID=1
;
--==>> 1000000


--------------------------------------------------------------------------------

--○ 로그인, 로그아웃 과정 추가

-- ID 와 PW 컬럼 데이터를 담고 있는 테이블이 별도로 존재하지 않는 상황이다.
-- 이와 관련하여 EMPLOYEEID(사원아이디)와 SSN(주민번호) 뒤 7자리의 숫자를
-- 각각 아이디, 패스워드로 이용할 수 있도록 구성한다.

--※ 기존 테이블 구조 변경
--① 
-- EMPLOYEE(직원 데이터) 테이블의 SSN(주민번호) 컬럼을 분리한다.
-- SSN ------------------------> SSN1, SSN2
-- SSN1 → 주민번호 앞 6자리
-- SSN2 → 주민번호 뒷 7자리 → 암호화 적용 → PW 활용

--② 
-- EMPLOYEE(직원 데이터) 테이블의 GRADE(등급) 컬럼을 추가한다.
-- GRADE → 0:관리자, 1:일반사원

--○ 컬럼 분할 SSN → SSN1, SSN2

-- 컬럼 추가
ALTER TABLE EMPLOYEE
ADD(SSN1 CHAR(6), SSN2 VARCHAR2(50)); -- 암호화된 문자를 넣을 것이므로 VARCHAR2(50) 으로 설정.
--==>> Table EMPLOYEE이(가) 변경되었습니다.

SELECT *
FROM EMPLOYEE;

-- SSN  → 암호화('9710171234567', '9710171234567')

-- SSN1 → SUBSTR(복호화(대상데이터, '9710171234567'), 1, 6) → '971017'
-- SSN2 → CRYPTPACK.ENCRYPT 암호화 ( (SUBSTR(복호화(대상데이터, '9710171234567'), 7, 7)
--                                  , (SUBSTR(복호화(대상데이터, '9710171234567'), 7, 7) ) → 암호화된 '1234567'

UPDATE EMPLOYEE
SET SSN1 = SUBSTR(CRYPTPACK.DECRYPT(SSN, '9710171234567'), 1, 6)
  , SSN2 = CRYPTPACK.ENCRYPT( SUBSTR(CRYPTPACK.DECRYPT(SSN, '9710171234567'), 7, 7)
                            , SUBSTR(CRYPTPACK.DECRYPT(SSN, '9710171234567'), 7, 7) );    
--, SSN2 = 암호화 ( (SUBSTR(복호화(대상데이터, '9710171234567'), 7, 7)
--                , (SUBSTR(복호화(대상데이터, '9710171234567'), 7, 7) ) → 암호화된 '1234567'

--==>> 1 행 이(가) 업데이트되었습니다.


SELECT *
FROM EMPLOYEE;
--==>> 1	강혜성	�o��^�Ǩ��	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000	971017	=o��ԕ

COMMIT;
--==>> 커밋 완료.


-- 기존 주민번호(SSN) 컬럼 제거
ALTER TABLE EMPLOYEE
DROP COLUMN SSN;
--==>> Table EMPLOYEE이(가) 변경되었습니다.



DESC EMPLOYEE;
--==>>
/*
이름           널?       유형           
------------ -------- ------------ 
EMPLOYEEID   NOT NULL NUMBER       
NAME                  VARCHAR2(30) 
BIRTHDAY              DATE         
LUNAR                 NUMBER(1)    
TELEPHONE             VARCHAR2(40) 
DEPARTMENTID          NUMBER       
POSITIONID            NUMBER       
REGIONID              NUMBER       
BASICPAY              NUMBER       
EXTRAPAY              NUMBER       
SSN1                  CHAR(6)      
SSN2                  VARCHAR2(50) 
*/

-- 컬럼 추가 → GRADE → 기본값 1 을 일반사원으로 구성
--                              0 을 관리자로 구성

ALTER TABLE EMPLOYEE
ADD GRADE NUMBER(1) DEFAULT 1;
--==>> Table EMPLOYEE이(가) 변경되었습니다.


SELECT *
FROM EMPLOYEE;
--==>> 1	강혜성	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000	971017	=o��ԕ	1


--○ 직원 데이터 입력
INSERT INTO EMPLOYEE(EMPLOYEEID, NAME, BIRTHDAY, LUNAR
                   , TELEPHONE, DEPARTMENTID, POSITIONID, REGIONID
                   , BASICPAY, EXTRAPAY, SSN1, SSN2)
VALUES(EMPLOYEESEQ.NEXTVAL, '길현욱', TO_DATE('1999-02-11', 'YYYY-MM-DD'), 1
        , '010-6678-9867', 1, 1, 1, 1500000, 1500000
        , '990211', CRYPTPACK.ENCRYPT('1234567', '1234567'));
--==>> 1 행 이(가) 삽입되었습니다.


SELECT *
FROM EMPLOYEE;
--==>>
/*
1	강혜성	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000	971017	=o��ԕ	1
2	길현욱	1999-02-11	1	010-6678-9867	1	1	1	1500000	1500000	990211	=o��ԕ	1
*/

COMMIT;
--==>> 커밋 완료.

-- 강혜성 사원을 관리자로 임명

UPDATE EMPLOYEE
SET GRADE=0
WHERE EMPLOYEEID=1;
--==>> 1 행 이(가) 업데이트되었습니다.


SELECT *
FROM EMPLOYEE;
--==>>
/*
1	강혜성	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000	971017	=o��ԕ	0
2	길현욱	1999-02-11	1	010-6678-9867	1	1	1	1500000	1500000	990211	=o��ԕ	1
*/

COMMIT;
--==>> 커밋 완료.


--※ 테이블의 구조를 변경했기 때문에
--   이를 기반으로 생성한 뷰(VIEW)의 내용 또한 새로 작성(수정)

--○ 뷰 생성(EMPLOYEEVIEW)
CREATE OR REPLACE VIEW EMPLOYEEVIEW
AS
SELECT E.EMPLOYEEID AS EMPLOYEEID
     , E.NAME AS NAME
     , E.SSN1 AS SSN
     , TO_CHAR(E.BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY
     , E.LUNAR AS LUNAR
     , DECODE(E.LUNAR, 0, '양력', 1, '음력') AS LUNARNAME
     , E.TELEPHONE AS TELEPHONE
     , E.DEPARTMENTID AS DEPARTMENTID
     , (SELECT DEPARTMENTNAME
        FROM DEPARTMENT
        WHERE DEPARTMENTID=E.DEPARTMENTID) AS DEPARTMENTNAME
    , E.POSITIONID AS POSITIONID
    , (SELECT POSITIONNAME
       FROM POSITION
       WHERE POSITIONID=E.POSITIONID) AS POSITIONNAME
    , E.REGIONID AS REGIONID
    , (SELECT REGIONNAME 
       FROM REGION
       WHERE REGIONID=E.REGIONID) AS REGIONNAME
    , E.BASICPAY AS BASICPAY
    , E.EXTRAPAY AS EXTRAPAY
    , NVL(E.BASICPAY, 0) + NVL(E.EXTRAPAY, 0) AS PAY
    , E.GRADE AS GRADE
FROM EMPLOYEE E;
--==>> View EMPLOYEEVIEW이(가) 생성되었습니다.


DESC EMPLOYEEVIEW;
--==>>
/*
이름             널?       유형           
-------------- -------- ------------ 
EMPLOYEEID     NOT NULL NUMBER       
NAME                    VARCHAR2(30) 
SSN                     CHAR(6)      
BIRTHDAY                VARCHAR2(10) 
LUNAR                   NUMBER(1)    
LUNARNAME               VARCHAR2(6)  
TELEPHONE               VARCHAR2(40) 
DEPARTMENTID            NUMBER       
DEPARTMENTNAME          VARCHAR2(30) 
POSITIONID              NUMBER       
POSITIONNAME            VARCHAR2(30) 
REGIONID                NUMBER       
REGIONNAME              VARCHAR2(30) 
BASICPAY                NUMBER       
EXTRAPAY                NUMBER       
PAY                     NUMBER       
GRADE                   NUMBER(1) 
*/


SELECT *
FROM EMPLOYEE;
--==>>
/*
1	강혜성	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000	971017	=o��ԕ	0
2	길현욱	1999-02-11	1	010-6678-9867	1	1	1	1500000	1500000	990211	=o��ԕ	1
*/

SELECT *
FROM EMPLOYEEVIEW;
--==>>
/*
EMPLOYEEID	NAME	SSN	    BIRTHDAY	LUNAR	LUNARNAME	TELEPHONE	DEPARTMENTID	DEPARTMENTNAME	POSITIONID	POSITIONNAME	REGIONID	REGIONNAME	BASICPAY	EXTRAPAY	PAY	GRADE
1	        강혜성	971017	1997-10-17	0	    양력	010-6380-7047	1	개발부	2	대리	1	서울	2500000	1500000	4000000	0
2	        길현욱	990211	1999-02-11	1	    음력	010-6678-9867	1	개발부	1	사원	1	서울	1500000	1500000	3000000	1
*/


--○ 일반 사원 로그인 쿼리문
--   (ID → EMPLOYEEID / PW → SSN2)
SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID='입력ID문자열'
  AND SSN2=(SELECT SSN2
            FROM EMPLOYEE
            WHERE EMPLOYEEID='입력ID문자열');

SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=2
  AND SSN2=(SELECT SSN2
            FROM EMPLOYEE
            WHERE EMPLOYEEID=2);
--==>> 길현욱

SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=2
  AND (SELECT SSN2
       FROM EMPLOYEE
       WHERE EMPLOYEEID=2) = CRYPTPACK.ENCRYPT('1234568', '1234568');
--==>> 조회 결과 없음 → 로그인 실패


SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=2
  AND (SELECT SSN2
       FROM EMPLOYEE
       WHERE EMPLOYEEID=2) = CRYPTPACK.ENCRYPT('1234567', '1234567');
--==>> 길현욱 → 로그인 성공



SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=[입력ID]
  AND (SELECT SSN2
       FROM EMPLOYEE
       WHERE EMPLOYEEID=[입력ID]) = CRYPTPACK.ENCRYPT([입력PW], [입력PW]);
       

SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=2
  AND SSN2 = CRYPTPACK.ENCRYPT('1234567', '1234567');
--==>> 길현욱 → 로그인 성공 


SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=[입력ID]
  AND SSN2 = CRYPTPACK.ENCRYPT([입력PW], [입력PW]);
--> 한 줄 구성
SELECT NAME FROM EMPLOYEE WHERE EMPLOYEEID=[입력ID] AND SSN2 = CRYPTPACK.ENCRYPT([입력PW], [입력PW])
;


--○ 관리자 로그인 쿼리문
--   (ID → EMPLOYEEID / PW → SSN2 / GRADE → 0)

SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=2
  AND SSN2 = CRYPTPACK.ENCRYPT('1234567', '1234567')
  AND GRADE = 0;
--==>> 조회 결과 없음 → 관리자 로그인 실패


SELECT NAME
FROM EMPLOYEE
WHERE EMPLOYEEID=1
  AND SSN2 = CRYPTPACK.ENCRYPT('1234567', '1234567')
  AND GRADE = 0;
--==>> 강혜성 → 관리자 로그인 성공


--※ 관리자 로그인 한 줄 쿼리문 구성

SELECT NAME FROM EMPLOYEE WHERE EMPLOYEEID=[입력ID] AND SSN2 = CRYPTPACK.ENCRYPT([입력PW], [입력PW]) AND GRADE = 0
;

--○ 직원 데이터 삭제 쿼리문 구성
DELETE
FROM EMPLOYEE
WHERE EMPLOYEEID=2;
--> 한 줄 구성
DELETE FROM EMPLOYEE WHERE EMPLOYEEID=2
;
--==>> 1 행 이(가) 삭제되었습니다.

--○ 롤백
ROLLBACK;
--==>> 롤백 완료.

--○ 직원 데이터 수정 쿼리문 구성
UPDATE EMPLOYEE
SET NAME='길현욱'
  , BIRTHDAY=TO_DATE('1999-02-11', 'YYYY-MM-DD')
  , LUNAR=1
  , TELEPHONE='010-6678-9867'
  , DEPARTMENTID=1
  , POSITIONID=1
  , REGIONID=2
  , BASICPAY=1500000
  , EXTRAPAY=1500000
  , SSN1='990211'
  , SSN2=CRYPTPACK.ENCRYPT('1234568', '1234568')
  , GRADE=1
WHERE EMPLOYEEID=2;
--> 한 줄 구성
UPDATE EMPLOYEE SET NAME='길현욱', BIRTHDAY=TO_DATE('1999-02-11', 'YYYY-MM-DD'), LUNAR=1, TELEPHONE='010-6678-9867', DEPARTMENTID=1, POSITIONID=1, REGIONID=2, BASICPAY=1500000, EXTRAPAY=1500000, SSN1='990211', SSN2=CRYPTPACK.ENCRYPT('1234568', '1234568'), GRADE=1 WHERE EMPLOYEEID=2
;
--==>> 1 행 이(가) 업데이트되었습니다.


SELECT *
FROM EMPLOYEEVIEW;
--==>>
/*
1	강혜성	971017	1997-10-17	0	양력	010-6380-7047	1	개발부	2	대리	1	서울	2500000	1500000	4000000	0
2	길현욱	990211	1999-02-11	1	음력	010-6678-9867	1	개발부	1	사원	2	경기	1500000	1500000	3000000	1
*/

SELECT *
FROM EMPLOYEE;
--==>>
/*
EMPLOYEEID	NAME	BIRTHDAY	LUNAR	TELEPHONE	    DEPARTMENTID	POSITIONID	REGIONID	BASICPAY	EXTRAPAY	SSN1	SSN2	GRADE
1	        강혜성	1997-10-17	0	    010-6380-7047	    1	            2	        1	    2500000	    1500000	    971017	=o��ԕ	0
2	        길현욱	1999-02-11	1	    010-6678-9867	    1	            1	        2	    1500000	    1500000	    990211	����	1
*/

--커밋
COMMIT;
--==>> 커밋 완료.




--○ 전체 부서 리스트 조회 쿼리문 구성(DEPARTMENTVIEW)
SELECT DEPARTMENTID, DEPARTMENTNAME, DELCHECK
FROM DEPARTMENTVIEW
ORDER BY DEPARTMENTID;
--> 한 줄 구성
SELECT DEPARTMENTID, DEPARTMENTNAME, DELCHECK FROM DEPARTMENTVIEW ORDER BY DEPARTMENTID
;
--==>>
/*
1	개발부	2
2	기획부	0
3	영업부	0
4	자재부	0
*/

--○ 부서 데이터 입력 쿼리문 구성(DEPARTMENT)
INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME) VALUES(DEPARTMENTSEQ.NEXTVAL, '총무부')
;
--==>> 1 행 이(가) 삽입되었습니다.

-- 커밋
COMMIT;
--==>> 커밋 완료.


--○ 부서 데이터 삭제 쿼리문 구성(DEPARTMENT)
DELETE
FROM DEPARTMENT
WHERE DEPARTMENTID=3;
--> 한 줄 구성
DELETE FROM DEPARTMENT WHERE DEPARTMENTID=3
;
--==>> 1 행 이(가) 삭제되었습니다.

-- 롤백
ROLLBACK;
--==>> 롤백 완료.


--○ 부서 데이터 수정 쿼리문 구성(DEPARTMENT)
UPDATE DEPARTMENT
SET DEPARTMENTNAME='자원부'
WHERE DEPARTMENTID=2;
--> 한 줄 구성
UPDATE DEPARTMENT SET DEPARTMENTNAME='자원부' WHERE DEPARTMENTID=2
;
--==>> 1 행 이(가) 업데이트되었습니다.

-- 롤백
ROLLBACK;
--==>> 롤백 완료.


--○ 지역 리스트 조회 쿼리문 구성(REGIONVIEW)
SELECT REGIONID, REGIONNAME, DELCHECK
FROM REGIONVIEW
ORDER BY REGIONID;
--> 한 줄 구성
SELECT REGIONID, REGIONNAME, DELCHECK FROM REGIONVIEW ORDER BY REGIONID
;
--==>>
/*
1	서울	1
2	경기	1
3	인천	0
4	대전	0
5	광주	0
6	대구	0
*/

--○ 지역 데이터 등록 쿼리문 구성(REGION)
INSERT INTO REGION(REGIONID, REGIONNAME) VALUES(REGIONSEQ.NEXTVAL, '강원')
;
--==>> 1 행 이(가) 삽입되었습니다.

SELECT *
FROM REGIONVIEW;
--==>> 
/*
1	서울	1
2	경기	1
3	인천	0
4	대전	0
5	광주	0
6	대구	0
7	강원	0
*/

-- 커밋
COMMIT;
--==>> 커밋 완료.

--○ 지역 데이터 삭제 쿼리문 구성(REGION)
DELETE
FROM REGION
WHERE REGIONID=3;
--> 한 줄 구성
DELETE FROM REGION WHERE REGIONID=3
;
--==>> 1 행 이(가) 삭제되었습니다.

-- 롤백
ROLLBACK;
--==>> 롤백 완료.

--○ 지역 데이터 수정 쿼리문 구성(REGION)
UPDATE REGION
SET REGIONNAME='제주'
WHERE REGIONID=4;
--> 한 줄 구성
UPDATE REGION SET REGIONNAME='제주' WHERE REGIONID=4
;
--==>> 1 행 이(가) 업데이트되었습니다.

-- 커밋
COMMIT;
--==>> 커밋 완료.

--○ 전체 직위 리스트 조회 쿼리문 구성(POSITIONVIEW)
SELECT POSITIONID, POSITIONNAME, MINBASICPAY, DELCHECK
FROM POSITIONVIEW
ORDER BY POSITIONID;
--> 한 줄 구성
SELECT POSITIONID, POSITIONNAME, MINBASICPAY, DELCHECK FROM POSITIONVIEW ORDER BY POSITIONID
;
--==>>
/*
1	사원	1000000	1
2	대리	2000000	1
3	과장	3000000	0
4	부장	4000000	0
*/


--○ 직위 데이터 입력 쿼리문 구성(POSITION)
INSERT INTO POSITION(POSITIONID, POSITIONNAME, MINBASICPAY) VALUES(POSITIONSEQ.NEXTVAL, '상무', 5000000)
;
--==>> 1 행 이(가) 삽입되었습니다.


-- 커밋
COMMIT;
--==>> 커밋 완료.



--○ 직위 데이터 삭제 쿼리문 구성(POSITION)
SELECT *
FROM POSITION
WHERE POSITIONID=5;
--> 한 줄 구성
DELETE FROM POSITION WHERE POSITIONID=5
;
--==>> 1 행 이(가) 삭제되었습니다.

--롤백
ROLLBACK;
--==>> 롤백 완료.


--○ 직위 데이터 수정 쿼리문 구성(POSITION)
UPDATE POSITION
SET POSITIONNAME='주임', MINBASICPAY=2000000
WHERE POSITIONID=2;
--> 한 줄 구성
UPDATE POSITION SET POSITIONNAME='주임', MINBASICPAY=2000000 WHERE POSITIONID=2
;
--==>> 1 행 이(가) 업데이트되었습니다.

-- 롤백
ROLLBACK;
--==>> 롤백 완료.

--○ 직원 검색 쿼리문 구성(아이디를 활용하여 직원 데이터 검색)
SELECT EMPLOYEEID, NAME, SSN1
     , TO_CHAR(BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY
     , LUNAR, TELEPHONE, DEPARTMENTID, POSITIONID, REGIONID
     , BASICPAY, EXTRAPAY
FROM EMPLOYEE
WHERE EMPLOYEEID=1;
--> 한 줄 구성
SELECT EMPLOYEEID, NAME, SSN1, TO_CHAR(BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY, LUNAR, TELEPHONE, DEPARTMENTID, POSITIONID, REGIONID, BASICPAY, EXTRAPAY FROM EMPLOYEE WHERE EMPLOYEEID=1
;
--==>>
/*
1	강혜성	971017	1997-10-17	0	010-6380-7047	1	2	1	2500000	1500000
*/


DESC EMPLOYEEVIEW;
DESC EMPLOYEE;

 

 


Mvc04

- com.test.mvc

 

`#01` Employee.java

 

/*=================================
  #01. Employee.java
  - 직원 데이터 자료형 클래스(DTO)
===================================*/

/*
=====================================
[EMPLOYEEVIEW]
===================================== 
EMPLOYEEID     NOT NULL NUMBER       
NAME                    VARCHAR2(30) 
SSN                     CHAR(6)      
BIRTHDAY                VARCHAR2(10) 
LUNAR                   NUMBER(1)    
LUNARNAME               VARCHAR2(6)  
TELEPHONE               VARCHAR2(40) 
DEPARTMENTID            NUMBER       
DEPARTMENTNAME          VARCHAR2(30) 
POSITIONID              NUMBER       
POSITIONNAME            VARCHAR2(30) 
REGIONID                NUMBER       
REGIONNAME              VARCHAR2(30) 
BASICPAY                NUMBER       
EXTRAPAY                NUMBER       
PAY                     NUMBER       
GRADE                   NUMBER(1)    
=====================================


=====================================
[EMPLOYEE]
=====================================
EMPLOYEEID   NOT NULL NUMBER       
NAME                  VARCHAR2(30) 
BIRTHDAY              DATE         
LUNAR                 NUMBER(1)    
TELEPHONE             VARCHAR2(40) 
DEPARTMENTID          NUMBER       
POSITIONID            NUMBER       
REGIONID              NUMBER       
BASICPAY              NUMBER       
EXTRAPAY              NUMBER       
SSN1                  CHAR(6)      
SSN2                  VARCHAR2(50) 
GRADE                 NUMBER(1)  
=====================================

*/

package com.test.mvc;

public class Employee
{
	// 주요 속성 구성
	private String employeeId, name, ssn, birthday, lunarName // ssn
	, telephone, departmentId, departmentName
	, positionId, positionName, regionId, regionName;
	
	private int lunar;							//-- 0:양력, 1:음력
	private int basicPay, extraPay, pay;		//-- 기본급, 수당, 급여
	
	private String ssn1, ssn2;					//-- 주민번호 앞자리, 뒷자리
	private int grade;							//-- 0:관리자, 1:일반사원
	
	
	// getter / setter 구성
	public String getEmployeeId()
	{
		return employeeId;
	}
	public void setEmployeeId(String employeeId)
	{
		this.employeeId = employeeId;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String getSsn()
	{
		return ssn;
	}
	public void setSsn(String ssn)
	{
		this.ssn = ssn;
	}
	public String getBirthday()
	{
		return birthday;
	}
	public void setBirthday(String birthday)
	{
		this.birthday = birthday;
	}
	public String getLunarName()
	{
		return lunarName;
	}
	public void setLunarName(String lunarName)
	{
		this.lunarName = lunarName;
	}
	public String getTelephone()
	{
		return telephone;
	}
	public void setTelephone(String telephone)
	{
		this.telephone = telephone;
	}
	public String getDepartmentId()
	{
		return departmentId;
	}
	public void setDepartmentId(String departmentId)
	{
		this.departmentId = departmentId;
	}
	public String getDepartmentName()
	{
		return departmentName;
	}
	public void setDepartmentName(String departmentName)
	{
		this.departmentName = departmentName;
	}
	public String getPositionId()
	{
		return positionId;
	}
	public void setPositionId(String positionId)
	{
		this.positionId = positionId;
	}
	public String getPositionName()
	{
		return positionName;
	}
	public void setPositionName(String positionName)
	{
		this.positionName = positionName;
	}
	public String getRegionId()
	{
		return regionId;
	}
	public void setRegionId(String regionId)
	{
		this.regionId = regionId;
	}
	public String getRegionName()
	{
		return regionName;
	}
	public void setRegionName(String regionName)
	{
		this.regionName = regionName;
	}
	public int getLunar()
	{
		return lunar;
	}
	public void setLunar(int lunar)
	{
		this.lunar = lunar;
	}
	public int getBasicPay()
	{
		return basicPay;
	}
	public void setBasicPay(int basicPay)
	{
		this.basicPay = basicPay;
	}
	public int getExtraPay()
	{
		return extraPay;
	}
	public void setExtraPay(int extraPay)
	{
		this.extraPay = extraPay;
	}
	public int getPay()
	{
		return pay;
	}
	public void setPay(int pay)
	{
		this.pay = pay;
	}
	public String getSsn1()
	{
		return ssn1;
	}
	public void setSsn1(String ssn1)
	{
		this.ssn1 = ssn1;
	}
	public String getSsn2()
	{
		return ssn2;
	}
	public void setSsn2(String ssn2)
	{
		this.ssn2 = ssn2;
	}
	public int getGrade()
	{
		return grade;
	}
	public void setGrade(int grade)
	{
		this.grade = grade;
	}
	
	
}

 


 

`#02` Department.java

 

/*=================================
  #02. Department.java
  - 부서 데이터 자료형 클래스(DTO)
===================================*/

package com.test.mvc;

public class Department
{
	// 주요 속성 구성
	private String departmentId, departmentName;	//-- 부서아이디, 부서이름
	private int delCheck;							//-- 삭제 가능 여부에 대한 확인
	//-- 참조되고 있는 경우(1 이상) 삭제 불가능
	//   그렇지 않은 경우(0)만 삭제 가능.
	
	// getter / setter 구성
	public String getDepartmentId()
	{
		return departmentId;
	}
	public void setDepartmentId(String departmentId)
	{
		this.departmentId = departmentId;
	}
	public String getDepartmentName()
	{
		return departmentName;
	}
	public void setDepartmentName(String departmentName)
	{
		this.departmentName = departmentName;
	}
	public int getDelCheck()
	{
		return delCheck;
	}
	public void setDelCheck(int delCheck)
	{
		this.delCheck = delCheck;
	}
	
	
	
}

 


 

`#03` Region.java

 

/*=================================
  #03. Region.java
  - 지역 데이터 자료형 클래스(DTO)
===================================*/

package com.test.mvc;

public class Region
{
	// 주요 속성 구성
	private String regionId, regionName;		//-- 지역 아이디, 지역 이름
	private int delCheck;						//-- 삭제 가능 여부에 대한 확인
	//-- 참조되고 있는 경우(1 이상) 삭제 불가능
	//   그렇지 않은 경우(0)만 삭제 가능.
	
	
	// getter / setter 구성
	public String getRegionId()
	{
		return regionId;
	}
	public void setRegionId(String regionId)
	{
		this.regionId = regionId;
	}
	public String getRegionName()
	{
		return regionName;
	}
	public void setRegionName(String regionName)
	{
		this.regionName = regionName;
	}
	public int getDelCheck()
	{
		return delCheck;
	}
	public void setDelCheck(int delCheck)
	{
		this.delCheck = delCheck;
	}
	
	
}

 


 

`#04` Position.java

 

/*=================================
  #04. Position.java
  - 직위 데이터 자료형 클래스(DTO)
===================================*/
package com.test.mvc;

public class Position
{
	// 주요 속성 구성
	
	private String positionId, positionName;		//-- 직위 아이디, 직위 이름
	private int minBasicPay;						//-- 최소 기본급
	private int delCheck;							//-- 삭제 가능 여부에 대한 확인
	//-- 참조되고 있는 경우(1 이상) 삭제 불가능
	//   그렇지 않은 경우(0)만 삭제 가능.
	
	// getter / setter 구성
	public String getPositionId()
	{
		return positionId;
	}
	public void setPositionId(String positionId)
	{
		this.positionId = positionId;
	}
	public String getPositionName()
	{
		return positionName;
	}
	public void setPositionName(String positionName)
	{
		this.positionName = positionName;
	}
	public int getMinBasicPay()
	{
		return minBasicPay;
	}
	public void setMinBasicPay(int minBasicPay)
	{
		this.minBasicPay = minBasicPay;
	}
	public int getDelCheck()
	{
		return delCheck;
	}
	public void setDelCheck(int delCheck)
	{
		this.delCheck = delCheck;
	}
	
	
	
}

 


 

`#05` IEmployeeDAO.java

 

/*=================================
  #05. IEmployeeDAO.java
  - 인터페이스
===================================*/

package com.test.mvc;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IEmployeeDAO
{
	//***********************************************************
	// 부서, 지역, 직위 모두 사용자로부터 직접
	// text 형태로 입력받는 것이 아니라
	// 구성되어 있는 값들 중에서 선택하여 (Drop-Down)
	// 값을 받아내야 하므로... 이에 대한 처리를 생각하여 
	// 이 인터페이스에 필요한 추상 메소드를 정의해 두어야 한다.
	//***********************************************************
	
	public ArrayList<Employee> list() throws SQLException;
	
	public ArrayList<Region> regionList() throws SQLException;
	public ArrayList<Department> departmentList() throws SQLException;
	public ArrayList<Position> positionList() throws SQLException;
	
	public int getMinBasicPay(String positionId) throws SQLException;
	public int employeeAdd(Employee employee) throws SQLException;
	public int remove(String employeeId) throws SQLException;
	public int modify(Employee employee) throws SQLException;
	public Employee searchId(String employeeId) throws SQLException;
	
	public String login(String id, String pw) throws SQLException;
	public String loginAdmin(String id, String pw) throws SQLException;
	
	
	
}

 

 


 

`#06` IDepartmentDAO.java
/*=================================
     #06. IDepartmentDAO.java
     - 인터페이스
===================================*/


package com.test.mvc;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IDepartmentDAO
{
	public ArrayList<Department> list() throws SQLException;
	
	public int add(Department department) throws SQLException;
	public int remove(String departmentId) throws SQLException;
	public int modify(Department department) throws SQLException;

}

 


`#07` IRegionDAO.java
/*=================================
     #07. IRegionDAO.java
     - 인터페이스
===================================*/

package com.test.mvc;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IRegionDAO
{
	public ArrayList<Region> list() throws SQLException;
	
	public int add(Region region) throws SQLException;
	public int remove(String regionId) throws SQLException;
	public int modify(Region region) throws SQLException;

}

`#08` IPositionDAO.java
/*=================================
     #08. IPositionDAO.java
     - 인터페이스
===================================*/

package com.test.mvc;

import java.sql.SQLException;
import java.util.ArrayList;

public interface IPositionDAO
{
	public ArrayList<Position> list() throws SQLException;
	
	public int add(Position position) throws SQLException;
	public int remove(String positionId) throws SQLException;
	public int modify(Position position) throws SQLException;
	
}

 

`#09` EmployeeDAO.java

 

/*=============================================
     #09. EmployeeDAO.java
     - 데이터베이스 액션 처리 클래스
     - 직원 데이터 CRUD 액션
     - Connection 객체에 대한 의존성 주입을 위한 준비
       → 인터페이스 형태의 속성 구성(DataSource)
       → setter 구성
===============================================*/

package com.test.mvc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;


public class EmployeeDAO implements IEmployeeDAO
{
	
	// 주요 속성 구성 → 인터페이스 형태
	private DataSource dataSource;
	// SimpleDriverDataSource → [dispatcher-sevlet.xml]
	
	// setter 구성
	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
	}

	// 직원 리스트
	@Override
	public ArrayList<Employee> list() throws SQLException
	{
		ArrayList<Employee> result = new ArrayList<Employee>(); 
				
		Connection conn = dataSource.getConnection();
		
		String sql="SELECT EMPLOYEEID, NAME, SSN"
					  + ", BIRTHDAY, LUNAR, LUNARNAME"
					  + ", TELEPHONE, DEPARTMENTID, DEPARTMENTNAME"
					  + ", POSITIONID, POSITIONNAME, REGIONID"
					  + ", REGIONNAME, BASICPAY, EXTRAPAY"
					  + ", PAY, GRADE"
				+ " FROM EMPLOYEEVIEW"
				+ " ORDER BY EMPLOYEEID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			Employee employee = new Employee();
			
			employee.setEmployeeId(rs.getString("EMPLOYEEID"));
			employee.setName(rs.getString("NAME"));
			employee.setSsn(rs.getString("SSN"));
			employee.setBirthday(rs.getString("BIRTHDAY"));
			employee.setLunar(rs.getInt("LUNAR"));
			employee.setLunarName(rs.getString("LUNARNAME"));
			employee.setTelephone(rs.getString("TELEPHONE"));
			employee.setDepartmentId(rs.getString("DEPARTMENTID"));
			employee.setDepartmentName(rs.getString("DEPARTMENTNAME"));
			employee.setPositionId(rs.getString("POSITIONID"));
			employee.setPositionName(rs.getString("POSITIONNAME"));
			employee.setRegionId(rs.getString("REGIONID"));
			employee.setRegionName(rs.getString("REGIONNAME"));
			employee.setBasicPay(rs.getInt("BASICPAY"));
			employee.setExtraPay(rs.getInt("EXTRAPAY"));
			employee.setPay(rs.getInt("PAY"));
			employee.setGrade(rs.getInt("GRADE"));
			
			result.add(employee);
			
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		return result;
	}
	
	
	// 지역 리스트
	@Override
	public ArrayList<Region> regionList() throws SQLException
	{
		ArrayList<Region> result = new ArrayList<Region>();
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT REGIONID, REGIONNAME, DELCHECK"
				  + " FROM REGIONVIEW"
				  + " ORDER BY REGIONID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			Region region = new Region();
			
			region.setRegionId(rs.getString("REGIONID"));
			region.setRegionName(rs.getString("REGIONNAME"));
			region.setDelCheck(rs.getInt("DELCHECK"));
			
			result.add(region);
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 부서 리스트
	@Override
	public ArrayList<Department> departmentList() throws SQLException
	{
		ArrayList<Department> result = new ArrayList<Department>();
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT DEPARTMENTID, DEPARTMENTNAME, DELCHECK"
				  + " FROM DEPARTMENTVIEW"
				  + " ORDER BY DEPARTMENTID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			Department department = new Department();
			
			department.setDepartmentId(rs.getString("DEPARTMENTID"));
			department.setDepartmentName(rs.getString("DEPARTMENTNAME"));
			department.setDelCheck(rs.getInt("DELCHECK"));
			
			result.add(department);
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 직위 리스트
	@Override
	public ArrayList<Position> positionList() throws SQLException
	{
		ArrayList<Position> result = new ArrayList<Position>();
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT POSITIONID, POSITIONNAME, MINBASICPAY, DELCHECK"
				  + " FROM POSITIONVIEW"
				  + " ORDER BY POSITIONID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			Position position = new Position();
			
			position.setPositionId(rs.getString("POSITIONID"));
			position.setPositionName(rs.getString("POSITIONNAME"));
			position.setMinBasicPay(rs.getInt("MINBASICPAY"));
			position.setDelCheck(rs.getInt("DELCHECK"));
			
			result.add(position);
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 직위 아이디에 따른 최소 기본급 확인/검색
	@Override
	public int getMinBasicPay(String positionId) throws SQLException
	{
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		//System.out.println(positionId);
		
		String sql = "SELECT MINBASICPAY"
			   	  + " FROM POSITION"
				  + " WHERE POSITIONID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(positionId));
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result = rs.getInt("MINBASICPAY");
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 직원 데이터 추가
	@Override
	public int employeeAdd(Employee employee) throws SQLException
	{
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "INSERT INTO EMPLOYEE"
					  + "(EMPLOYEEID, NAME"
					  + ", BIRTHDAY"
					  + ", LUNAR, TELEPHONE, DEPARTMENTID"
					  + ", POSITIONID, REGIONID, BASICPAY"
					  + ", EXTRAPAY, SSN1, SSN2)"
					  
					  + " VALUES(EMPLOYEESEQ.NEXTVAL, ?"
					  + ", TO_DATE(?, 'YYYY-MM-DD')"
					  + ", ?, ?, ?"
					  + ", ?, ?, ?"
					  + ", ?, ?, CRYPTPACK.ENCRYPT(?, ?))";
		
		// name, ssn1, ssn2, ssn2
		// birthday, lunar, telephone
		// departmentId, positionId, regionId
		// basicPay, extraPay
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, employee.getName());
		pstmt.setString(2, employee.getBirthday());
		pstmt.setInt(3, employee.getLunar());
		pstmt.setString(4, employee.getTelephone());
		pstmt.setInt(5, Integer.parseInt(employee.getDepartmentId()));
		pstmt.setInt(6, Integer.parseInt(employee.getPositionId()));
		pstmt.setInt(7, Integer.parseInt(employee.getRegionId()));
		pstmt.setInt(8, employee.getBasicPay());
		pstmt.setInt(9, employee.getExtraPay());
		pstmt.setString(10, employee.getSsn1());
		pstmt.setString(11, employee.getSsn2());
		pstmt.setString(12, employee.getSsn2());
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 직원 데이터 사게
	@Override
	public int remove(String employeeId) throws SQLException
	{
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "DELETE"
				  + " FROM EMPLOYEE"
				  + " WHERE EMPLOYEEID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(employeeId));
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 직원 데이터 수정
	@Override
	public int modify(Employee employee) throws SQLException
	{
		int result = 0;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "UPDATE EMPLOYEE"
				  + " SET NAME=?"
			  	  + ", BIRTHDAY=TO_DATE(?, 'YYYY-MM-DD')"
				  + ", LUNAR=?"
				  + ", TELEPHONE=?"
				  + ", DEPARTMENTID=?, POSITIONID=?, REGIONID=?"
				  + ", BASICPAY=?, EXTRAPAY=?"
				  + ", SSN1=?, SSN2=CRYPTPACK.ENCRYPT(?, ?)"
				  + " WHERE EMPLOYEEID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, employee.getName());
		pstmt.setString(2, employee.getBirthday());
		pstmt.setInt(3, employee.getLunar());
		pstmt.setString(4, employee.getTelephone());
		pstmt.setInt(5, Integer.parseInt(employee.getDepartmentId()));
		pstmt.setInt(6, Integer.parseInt(employee.getPositionId()));
		pstmt.setInt(7, Integer.parseInt(employee.getRegionId()));
		pstmt.setInt(8, employee.getBasicPay());
		pstmt.setInt(9, employee.getExtraPay());
		pstmt.setString(10, employee.getSsn1());
		pstmt.setString(11, employee.getSsn2());
		pstmt.setString(12, employee.getSsn2());
		pstmt.setInt(13, Integer.parseInt(employee.getEmployeeId()));
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 아이디로 직원 검색
	@Override
	public Employee searchId(String employeeId) throws SQLException
	{
		Employee result = new Employee();
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT EMPLOYEEID, NAME"
						+ ", SSN1, TO_CHAR(BIRTHDAY, 'YYYY-MM-DD') AS BIRTHDAY"
						+ ", LUNAR, TELEPHONE"
						+ ", DEPARTMENTID, POSITIONID, REGIONID"
						+ ", BASICPAY, EXTRAPAY"
				  + " FROM EMPLOYEE"
				  + " WHERE EMPLOYEEID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(employeeId));
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result.setEmployeeId(rs.getString("EMPLOYEEID"));
			result.setName(rs.getString("NAME"));
			result.setSsn1(rs.getString("SSN1"));
			result.setBirthday(rs.getString("BIRTHDAY"));
			result.setLunar(rs.getInt("LUNAR"));
			result.setTelephone(rs.getString("TELEPHONE"));
			result.setDepartmentId(rs.getString("DEPARTMENTID"));
			result.setPositionId(rs.getString("POSITIONID"));
			result.setRegionId(rs.getString("REGIONID"));
			result.setBasicPay(rs.getInt("BASICPAY"));
			result.setExtraPay(rs.getInt("EXTRAPAY"));
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		
		return result;
	}

	// 일반 직원 로그인
	@Override
	public String login(String id, String pw) throws SQLException
	{
		// 【check~!!!】
		//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		// 결과값으로 반환할 값을 절대로 빈 문자열로 하지 말고
		// null 로 해야한다!!
		// 반환한 것이 null 일 때 로그인 실패를 처리해야 하는데
		// 빈 문자열이 들어가 있으면 null 이 아니므로~!!!
		//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		
		//String result = "";
		
		String result = null;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT NAME"
				  + " FROM EMPLOYEE"
				  + " WHERE EMPLOYEEID=?"
				    + " AND SSN2 = CRYPTPACK.ENCRYPT(?, ?)";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(id));
		pstmt.setString(2, pw);
		pstmt.setString(3, pw);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result = rs.getString("NAME");
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	// 관리자 로그인
	@Override
	public String loginAdmin(String id, String pw) throws SQLException
	{
		//String result = "";
		
		String result = null;
		
		Connection conn = dataSource.getConnection();
		
		String sql = "SELECT NAME"
				  + " FROM EMPLOYEE"
				  + " WHERE EMPLOYEEID=?"
				    + " AND SSN2 = CRYPTPACK.ENCRYPT(?, ?)"
				    + " AND GRADE = 0";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(id));
		pstmt.setString(2, pw);
		pstmt.setString(3, pw);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			result = rs.getString("NAME");
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}
	

}

 


 

`#10` DepartmentDAO.java

 

/*=============================================
     #10. DepartmentDAO.java
     - 데이터베이스 액션 처리 클래스
     - 직원 데이터 CRUD 액션
     - Connection 객체에 대한 의존성 주입을 위한 준비
       → 인터페이스 형태의 속성 구성(DataSource)
       → setter 구성
===============================================*/

package com.test.mvc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.sql.DataSource;

public class DepartmentDAO implements IDepartmentDAO
{

	private DataSource datasource;
	
	
	
	public void setDatasource(DataSource datasource)
	{
		this.datasource = datasource;
	}
	

	@Override
	public ArrayList<Department> list() throws SQLException
	{
		ArrayList<Department> result = new ArrayList<Department>();
		
		Connection conn = datasource.getConnection();
		
		String sql = "SELECT DEPARTMENTID, DEPARTMENTNAME, DELCHECK"
				  + " FROM DEPARTMENTVIEW"
				  + " ORDER BY DEPARTMENTID";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		ResultSet rs = pstmt.executeQuery();
		
		while(rs.next())
		{
			Department department = new Department();
			
			department.setDepartmentId(rs.getString("DEPARTMENTID"));
			department.setDepartmentName(rs.getString("DEPARTMENTNAME"));
			department.setDelCheck(rs.getInt("DELCHECK"));
			
			result.add(department);
		
		}
		
		rs.close();
		pstmt.close();
		conn.close();
		
		return result;
	}

	@Override
	public int add(Department department) throws SQLException
	{
		int result = 0;
		
		Connection conn = datasource.getConnection();
		
		String sql = "INSERT INTO DEPARTMENT(DEPARTMENTID, DEPARTMENTNAME)"
				  + " VALUES(DEPARTMENTSEQ.NEXTVAL, ?)";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, department.getDepartmentName());
		
		result = pstmt.executeUpdate();
		
		pstmt.close();
		conn.close();
		
		return result;
	}

	@Override
	public int remove(String departmentId) throws SQLException
	{
		int result = 0;
		
		Connection conn = datasource.getConnection();
		
		String sql = "DELETE"
				  + " FROM DEPARTMENT"
				  + " WHERE DEPARTMENTID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setInt(1, Integer.parseInt(departmentId));
		
		result = pstmt.executeUpdate();

		pstmt.close();
		conn.close();
		
		return result;
		
	}

	@Override
	public int modify(Department department) throws SQLException
	{
		int result = 0;
		
		Connection conn = datasource.getConnection();
		
		String sql = "UPDATE DEPARTMENT"
			  	  + " SET DEPARTMENTNAME=?"
				  + " WHERE DEPARTMENTID=?";
		
		PreparedStatement pstmt = conn.prepareStatement(sql);
		
		pstmt.setString(1, department.getDepartmentName());
		pstmt.setInt(2, Integer.parseInt(department.getDepartmentId()));
		
		result = pstmt.executeUpdate();

		pstmt.close();
		conn.close();
		
		return result;
	}

}