안녕하세요. 글쓰는 개발자 입니다.
오늘은 회원가입 등에 사용되는 항목들을 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
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가 중복으로 사용되는 곳이 많다면
일일이 수정해야하는 번거로움도 줄일 수 있습니다.
부족한 글 끝까지 읽어주셔서 감사드리며,
오류 혹은 더 좋은 아이디어가 있으면 댓글로 남겨주세요.
'old > Java' 카테고리의 다른 글
[Java] ajax 으로 Controller에 배열 넘기기 (0) | 2020.02.17 |
---|---|
[Side_Project] 임시저장 기능 모듈 개발_01_계획수립(Java/JavaScript/JSP/DB/MSSql) (0) | 2019.12.11 |