배포용 homepage 만들기(2) - 조회/저장하기
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;
}
근데 어라...왜 안되지.... 콘솔에 오류도 없고 하길래 왜 안되나 봤더니...
조회데이터랑 다르게 저장데이터는 " 와 같이 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 엔티티 디코딩
이런식으로 디코딩된 데이터를 넘겨주면 된다.
여기까지 저장 끝!
CRUD를 완료했다.