๐Ÿฆ… ์ธํ„ด 1์ฐจ ๋ฏธ์…˜ - ํšŒ์‚ฌ ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ ๊ฒŒ์‹œํŒ๋งŒ๋“ค๊ธฐ (add. Map VS Dto)

2
post-thumbnail
  • ๐Ÿง _๊ตญ๋น„ํ•™์›์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ ๊ฒŒ์‹œํŒ๋ณด๋‹ค ํ•œ 10๋ฐฐ๋Š” ์–ด๋ ค์› ๋‹ค. ์ผ๋‹จ ํšŒ์‚ฌ ์†”๋ฃจ์…˜ ์•ˆ์—์žˆ๋Š” SRC ๋Œ€๋ถ€๋ถ„์ด ๊ฐ๊ฐ์˜ Entity, common files, jQuery(JSP-JS๋ถ„๋ฆฌ), ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ํ˜•ํƒœ๋ฅผ Map์œผ๋กœ (DTO X), ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ถ€ํ„ฐ CentOS ๋“ฑ ํ™˜๊ฒฝ์„ธํŒ…๊นŒ์ง€ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์› ๋‹ค.
    ์†”๋ฃจ์…˜ ํ™ˆํŽ˜์ด์ง€ ๋ฉ”๋‰ด ๋งŒ๋“ค๊ธฐ (DB ๊ถŒํ•œ์„ค์ •) - DB ์„ค๊ณ„ - DB SQL TEST - MABATIS - DAO - SVC - CONTROLLER - JSP - JS ์ˆœ์œผ๋กœ ๊ตฌ์ถ•ํ•œ ํ›„, SELECT - INSERT - SEARCH - CONTENT - DELETE - UPDATE๋กœ ๊ธฐ๋Šฅ๊ตฌํ˜„ ๋˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค.

๋‚ด๊ฐ€ ์ƒ๊ฐํ•œ ํšŒ์‚ฌ Framework ๊ธฐ๋ฐ˜ MVC Process

Url -> Controller (Mapping) -> .html (jsp) - js (loading) - requireData Controller - SVC (์ƒ๋žต๊ฐ€๋Šฅ) -> DAO -> (Mybatis).xml -> DAO -> SVC -> Controller -> ๊ฐ’ ๋ฆฌํ„ด JSP - JS

Controller

@RequestMapping(value = "boards_list.json")
	public @ResponseBody GridResultEntity getList(HttpSession session, @RequestParam Map<String,Object> map) {
		BoardsDAO dao = sqlSession.getMapper(BoardsDAO.class);
		
		int listCount = dao.selectBoardsListCount(map);
		
		List<Map<String, Object>> list = Collections.emptyList();
		if (listCount > 0) {
			list = dao.selectBoardsList(PagingUtil.convertParam(map));
			
		}
		System.out.println("list : " + list);
		return new GridResultEntity(listCount, list);
	}

SELECT

