본문 바로가기
카테고리 없음

JSP API 만들기 / JAVA List 데이터 원하는 JSON 포맷으로 변환하기 / JAVA JSON API 만드는 방법

by 나비와꽃기린 2019. 10. 4.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

한 고객사의 사용자들의 pc정보를 JSON으로 응답해주는 JSP API로 만들어줘야 할 일이 있었다.

이 과정에서 JSP API를 만드는 법을 테스트 소스로 정리해본다.

간단한 순서를 정리해보자면 다음과 같다.

 

(1) JSP 생성

(2) Service -> dao -> xml(DB) 데이터 조회

(3) 얻어온 LIST DATA들을 원하는 포맷 JSON 으로 변환

(4) Response에 셋팅

(5) JSP 호출하여 JSON RESPONSE DATA가 잘 오는지 확인

 

 

 

1. JSON 포맷 정의

일단, 다음과 같이 내려주기로 JSON 포맷을 정의했다.

JSON은 4Depth.

고객사정보와 , 사용자 그룹별로 사용자들의 PC정보를 그룹핑해서 주도록.

 

어떻게 JSON DATA를 설계하면 좋을지 고민하다가 그냥 간단하게 1Depth로 사용자pc정보를 내려줘도 되지만

그렇게 되면 특정 그룹별로 사용자를 모아 보기 힘들고

받는 고객사에서 data를 가공해 사용해야 할 것 같아서

아래와 같이 서버쪽에서 가공해서 내려주게 서비스하기로 했다.

 

 

2. 쿼리 작성

조회해 온 Data는 다음과 같았다고 가정한다.

DB 조회 툴 결과값-.

 

List

partnerCustInfo = testDao.getPartnerCustInfo(params);  결과값

 

List groupUserPcList = testDao.getUserPcInfo(params); 결과값

3. JSP 생성

 

JSP에서 하는 역할은 Controller처럼 service호출하는 것.

(사실 테스트소스엔 인증부분은 구현이 아직 안 되었다)

service 호출 전, 인증처리를 해서 처리해야 함.


<%@ page contentType = "text/html;charset=utf-8"%>
<%@page import="java.sql.*,java.util.*, java.io.*"%>
<%@page import="com.service.TestService"%>
<%

       try {
           
            TestService testService= new TestService ();
            Map params = new HashMap();
            testService.getUserPcInfo(request, response, params);

        }catch(Exception e){
            logger.error(e.getStackTrace()[0].getClassName() + "." + e.getStackTrace()[0].getMethodName(), e);
        }
%>
	

 

4. Service 생성

 

-사용자정보 셋팅 후, 그룹 SEQ 달라질 때 사용자정보 셋팅 & 그룹정보 생성

-위에 DATA 조회된 결과로 설명을 해보자면

개발팀_1에 속하는 사용자들의 JSON DATA를 다 만들고나서, 개발팀_2 DATA를 시작할 때

그룹SEQ가 달라졌으니 만들어둔 사용자정보를 개발팀_1 DATA에 셋팅하여

개발팀_1 정보를 최초로 생성하고, 사용자정보는 초기화 시켜준 다음

그 다음 개발팀_2에 대한 사용자정보를 또 쌓기 시작한다.

그리고 개발팀_3이 시작할때(그룹SEQ달라짐) 개발팀_2의 사용자정보를 셋팅 후,

개발팀_2 그룹정보를 생성하 사용자정보를 또 초기화.

그리고 개발팀_3 사용자정보 셋팅... (반복)

 

--> 이렇게 하면 맨 마지막에 쌓은 그룹의 사용자정보는 셋팅만 하고

그룹정보를 생성하여 담을 수 없어서

