본문 바로가기

전자정부프레임워크

전자정부프레임워크_(3)부서관리

<부서관리>

부서관리 프로그램 제작으로 기본처리를 목적으로 제작했다.

 

{프로그램 목록}

1. deptWrite.do             // 등록 화면

2. deptWriteSave.do     // 등록 처리

3. deptList.do                // 목록 화면

4. deptDetail.do            // 상세 화면

5. deptUpdate.do         // 수정 처리

6. deptDelete.do          // 삭제 처리

 

{파일 목록}

1. DeptService.java              // 명세처리 역할(인터페이스 파일)

2. DeptServiceImpl.java       // 구현처리(인터페이스 파일을 상속 받아 오버라이딩한다.)

3. DeptDAO.java                  // 데이터베이스 연결 역할 (SQL 파일과 연결하기 위해 SQL의 ID값과 전달값을 세팅한다.)

4. Dept_SQL.xml                 // 실행 SQL을 기록한다. iBatis 구조 또는 myBatis 구조로 되어있다.

5. DeptController.java          // 웹 주소 매핑, 서비스 실행, 화면출력 등을 담당하는 Main 격에 해당하는 파일이다.

6. DeptVO.java                    // 정보담기 역할을 하는 파일로 정보 전달에 필요한 변수 및 GET,SET 메소드가 세팅된다. 

 

{구성 이미지}

- 패키지 이름은 각자 다를 수 있으나 기본적으로 아래와 같은 위치에서 배치가 되어야한다.

 

DeptService.java
0.00MB
DeptVO.java
0.00MB
DeptDAO.java
0.00MB
DeptServiceImpl.java
0.00MB
DeptController.java
0.00MB
Dept_SQL.xml
0.00MB
sql-map-config.xml
0.00MB

{상세 내용 보기}

1. DeptService - 명세역할(인터페이스)

package egovframework.example.sample.service;

import java.util.List;

/*자바는 Class와 Interface 두가지가 존재한다!!!*/
/*실행을 하면 메모리에 올라간다! 객체로 생성되지만 인터페이스는 그냥 글자로써 존재한다!*/
/*추상화라는 것은 명세라는 의미를 가진다!*/
public interface DeptService {
	/* 데이터 베이스 항목들을 작성한다! */
	/* 데이터베이스와 연관되어 있는 것은 이곳에다가 추가해야한다! */
	
	/* 명세 역할을 하는 메소드를 작성한다! */
	public String InsertDept(DeptVO vo) throws Exception;
	
	/*명세처리를 우선 먼저 해야한다!!!!*/
	public List<?> SelectDeptList(DeptVO vo) throws Exception;
	
	/* Service는 SQL를 실행되게끔 하는 내용이다! */
	/* 여기서 중요한 부분은 리턴타입인데, VO이다! */
	/* 리턴타입은 결과론적으로 어떤 것들이 전달될 것인가이다! */
	/* 매개변수는 SQL로 전달시켜서 조건식에 대입시키게될 요소이다! */
	public DeptVO selectDeptDetail(int deptno) throws Exception;
	
	/* 메소드가 정상적으로 실행되고 나서 반환되는 값이 int라는 말이다! */
	/* Delete같은 경우에는,데이터베이스에서 출력이 되거나 그러한 존재가 아니다! */
	/* 여기서 Integer는 insert,update,delete와 같이 처리가 아닌 처리가 되는 부분은 결과물을 리턴해준다! */
	/* 결과물이라는 것은 몇개를 삭제했는지이다! */
	/* deptno로 인해 갯수가 넘어가기 때문에,Integer로 리턴해준다! */
	public int deleteDept(int deptno) throws Exception;
	
	
	/*
	 * 여기서 Integer는 SqlDeveloper에서 가져오는 것이 아니라 iBatis라는 구조에서 실행을 시키는데 그쪽에서 가져오는것이다!
	 */
	public int updateDept(DeptVO vo) throws Exception;
	
	
}

2. DeptVO

package egovframework.example.sample.service;

public class DeptVO {
	