<select id="selectBoardsList" resultType="map">
		SELECT
			boards_id, 
			boards_subject,
			boards_content,
			boards_writer,
			boards_email,
			boards_rdate
		FROM 
			BOARDS
		<where>
			<if test="s_boards_subject != null and s_boards_subject != ''">
			AND boards_subject LIKE CONCAT('%',#{s_boards_subject},'%')
			</if>
			<if test="s_boards_writer != null and s_boards_writer != ''">
			AND boards_writer LIKE CONCAT('%',#{s_boards_writer},'%')
			</if>
		</where>
		ORDER BY boards_id
		<choose>
			<when test="recordstartindex==null">
				LIMIT 0, 10
			</when>
			<otherwise>
				LIMIT #{recordstartindex}, #{pagesize}
			</otherwise>
		</choose>
	</select>

JSONํ˜•์‹์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š”๋ฐ, mybatis mapper.xml ์—์„œ boards_id๋ฅผ select ์•ˆํ–ˆ๋‹ค๊ฐ€ ํ•˜๋ฃจ๋ฅผ ๋‚ ๋ ค๋ฒ„๋ ธ๋‹ค. ๊ฒจ์šฐ ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋„๊ตฌ Network ์—์„œ Null์„ ์ฐพ์•„ ์ˆ˜์ •ํ–ˆ๋‹ค. undefined๊ฐ€ ๊ณ„์†๋‚˜์™€์„œ ๊ทธ๊ฒƒ๋งŒ ๋ฐ”๋ณด๊ฐ™์ด ๊ฒ€์ƒ‰ํ–ˆ๋‹ค. ์ข‹์€ ์‚ฝ์งˆ ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ž˜ ๋ณด์ž๋Š” ๊ตํ›ˆ์„ ์–ป์—ˆ๋‹ค.

boards_list.js

'use strict';

_SL.nmspc("user").list = function() {

	var mCfg = {
		urlList : gCONTEXT_PATH + 'boards/boards_list.json',
		urlForm : gCONTEXT_PATH + 'boards/boards_form.html',
		formId : '#searchUserList',
		gridId : '#gridUserList'
	},

	m$ = {
		form : $(mCfg.formId),
		grid : $(mCfg.gridId)
	},

	ctrlCookie = new slui.cookies(),

	init = function() {
		ctrlCookie.init(mCfg.gridId);

		var $btnAdd = m$.grid.parent().siblings('.grid-bottom')
				.find('.btn-add');

		// ์ดˆ๊ธฐ ํ™”๋ฉด ๊ตฌ์„ฑ
		drawGrid(m$.grid);
        ...

boards_form.js

_SL.nmspc("user").form = function(){

	var
	// Config ์ •์˜
	mCfg = {
		formId : '#formComuser',
		urlSelect : gCONTEXT_PATH + "boards/boards.json",
		urlExist : gCONTEXT_PATH + "boards/boards_exist.json",
		urlDelete : gCONTEXT_PATH + "boards/boards_delete.do",
/*		urlFileUpload : gCONTEXT_PATH + "system/comuser_file_upload.do",
		urlPasswdExist : gCONTEXT_PATH + 'main/comuser_passwd_inform.json',*/
		add : {
			action : gCONTEXT_PATH + "boards/boards_insert.do",
			message : _SL.getMessage("CNF.COM.0006"),
			passwdValid : _SL.getMessage("FLD.COM.0152")+",required,password" 
		},
		update : {
			action : gCONTEXT_PATH + "boards/boards_update.do",
			message : _SL.getMessage("CNF.COM.0002"),
			passwdValid : _SL.getMessage("FLD.COM.0152")+",password" 
		}
	},
	
	// JQuery ๊ฐ์ฒด ๋ณ€์ˆ˜
	m$ = {
		form : $(mCfg.formId),
		userId      : $(mCfg.formId + ' [name=boards_id]'),
        ...

Validation

<input type=text name.. data-valid="<spring:message code="FLD.COM.0148"/>,required,alphanum"></td>
<spring:message code="FLD.COM.0148"/>

์œ„ spring:message๋Š” ๋‹ค๊ตญ์–ด๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ data-valid(key) = (value)๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด, JS์ชฝ์—์„œ if (!_SL.validate()) return; ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

Map VS Vo/Dto?
DB ๋ฐ์ดํ„ฐ๋ฅผ Map์— ๋‹ด์„์ง€, ์ˆœ์ˆ˜ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์†์„ฑ๊ณผ ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ธฐ์œ„ํ•œ getter, setter๋ฅผ ๋งŒ๋“ค์ง€์ด๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ๋Š” Map์ด ๋”ํŽธํ•˜๋‹ค๋Š” ์˜๊ฒฌ์ด๋งŽ๋‹ค. ํ…Œ์ด๋ธ” ์„ค๊ณ„๊ฐ€ ๋ณ€๋™๋˜์–ด๋„ VO ์ˆ˜์ •์—†์ด ๋ฐ”๋กœ ๋ฐ˜์˜๋˜์–ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ด๋ ค์˜จ๋‹ค. ๋‹ค๋งŒ ์ปฌ๋Ÿผ๋ช…๊ณผ Map์— ๋‹ด๊ธฐ๋Š” key์˜ ์ด๋ฆ„์€ ๋™์ผํ•ด์•ผํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ๋‹จ์ ์€ ๋‹ค๋ฅธ์‚ฌ๋žŒ์ด ๋ณผ ๋•Œ ๋” ์–ด๋ ค์šธ ์ˆ˜๋ฐ–์—์—†๊ณ , ์˜ค๋ฅ˜๋ฅผ ์ฐพ๊ธฐ๋„ ํž˜๋“ค๋‹ค.
DTO๋Š” ๋กœ์ง์•ˆ์—์„œ ๋กœ์ง ๋ณ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” data set์„ ์‰ฝ๊ฒŒ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๊ณ  ์˜์—ญ์ด๋‚˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ๋‹จ์ ์€ ์ผ์ผ์ด ์ปฌ๋Ÿผ ํ•˜๋‚˜ํ•˜๋‚˜ get,setํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

๋Œ€๋ฆฌ๋‹˜, ์ €ํฌ ํšŒ์‚ฌ๋Š” ์™œ DTO ๋ง๊ณ , MAP์„ ์‚ฌ์šฉํ• ๊นŒ์š” ?
TABLE๋งŒ ์ˆ˜๋ฐฑ๊ฐœ, ์ปฌ๋Ÿผ๊นŒ์ง€ ์ˆ˜์ฒœ๊ฐœ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ํ•  ๋•Œ, ์ถ”๊ฐ€/์‚ญ์ œ/์ˆ˜์ • ๋“ฑ ๋ณ€๊ฒฝํ•ด์ฃผ๊ธฐ๊ฐ€ ๋‚œ์ฒ˜ํ•˜๋‹ค. ๋˜ํ•œ ๋ณ€์ˆ˜๋ฅผ ํ•œ๊ฐœํ•œ๊ฐœ get,set์ž‘์—…ํ•ด์ฃผ๋Š” ์ผ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹ค์Œ ๋ฏธ์…˜์€ ์นด์นด์˜คํ†ก ์—ฐ๋™ ์•Œ๋ฆผํ†ก API / ๋ผ์ธ ์•Œ๋ฆผํ†ก API ๊ธฐ๋Šฅ๊ตฌํ˜„์ด๋‹ค.
๋‚ด ์Šค์Šค๋กœ์—๊ฒŒ ํ™”์ดํŒ… ๐Ÿฆ…

Json format converter https://jsonformatter.org/

์ถ”๊ฐ€ Mybatis
namespace : ์ด๋ฆ„ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

profile
แด…แด‡ฬแด แด‡สŸแดแด˜แด˜แด‡แดœส€. แด˜ส€แดษขส€แด€แดแดแด€แด›ษชแดษด ๐Ÿ”ฅ

4๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 5์›” 13์ผ

...๋Œ€๋‹จํ•ด

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 5์›” 13์ผ

๋Œ€๋‹จํ•ด,,,,

1๊ฐœ์˜ ๋‹ต๊ธ€