[ 전자정부프레임워크 ]

배포용 homepage 만들기(2) - 조회/저장하기

히앤님 2025. 4. 16. 17:51
반응형
SMALL

empSearch.do로 데이터 조회 끝났으면 이제 파일명 맞춰주고 정리하면 된다.

 

empDAO -> ibsheetDAO

empSearvice -> ibsheetService

empSearviceImpl -> ibsheetServiceImpl

empVO -> ibsheetVO

empMapper.xml -> ibsheetMapper.xml

EmpController.java -> IbsheetTemplateController.java

 

어차피 실행하고 있는 ibsheetTpdb.sql은 한개이고, context-mapper.xml 에서 ibsheetTemplate/*.xml 과 같이 아스타로 모든 파일을 다 열어놨기 때문에 시행은 다 된다.

 

기존에는 mapper 구조로 되어있긴 한데, 잘되는거 그냥 유지시켜보자.....(나중에 mapper로 다시 해보지 뭐)

 

 

xml 부터 변환

1. empMapper.xml -> IbsheetMapper.xml

namespace를 변경해줘야한다.

<!-- 기존 -->
<mapper namespace="egovframework.mapper.let.ibsheetTemplate.empMapper">

<!-- 변경 -->
<mapper namespace="egovframework.mapper.let.ibsheetTemplate.IbsheetMapper">

 

내용은 기존 내용 가져다 쓰기

<select id="selectEmpList" resultType="egovMap">
SELECT
	  EMPNO            -- 사번
	, ENAME            -- 이름
	, JOB              -- 직무
	, JOBSTATUS        -- 직무 상태
	, MGR              -- 상사 번호
	, HIREDATE         -- 입사일
	, SAL              -- 급여
    
    -- 월별 급여 시뮬레이션
        , (SAL) AS JAN
        , (SAL * 1.05) AS FEB
        , (SAL * 0.95) AS MAR
        , (SAL * 1.7) AS APR
        , (SAL * 0.75) AS MAY
        
	, COMM         		-- 커미션
	, DEPTNO            -- 부서번호
    
    -- 급여 기준으로 텍스트 색상을 다르게 지정
        , CASE
            WHEN SAL > 4500 THEN '#FF0000'
            ELSE '#0000FF'
          END AS salTextColor
          
     -- MGR이 없으면 편집 불가(0), 있으면 편집 가능(1)
        , CASE
            WHEN MGR IS NULL THEN '0'
            ELSE '1'
          END AS _edit
          
    FROM EMP
    WHERE 1 = 1
</select>

 

SAL 컬럼은 1월엔 급여 그대로, 2월엔 5% 인상, 3월엔 5% 감소 등 월별 급여를 시뮬레이션해서 보여주는 계산 컬럼이다.

색상을 지정하여 가져오면 TextColor 값을 핸들링할 수 있기 때문에 CASE 문에서 색상 부여,

추가로 MGR 여부에 따라 편집 여부도 부여한다.

 

정상동작 하는지 확인할 것.

 

2. empVO -> IbsheetVO

기존에는 VO가 없지만 인정성을 위해 부여.

 

 

3. EmpDAO-> IbsheetDAO

DAO 이름 수정하고 @Repository 이름 수정.

@Repository("ibsheetDAO")
public class IbsheetDAO extends EgovAbstractMapper {

    public List<?> selectEmpList(Map<String, String> map){
    	return selectList("egovframework.mapper.let.ibsheetTemplate.IbsheetMapper.selectEmpList");
    }
}

 

Color 값 등 어떤 타입이 올지 몰라서 제네릭 와일드카드로 열어두자.

 

  • 리턴 타입: List<?>
    • 이건 제네릭 와일드카드이며, 어떤 타입이든 허용한다는 의미
    • 타입 안정성이 떨어짐. 사용 시 다운캐스팅이 필요할 수 있음
  • 파라미터: Map<String, String> map
    • 조건을 넣을 수 있음. 예: 이름, 부서번호 등

 

기존의 List<Map<String, Object>> 는 결과가 Map 형태로 확정되어 있어 사용 시 바로 .get("컬럼명") 가능함.

+ 타입 안정성이 높고 직관적으로 데이터를 다루기 쉬움

우선 그대로 만들어보고 추후에 리턴타입을 변경하자.

 

 

4. EmpSearvice -> IbsheetService

package egovframework.let.ibsheetTemplate.service;

import java.util.List;
import java.util.Map;

public interface IbsheetService {

	public List<?> selectEmpList(Map<String, String> map) throws Exception;
}

 

 

 

5. EmpSearviceImpl -> IbsheetServiceImpl

package egovframework.let.ibsheetTemplate.service.impl;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;

import egovframework.let.ibsheetTemplate.service.IbsheetService;

@Service("ibsheetService")
public class IbsheetServiceImpl implements IbsheetService {

    @Resource(name = "ibsheetDAO")
    private IbsheetDAO ibsheetDAO;

    @Override
    public List<?> selectEmpList(Map<String, String> map) throws Exception {
        return ibsheetDAO.selectEmpList(map);
    }

}

 

DAO 이름, 상속하는 service 이름 등 수정

 

 6. EmpController.java -> IbsheetTemplateController.java

@Service("ibsheetService") 에 설정했던 이름을 @Resource로 받는다.

/empSearch2.do로 호출하면 데이터 조회됨.

    @Resource(name = "ibsheetService")
    private IbsheetService ibsheetService;
	
	@RequestMapping(value = "/empSearch2.do")
	public ModelAndView selectEmp(@RequestParam Map<String,String> map, HttpSession hs) throws Exception {

		System.out.println("조회 버튼 클릭 : " );
		IBSheetUtil ibUtil = new IBSheetUtil();
		//데이터 조회
		List<?> data = ibsheetService.selectEmpList(map);
		

		System.out.println("data : " + data);
		//JSON
		ibUtil.setData(data);
		
		ModelAndView model = new ModelAndView("jsonView",ibUtil.getSearchJSON());

		//JSON 반환 
		return model; 
	}

 

이름 잘 바꿔서 조회 완료

 

Color 값 그대로 들어와서 조회 잘 됨ㅇㅇ

물론 Formula가 아니라서 값 수정 시 색상 변경되는건 따로 js에서 설정해줘야함.

 

 

여기까지 조회 끝났고, 저장까지만 해보자.


저장은 '/empSave.do' 호출하면 되도록 하자.

 

1.IbsheetMapper.xml

[저장] 이라는 것 자체가 추가/수정/삭제를 상태값에 따라 반영하는 것을 한번에 하는 동작이다.

따라서 각각의 동작을 수행할 수 있는 SQL 문을 추가하자.

	<!-- EMP 데이터 저장(추가/수정/삭제) -->
	<insert id="insertEmpList" parameterType="map">
		<![CDATA[
			/** insertEmpList */
			INSERT INTO EMP (
				  EMPNO
				, ENAME
				, JOB
				, MGR
				, HIREDATE
				, SAL
				, COMM
				, DEPTNO
			)
			VALUES (
			  #{empno}
			, #{ename}
			, #{job}
			, #{mgr}
			, #{hiredate}
			, #{sal}
			, #{comm}
			, #{deptno}
			) 
		]]>
	</insert>
	
	<update id="updateEmpList" parameterType="map">
		<![CDATA[
			/** updateEmpList */
			UPDATE EMP
			SET 
				  DEPTNO = #{deptno}
				, COMM = #{comm}
				, HIREDATE = #{hiredate}
				, MGR = #{mgr}
				, SAL = #{sal}
				, JOB = #{job}
				, ENAME = #{ename}
			WHERE 1=1
			AND EMPNO = #{empno}
		]]>
	</update>
	
	<delete id="deleteEmpList" parameterType="map">
		<![CDATA[
			/** deleteEmpList */
			DELETE 
			FROM EMP
			WHERE 1=1
			AND EMPNO = #{empno} 
		]]>
	</delete>

 