	/* 해당 변수에 다이렉트로 도달하지 못하도록 private라는 접근제어자를 사용한다! */
	private String deptno;
	private String dname;
	private String loc;
	
	public String getDeptno() {
		return deptno;
	}
	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	
	
}

 

3. DeptServiceImpl - 구현역할(인터페이스 파일을 상속받아 구현)

 

package egovframework.example.sample.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import egovframework.example.sample.service.DeptService;
import egovframework.example.sample.service.DeptVO;
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl;

/*Impl은 구현체이다!*/
/*혼자서는 사용이 불가능하여, 연결이 되어야 구현을 할 수 있다!*/
/*추상화된 것을 상속받는다!*/

/*Controller에서 인식하는 용도이다!*/
@Service("deptService")
public class DeptServiceImpl extends EgovAbstractServiceImpl implements DeptService{
	/* 추상클래스나 인터페이스를 상속받게 되면 강제적으로 의무가 주어지는데 그것은 바로! */
	/* 명세에 해당되는 것들은 모조리 구현이 되어야 한다! */
	/* 접근제어자와 타입과 메서드 그리고 매개변수가 모두 동일해야 한다! */
	/* DeptServiceImple 마우스 위에 올려서 자동완성 시킨다! */
	
	
	/* 프레임워크에서 어떠한 클래스를 사용하기 위해서는 Annotation를 꼭 사용해줘야한다! */
	/* 프레임워크 - 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다. */
	@Resource(name = "deptDAO")
	private DeptDAO deptDAO;
	
	
	
	/* Override는 다형성이다! */
	/* 부모클래스에 있는 것들을 덮어쓴다는 말이다! */ 
	/* 다형성 - 오버라이딩(상속), 오버로딩(같은 클래스) */
	/* 객체지향의 4대 요소 : 추상화, 다형성, 상속, 캡슐화 */
	/* 여기서 캡슐화는 public를 의미한다 */
	@Override
	public String InsertDept(DeptVO vo) throws Exception {
		return deptDAO.insertDept(vo);
	}
	
	/* Override - 상속관계에서 설정되는데,부모클래스 내용의 똑같은 메소드를 만든다! */
	@Override
	public List<?> SelectDeptList(DeptVO vo) throws Exception {
		return deptDAO.selectDeptList(vo);
	}

	@Override
	public DeptVO selectDeptDetail(int deptno) throws Exception {
		return deptDAO.selectDeptDetail(deptno);
	}

	@Override
	public int deleteDept(int deptno) throws Exception {
		return deptDAO.deleteDept(deptno);
	}
	
	/* 메소드 이름과 return 값에 있는 DAO의 이름은 동일하지 않아도 된다! */
	@Override
	public int updateDept(DeptVO vo) throws Exception {
		return deptDAO.updateDept(vo);
	}
	
	
}

 

4. DeptDAO - DB연결 역할

 

package egovframework.example.sample.service.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import egovframework.example.sample.service.DeptVO;
import egovframework.rte.psl.dataaccess.EgovAbstractDAO;

/*Service라는 항목은 반드시  만들어야 하는 요소들에 대한 정의!*/
/*예를 들어, 팀의 리더라던지 이런 항목들을 뽑는다!*/
/*Impl는 항목들을 실제 구현하는 것이다! --- 프로그램 구현(프로그램 작성)*/
/*데이터베이스를 연결해야 한다! DeptServiceImple.java에서 Dept_SQL.xml로 곧바로 가지 못한다!*/
/*DAO를 거쳐가야 한다!*/
/*DAO는 SQL를 가기위한 중간단계인 것이다!*/
/*DAO - DB연결*/

@Repository("deptDAO")
public class DeptDAO extends EgovAbstractDAO{

	public String insertDept(DeptVO vo){
		return (String)insert("deptDAO.insertDept", vo);
		/* insert("deptDAO.insertDept", vo)해당 메소드는 상위 클래스인 EgovAbstractDAO에 있는 메소드이다! */
		/* deptDAO.insertDept 대신에 1이나 2 등 사용해도된다.. */
		/* 예를들어, 1로 했다면 SQL.xml id값에 1로 해줘야한다! */
	}

