old/Java

[DB/JAVA/JSP] STUFF문을 활용한 Key-Value형태 Data전송

뒷골목프로그래머 2020. 1. 24. 12:38
반응형

안녕하세요. 글쓰는 개발자 입니다.

오늘은 회원가입 등에 사용되는 항목들을 MetaData로 DB에서 관리하고

그것을 View단(jsp)에 뿌려주는 방법을 설명하고자 합니다.

 

업무로 회원의 프로필 작성을 맡았는데 항목이 총 31가지 였고,

각각 직접입력, radioButton, checkBox등이 있는데 일일이 text로 입력하는 것이 아니라

DB에서 그 항목들을 불러오는 방식을 취했습니다.

이유는 항목값이 변경 또는 추가 되었을 때 DB값만 변경하면 되기 때문입니다.

그리하여, 제가 어떤 방식으로 구현했는지 설명드리겠습니다.

 

1. DB

1) MetaDataTable

   성별선택을 예로들면, 성별을 부모키, 남자, 여자, 상관없음을 자식키 형태로 만듭니다.

   domain_key는 data각각을 나타내는 고유한 이름을 나타내고, parent_key를 부여함으로서 성별이라는 카테고리 안에 포함되어 있음을 표현했습니다.

2) Query 실행

   STUFF 함수를 활용해서 parent_key별로 domain_key와 domain_value를 추출해 보았습니다.

* 참고 MS SQL STUFF문 활용 https://backstreet-programmer.tistory.com/32?category=796692

 

[SQL]MS SQL STUFF/SQL Map/SQL List출력

안녕하세요. 글쓰는 개발자 입니다. 오늘은 STUFF 함수를 설명하고자 합니다. 업무를 하면서, Category형태로 하위항목이 2depth, 3depth씩 있을 때 부모 Depth를 Key, 그에 해당하는 자식Depth 내용을 List형태로..

backstreet-programmer.tistory.com

 

SELECT DISTINCT parent_key, FIELD_NM, FIELD_ID
FROM
      (SELECT  parent_key,
            (STUFF((SELECT ',' + domain_value
                  FROM METADATAEXAMPLE 
                  WHERE parent_key = X.parent_key
                  ORDER BY parent_key
                  FOR XML PATH('')
                 ), 1, 1, '')) FIELD_NM,
            (STUFF((SELECT ',' + domain_key
                  FROM METADATAEXAMPLE 
                  WHERE parent_key = X.parent_key
                  ORDER BY parent_key
                  FOR XML PATH('')
                 ), 1, 1, '')) FIELD_ID
      FROM METADATAEXAMPLE  X
      WHERE   parent_key IN ('key0001')
      GROUP BY parent_key ) Y;

 

 

2. Java Controller

저는 업무에 전자정부 표준 프레임워크를 사용합니다.

Java단은 Mybatis를 활용해 Controller - Service - Mapper로 이어지는데요

Mapper에서 위 쿼리문을 실행하면 나오는 결과를 View(jsp)에 HashMap형태

뿌려주기 위해 Controller단에서 작업을 진행했습니다.(Service단에서 진행해도 무방함)

List<ResultMap> metaList = service.getMetaDataList(); // Query수행결과 호출
Map<String, String> hashMap = new HashMap<>(); // HashMap 생성

for (ResultMap resultMap : metaList) {

  String parentKey = resultMap.getString("parentKey") //부모키 추출
  String fieldNm = resultMap.getString("fieldNm") //자식키 값 추출
  hashMap.put(parentKey, fieldNm); //Key - Value 삽입

}

model.addAttribute("metaList", hashMap); // View(jsp)로 key / Value 뿌려줌.

 

3. View (JSP)

   HashMap형태로 View(JSP)에 뿌려주면, jstl형태로 값을 받았습니다.

본 포스팅에서는 성별, 한가지만 예시로 들었지만 실제 업무에서는 31가지 항목이었기 때문에 forEach를 활용했습니다.

<c:forEach var="metadataList" items="${metadataList.key0001}" varStatus="status">

    <input type="radio" id="${status}" name="key0001" value="<c:out value='${metadataList}'/>">
    <label for = "${status}"><c:out value='${metadataList}'/></label>

</c:forEach>

 

이런식으로 View(JSP)단에 뿌려지는 값을 출력하면,

코드의 길이도 줄일 수 있고, 다양한 페이지에 metaData가 중복으로 사용되는 곳이 많다면

일일이 수정해야하는 번거로움도 줄일 수 있습니다.

 

부족한 글 끝까지 읽어주셔서 감사드리며,

오류 혹은 더 좋은 아이디어가 있으면 댓글로 남겨주세요.

반응형