2. IbsheetDAO

vo는 그대로니까 건들일 필요 없고, DAO 가서 Mapper를 연결해주자.

저장은 한번에 처리하지만 insert/update/delete는 각각 수행하므로 아래와 같이 따로따로 연결.

    public void insertEmp(Map<String, Object> mp){
        insert("egovframework.mapper.let.ibsheetTemplate.IbsheetMapper.insertEmpList", mp);
    }

    public void updateEmp(Map<String, Object> mp){
        update("egovframework.mapper.let.ibsheetTemplate.IbsheetMapper.updateEmpList", mp);
    }

    public void deleteEmp(Map<String, Object> mp){
        delete("egovframework.mapper.let.ibsheetTemplate.IbsheetMapper.deleteEmpList", mp);
    }

 

3. IbsheetService

Service 가서 인터페이스 설정.

public void saveEmpList(List<?> li) throws Exception;

 

4. IbsheetServiceImpl

ServiceImpl 가서 인터페이스 설정.

    @SuppressWarnings({ "unchecked", "static-access" })
	public void saveEmpList(List<?> li) throws Exception {
		for(int i=0;i<li.size();i++){
			Map<String,Object> record = (Map<String,Object>)li.get(i);

			IBSheetUtil iu = new IBSheetUtil();
			iu.mapPrint(record);
			
			//IBSheet 상태 컬럼의 값에 따른 작업 설정
			switch((record.get("sStatus")+"").charAt(0)){
			case 'I':
				ibsheetDAO.insertEmp(record);
				break;
			case 'U':
				ibsheetDAO.updateEmp(record);
				break;
			case 'D':
				ibsheetDAO.deleteEmp(record);
				break;
			}
		}
	}