	public List<?> selectDeptList(DeptVO vo) {
		return (List<?>)list("deptDAO.selectDeptList");
						/* 목록같은 데이터들을 조회해줄때 list 메소드를 사용한다! select(x) */
	}

	public DeptVO selectDeptDetail(int deptno) {
		return (DeptVO)select("deptDAO.selectDeptDetail", deptno);
	}

	public int deleteDept(int deptno) {
		return (int)delete("deptDAO.deleteDept", deptno);
						/* SQL의 id값에 사용될 수 있게 DAO의 이름과 메소드 이름을 정해준다! */
	}
	
	/* DAO는 sql과 연동을 위한 목적을 지니고 있다!!!!!! */
	/* sql에서 사용하는 id값을 세팅을 하고 sql에서 필요한 데이터를 전달시켜주는 역할을 한다!!! */
	public int updateDept(DeptVO vo) {
		return (int)update("deptDAO.updateDept", vo);
	}

}

 

5. DeptController

package egovframework.example.sample.web;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import egovframework.example.sample.service.DeptService;
import egovframework.example.sample.service.DeptVO;

@Controller
public class DeptController {

	@Resource(name = "deptService")
	private DeptService deptService;
	
	@RequestMapping(value = "/deptWrite.do")
	public String deptWrite() {
		
		return "dept/deptWriter";
	}
	
	//@RequestMapping(value = "/deptWriteSave.do")
	//public String InsertDept(DeptVO vo) {
		/* InsertDept라고 메서드 이름을 정한 이유는 저장을 하기위한 것이구나라고 알기쉽게 표현하기 위해서다 ^^ */
		
		//System.out.println(vo.getDeptno());
		//System.out.println(vo.getDname());
		//System.out.println(vo.getLoc());
		
		//return "";
	//}
	
	@RequestMapping(value = "/deptWriteSave.do")
	public String InsertDept(DeptVO vo) throws Exception{
		
		System.out.println(vo.getDeptno());
		System.out.println(vo.getDname());
		System.out.println(vo.getLoc());
		
		String result = deptService.InsertDept(vo);
		if(result == null) { //저장 ok
			System.out.println("저장완료");
			
		}else {
			System.out.println("저장실패");
			
		}
		
		return "";
	}
	
	@RequestMapping(value = "/deptList.do")
	public String selectDeptList(DeptVO vo, ModelMap model) throws Exception {
											/*ModelMap이라는 클래스는 이 자체가 매개체이다!*/
											/* 데이터를 jsp로 전달해주는 역할이다! */
											/* ModelMap으로 태워서 return으로 화면에 전달하면 자동적으로 데이터를 전달하게 된다! */
		
		List<?> list = deptService.SelectDeptList(vo);
		/* ?는 어떤 타입이 와도된다는 말이다! */
		/* 여기서 list 변수는 데이터를 들고 있는 변수이다! */
		
		model.addAttribute("resultList",list);
						   /*첫번째 매개변수 : jsp에 들어갈 변수이름을 정해야함*/
						   /*두번째 매개변수 : 실데이터가 들어간 변수*/
		
		System.out.println("list값:" + list);
		
		return "dept/deptList";
		/* select의 진행순서 */
		/*Controller -> DeptService -> DeptServiceImpl -> DeptDAO -> Dept_SQL 여기서 컨트롤로 바로 가는것이 아니라!*/
		/*역으로 */
		/*-> DeptDAO -> DeptService -> DeptServiceImpl -> Controller*/
	}
	
	@RequestMapping(value = "/deptDetail.do")
	public String selectDeptDetail(int deptno, ModelMap model) throws Exception {
		
		DeptVO vo = deptService.selectDeptDetail(deptno);
		/* Dept_SQL.xml 파일에서 deptVO로 담아서 매개변수에 담아오는것이기 때문에 DeptVO의 변수 vo로 담아준다! */ 
		System.out.println("부서번호 : " + vo.getDeptno());
		
		model.addAttribute("deptVO", vo);
						/*1)jsp에 쓸 내용 */
						/*2)실제 담긴 데이터의 변수*/
		return "dept/deptDetail";
	}
	