마지막 그룹정보를 생성하는 별도의 로직을 추가해줬다.

	public void getUserPcInfo(HttpServletRequest req, HttpServletResponse res , Map params) throws SQLException, IOException {

		testDao = new testDao();
		params.put("cust_seq", "52343728"); //히스토리 DATA가 있던 CUST_SEQ //한국산업보호협회: 51144260 //52343728

		//고객사 정보 셋팅
		List<Map> partnerCustInfo = testDao.getPartnerCustInfo(params);
		Map result = new HashMap();
		result.put("cust_nm", partnerCustInfo.get(0).get("CUST_NM") );
		result.put("send_date", partnerCustInfo.get(0).get("SEND_DATE") );
		result.put("description", partnerCustInfo.get(0).get("DESCRIPTION") );

		//고객사 사용자들의 PC 메타정보 조회
		List<Map> groupUserPcList = testDao.getUserPcInfo(params);
		if(groupUserPcList.size() < 1 || groupUserPcList == null){ return; }


		//고객사 사용자 PC JSON 생성 시작
		List<Map> groupList = new ArrayList<>(); //group 최종데이터
		List userResult = new ArrayList<>(); //group별 user 최종데이터
		String tmp_grp_seq = "";
		String grp_seq = "";
		String tmp_emp_seq = "";
		String emp_seq = "";

		// 사용자정보 -> 그룹정보
		for(int i=0; i< groupUserPcList.size(); i++){

			grp_seq = (groupUserPcList.get(i).get("GRP_SEQ")).toString();
			emp_seq = (groupUserPcList.get(i).get("EMP_SEQ")).toString();

			//그룹별 사용자 정보셋팅이 끝나면 마지막에 그룹정보 생성.
			if( !tmp_grp_seq.equals(grp_seq) && i >0){

				Map groupInfo = new HashMap();
				groupInfo.put("group_nm", groupUserPcList.get(i-1).get("GRP_NM") );
				groupInfo.put("group_seq", groupUserPcList.get(i-1).get("GRP_SEQ") );
				groupInfo.put("group_userList", userResult );
				groupList.add(groupInfo);

				//user정보 초기화
				userResult = new ArrayList<>();
			}

			if( !tmp_emp_seq.equals(emp_seq) ){

					Map userInfo = new HashMap();
					userInfo.put("emp_nm", groupUserPcList.get(i).get("EMP_NM"));
					userInfo.put("emp_seq", groupUserPcList.get(i).get("EMP_SEQ"));

					Map userPcInfo = new HashMap();
					userPcInfo.put("pc_name", groupUserPcList.get(i).get("PC_NAME"));
					userPcInfo.put("pc_seq", groupUserPcList.get(i).get("PC_SEQ"));
					userPcInfo.put("pc_ip", groupUserPcList.get(i).get("PC_IP") );
					userPcInfo.put("reg_date", groupUserPcList.get(i).get("REG_DATE") );
					userPcInfo.put("detect_date", groupUserPcList.get(i).get("DETECT_DATE") );

					List userPcList = new ArrayList<>();
					userPcList.add(userPcInfo);
					//List셋팅

					userInfo.put("pcList", userPcList );
					userResult.add(userInfo);

			}else{ //이전 데이터와 동일한 emp_seq를 가진 Data가 들어왔을 때 pc정보만 추가

					Map userPcInfo2 = new HashMap();
					userPcInfo2.put("pc_name", groupUserPcList.get(i).get("PC_NAME") );
					userPcInfo2.put("pc_seq", groupUserPcList.get(i).get("PC_SEQ") );
					userPcInfo2.put("pc_ip", groupUserPcList.get(i).get("PC_IP") );
					userPcInfo2.put("reg_date", groupUserPcList.get(i).get("REG_DATE") );
					userPcInfo2.put("detect_date", groupUserPcList.get(i).get("DETECT_DATE") );

				    for(int j=0; j<userResult.size(); j++){
						Map tmpMap = (Map) userResult.get(j);

						if(emp_seq.equals(tmpMap.get("emp_seq").toString())) {
							List tmpList = new ArrayList<>();
							tmpList = (List)tmpMap.get("pcList");
							tmpList.add(userPcInfo2);
						}
					}

			}

			tmp_emp_seq = emp_seq;
			tmp_grp_seq = grp_seq;

			//마지막 그룹정보 생성
			if( groupUserPcList.size() == i+1){

				Map groupInfo = new HashMap();
				groupInfo.put("group_nm", groupUserPcList.get(i).get("GRP_NM") );
				groupInfo.put("group_seq", groupUserPcList.get(i).get("GRP_SEQ") );
				groupInfo.put("group_userList", userResult );
				groupList.add(groupInfo);

			}

		} //end of for

		result.put("groupList", groupList );

		//convert map to json
		ObjectMapper mapper = new ObjectMapper();
		String  groupJsonData="";
		try {
			groupJsonData = mapper.writeValueAsString(result);
		}catch (JsonMappingException e) {
			e.printStackTrace();
		}

		// flush it in the response
		res.setHeader("Cache-Control", "no-cache");
		res.setHeader("Pragma", "no-cache");
		res.setDateHeader("Expires", 0);
		res.setContentType("application/json");
		PrintWriter out = res.getWriter();
		out.print(groupJsonData);

	}

	

 

마지막엔 List 데이터를 Json으로 변환시키기 위해 jackson library를 사용했다.

그리고 json으로 내려주기 위해 response에 contentType을 json으로 지정.

 

 

5.  DAO 생성


public List<Map> getPartnerCustInfo(Map params) throws SQLException {
	return sqlMap.queryForList("user_info.getPartnerCustInfo", params);
}

public List<Map> getUserPcInfo(Map params) throws SQLException {
	return sqlMap.queryForList("user_info.getUserPcInfo", params);
}
	

 

6. 쿼리작성



<select id="user_info.getPartnerCustInfo" resultClass="java.util.HashMap" parameterClass="map">
	쿼리작성!
</select>

<select id="user_info.getUserPcInfo" resultClass="java.util.HashMap" parameterClass="map">
	쿼리작성!
</select>
	

 

 

6. 결과확인

 

나는 JSP 로 만들었지만 .do(Contoller)로 요청하는거로 바꿔도 상관X

다음과 같이 JSP 호출 시 Response에 JSON이 떨어짐을 확인 (!)