상태값에 따라 추가/수정/삭제 되도록 설정해주기.

 

 

5. IbsheetTemplateController

데이터 받으면 json 형태로 변환한 뒤 해당 리스트를 saveEmpList()로 보낸다.

추가로 IO에서 결과값 코드와 Message를 보내면 화면단에 뿌릴 수 있음.

	@SuppressWarnings("rawtypes")
	@RequestMapping(value = "/empSave.do")
	public ModelAndView saveEmp(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		IBSheetUtil ibUtil = new IBSheetUtil();
		
		List<Map> list = ibUtil.getSheetData8(request.getParameter("Data"));
		
		JSONObject result = new JSONObject();
	    JSONObject IO = new JSONObject();
		
		try{
			ibsheetService.saveEmpList(list);
	    	
	         IO.put("Result", 0);
	         IO.put("Message", "성공적으로 저장되었습니다.");
	         result.put("IO", IO);
	         
		}catch(Exception ex){
			IO.put("Result", -10);
	         IO.put("Message", "저장 중 오류가 발생했습니다.");
	         result.put("IO", IO);
		}

		//JSON
		ibUtil.setEtc("mySheet","age", "51");
		ModelAndView model = new ModelAndView("jsonView",result);
		System.out.println("model : "+ model);
		//JSON 반환 
		return model;
	}

 

근데 어라...왜 안되지.... 콘솔에 오류도 없고 하길래 왜 안되나 봤더니...

 

 

조회데이터랑 다르게 저장데이터는 &quot; 와 같이 HTML 엔티티가 포함되어있다.

아무래도 클라이언트에서 json으로 데이터 받을 때 HTML 인코딩 상태로 넘어온 것 같다.

 

이거 디코딩 해주자.

 

<!-- pom.xml에 추가 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version> <!-- 버전은 프로젝트에 맞게 조정 -->
</dependency>

 

이미 commons-lang3는 pom.xml에 있었고...

		String sheetData = request.getParameter("Data");
		String decoded = StringEscapeUtils.unescapeHtml4(sheetData); //HTML 엔티티 디코딩

 

이런식으로 디코딩된 데이터를 넘겨주면 된다.

 

정상저장되고
IO도 잘 넘어오고
페이지 새로고침해도 잘 반영되어 있음

 

여기까지 저장 끝!

 

CRUD를 완료했다.

반응형
LIST