	@RequestMapping(value = "/deptDelete.do")
	public String deleteDept(int deptno) throws Exception {
		
		int result = deptService.deleteDept(deptno);
		
		if(result == 1) {
			
			System.out.println("삭제완료");
			
		}else {
			
			System.out.println("삭제실패");
			
		}
		
		return "";
	}
	
	@RequestMapping(value = "/deptModifyWrite.do")
	public String selectDeptModify(int deptno, ModelMap model) throws Exception{
		
		/* 1. 상세정보를 가지고 와서 먼저 뿌려줘야한다! */ 
		/*상세보기와 동일하기 때문에 Service를 안만들어줘도 된다!*/
		/* Serivce라고 하는 것은 궁극적으로 SQL까지 도달하여 동작시키기 위해서이다! */
		/* SQL이 돌아간 순간 DeptVO.class 파일의 변수들에게 set으로 담기게 된다! */
		DeptVO vo = deptService.selectDeptDetail(deptno);
		
		model.addAttribute("vo", vo);
		
		/* return에는 jsp주소를 적는다! */
		return "dept/deptModifyWrite";
	}
	
	@RequestMapping(value = "/deptModifySave.do")
	public String updateDept(DeptVO vo) throws Exception{
		
		int result = deptService.updateDept(vo);
		
		if(result == 1) {
			System.out.println("수정완료");
		}else {
			System.out.println("수정실패");
		}
		
		return "";
	}
}

 

6. Dept_SQL.xml - iBatis 구성에 맞게 세팅

<sqlMap namespace="DeptSpace">
<!--  namespace는 고유해야한다!  -->
<typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
<typeAlias alias="deptVO" type="egovframework.example.sample.service.DeptVO"/>
<!--  실제 VO가 존재하는 경로!  -->
<!--  여기서 id값은 DAO설정한 id값과 일치해야한다!  -->
<insert id="deptDAO.insertDept">
insert into dept(deptno, dname, loc) values(#deptno#,#dname#,#loc#)
<!--  ##은 iBATIS의 변수이다!  -->
<!--  VO를 통해 계속 넘어오는 변수이다!  -->
</insert>
<!--  id값은 DAO의 return에 있는 메소드의 매개변수와 맞춰준다!  -->
<select id="deptDAO.selectDeptList" resultClass="egovMap">
<!--  insert는 출력물이 아니다!
											select는 출력물이며 java파일로 List형태로 전달이 되는데,
											resultClass는 SQL결과를 egovMap이라는 클래스에 담아서 전달을 시키겠다는 것이다!  -->
<!--  egovMap은 무엇일까? <typeAlias  alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>  -->
select deptno,dname,loc from dept
<!--  여기서 세미콜론(;)을 넣게되면 오류가 난다!  -->
<!--  iBatis 문법을 따라야한다!  -->
</select>
<!--  resultMap이란,SQL문에서 받아올 클래스를 의미한다!  -->
<!--  resultMap의 이름은 DEPT_SQL.xml 파일의 alias를 적어준다!  -->
<!--  SQL에서 조건에 맞는 데이터들이 출력이 될텐데,그 내용을 resultClass로 deptVO에 담겠다는 말이다!  -->
<select id="deptDAO.selectDeptDetail" resultClass="deptVO"> select deptno, dname, loc from dept where deptno = #deptno# </select>
<!--  DAO에 입력한 return값을 입력해준다!  -->
<!--  Controller라던지, Service라던지 다시 던져주지 않고 바로 실행만 하고 끝나기 때문에 id값만 사용하고 끝낸다!  -->
<delete id="deptDAO.deleteDept"> delete from dept where deptno=#deptno# </delete>
<update id="deptDAO.updateDept"> update dept set dname=#dname#, loc=#loc# where deptno=#deptno# </update>
</sqlMap>

 

7. sql_map_config.xml (Dept_SQL.xml 파일 등록하는 곳)