Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 옥길그릭요거트
- 옥길동파티룸
- 휴식
- 착한코딩
- 옥길요거트
- 파티룸
- 서울파티룸
- 가장존경하는인물
- 취미
- 일
- 스컬킹
- 옥길동요거트
- mysql
- 그릭요거트
- 구로파티룸
- 보드게임점수계산
- 해외여행
- 부천공간대여
- MBTI
- 스컬킹점수
- 광명파티룸
- 스컬킹점수계산
- 옥길파티룸
- 코딩
- 존경하는위인
- 웹개발
- 개발자
- 부천파티룸
- 스페이스우일
- 보드게임점수
Archives
- Today
- Total
SIMPLE & UNIQUE
2-3강 : 등록 페이지 구현, INSERT쿼리 실행 본문
2_3 목표 : 등록 페이지에 입력한 텍스트를, insert쿼리를 실행해 db에 삽입한다.
cmd 또는 터미널을 열고 react 경로 C:\react200\client에서 아래 명령어로 jquery를 설치해 준다. 등록페이지에서 폼에 입력한 값들을 가공하거나 파라미터로 넘길때 jquery를 사용할 것이다.
//react 경로로 이동
CD C:\react200\client
npm install --save jquery
1. SoftwareView에 아래 소스를 붙여넣는다.
기존에 소스에서 submitClick(저장버튼)을 눌렀을 때, 데이터를 insert 하는 node Api를 호출하는 부분이 추가됐다.
import React, { Component } from 'react';
import {Link} from 'react-router-dom';
import $ from 'jquery';
class SoftwareView extends Component {
constructor(props) {
super(props);
this.state = {
before_swtcode: props.match.params.swtcode,
}
}
componentDidMount () {
if(this.state.before_swtcode == 'register'){
$('.modifyclass').hide()
}else{
$('.saveclass').hide()
}
}
submitClick = async (type, e) => {
this.Swt_toolname_checker = $('#is_Swt_toolname').val();
this.Swt_demo_site_checker = $('#is_Swt_demo_site').val();
this.Giturl_checker = $('#is_Giturl').val();
this.Comments_checker = $('#is_Comments').val();
this.Swt_function_checker = $('#is_Swt_function').val();
this.fnValidate = (e) => {
if(this.Swt_toolname_checker === '') {
$('#is_Swt_toolname').addClass('border_validate_err');
alert('툴 이름을 다시 확인해주세요.')
return false;
}
$('#is_Swt_toolname').removeClass('border_validate_err');
if(this.Swt_demo_site_checker === '') {
$('#is_Swt_demo_site').addClass('border_validate_err');
alert('데모 URL을 다시 확인해주세요.')
return false;
}
$('#is_Swt_demo_site').removeClass('border_validate_err');
if(this.Giturl_checker === '') {
$('#is_Giturl').addClass('border_validate_err');
alert('Github URL을 다시 확인해주세요.')
return false;
}
$('#is_Giturl').removeClass('border_validate_err');
if(this.Comments_checker === '') {
$('#is_Comments').addClass('border_validate_err');
alert('설명을 다시 확인해주세요.')
return false;
}
$('#is_Comments').removeClass('border_validate_err');
if(this.Swt_function_checker === '') {
$('#is_Swt_function').addClass('border_validate_err');
alert('상세기능을 다시 확인해주세요.')
return false;
}
$('#is_Swt_function').removeClass('border_validate_err');
return true;
}
if(this.fnValidate()){
var jsonstr = $("form[name='frm']").serialize();
jsonstr = decodeURIComponent(jsonstr);
var Json_form = JSON.stringify(jsonstr).replace(/\"/gi,'')
Json_form = "{\"" +Json_form.replace(/\&/g,'\",\"').replace(/=/gi,'\":"')+"\"}";
try {
const response = await fetch('/api/Swtool?type='+type, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: Json_form,
});
const body = await response.text();
if(body == "succ"){
if(type == 'save'){
alert('Software Tools 등록이 완료되었습니다.')
}
setTimeout(function() {
this.props.history.push('/SoftwareList');
}.bind(this),1500
);
}else{
alert('작업중 오류가 발생하였습니다.')
}
} catch (error) {
alert('작업중 오류가 발생하였습니다.')
}
}
};
render () {
return (
<section class="sub_wrap">
<article class="s_cnt mp_pro_li ct1">
<div class="li_top">
<h2 class="s_tit1">Software Tools 등록/수정</h2>
</div>
<div class="bo_w re1_wrap re1_wrap_writer">
<form name="frm" id="frm" action="" onsubmit="" method="post" >
<input id="is_Swtcode" type="hidden" name="is_Swtcode" />
<input id="is_Email" type="hidden" name="is_Email" value="guest" />
<input id="is_beforeSwtcode" type="hidden" name="is_beforeSwtcode" value={this.state.before_swtcode} />
<article class="res_w">
<p class="ment" style={{"text-align": "right"}}>
<span class="red">(*)</span>표시는 필수입력사항 입니다.
</p>
<div class="tb_outline">
<table class="table_ty1">
<tr>
<th>
<label for="is_Swt_toolname">툴 이름<span class="red">(*)</span></label>
</th>
<td>
<input type="text" name="is_Swt_toolname" id="is_Swt_toolname" class="" />
</td>
</tr>
<tr>
<th>
<label for="is_Swt_demo_site">데모 URL<span class="red">(*)</span></label>
</th>
<td>
<input type="text" name="is_Swt_demo_site" id="is_Swt_demo_site" class="" />
</td>
</tr>
<tr>
<th>
<label for="is_Giturl">Github URL<span class="red">(*)</span></label>
</th>
<td>
<input type="text" name="is_Giturl" id="is_Giturl" class="" />
</td>
</tr>
<tr>
<th>
<label for="is_Comments">설명<span class="red">(*)</span></label>
</th>
<td>
<textarea name="is_Comments" id="is_Comments" rows="" cols=""></textarea>
</td>
</tr>
<tr class="div_tb_tr fileb">
<th>
메뉴얼 파일 #1
</th>
<td class="fileBox fileBox_w1">
<label for="uploadBtn1" class="btn_file">파일선택</label>
<input type="text" id="manualfile" class="fileName fileName1"
readonly="readonly" placeholder="선택된 파일 없음"/>
<input type="file" id="uploadBtn1" class="uploadBtn uploadBtn1"
onChange={e => this.handleFileInput('manual',e)}/>
<div id="upload_menual">
</div>
</td>
</tr>
<tr>
<th>
메인 이미지
</th>
<td className="fileBox fileBox1">
<label htmlFor='imageSelect' className="btn_file">파일선택</label>
<input type="text" id="imagefile" className="fileName fileName1"
readOnly="readonly" placeholder="선택된 파일 없음"/>
<input type="file" id="imageSelect" className="uploadBtn uploadBtn1"
onChange={e => this.handleFileInput('file',e)}/>
<div id="upload_img">
</div>
</td>
</tr>
<tr>
<th>
라벨 이미지
</th>
<td className="fileBox fileBox2">
<label htmlFor='imageSelect2' className="btn_file">파일선택</label>
<input type="text" id="imagefile2" className="fileName fileName1"
readOnly="readonly" placeholder="선택된 파일 없음"/>
<input type="file" id="imageSelect2" className="uploadBtn uploadBtn1"
onChange={e => this.handleFileInput('file2',e)}/>
<div id="upload_img2">
</div>
</td>
</tr>
<tr>
<th>
<label for="is_Swt_function">상세 기능<span class="red">(*)</span></label>
</th>
<td>
<textarea name="is_Swt_function" id="is_Swt_function" rows="" cols=""></textarea>
</td>
</tr>
</table>
<div class="btn_confirm mt20" style={{"margin-bottom": "44px"}}>
<Link to={'/SoftwareList'} className="bt_ty bt_ty1 cancel_ty1">취소</Link>
<a href="javascript:" className="bt_ty bt_ty2 submit_ty1 saveclass"
onClick={(e) => this.submitClick('save', e)}>저장</a>
<a href="javascript:" className="bt_ty bt_ty2 submit_ty1 modifyclass"
onClick={(e) => this.submitClick('modify', e)}>수정</a>
</div>
</div>
</article>
</form>
</div>
</article>
</section>
);
}
}
export default SoftwareView;
2. SwtoolRout.js에 아래와 같이 insert 쿼리를 호출하는 mapper명을 작성한다.
var express = require('express');
var router = express.Router();
const bodyParser = require('body-parser');
router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: true }));
router.post('/', (req, res, next) => {
var m_typ = req.query.type;
if(m_typ == 'list'){
//Swtool 리스트 조회
try {
// Mysql Api 모듈(CRUD)
var dbconnect_Module = require('./dbconnect_Module');
//Mysql 쿼리 호출정보 입력
req.body.mapper = 'SwToolsMapper';//mybatis xml 파일명
req.body.crud = 'select';//select, insert, update, delete 중에 입력
req.body.mapper_id = 'selectSwToolsList';
router.use('/', dbconnect_Module);
next('route')
} catch (error) {
console.log("Module > dbconnect error : "+ error);
}
}else if(m_typ == 'save'){
//Swtool 관리자 저장
try {
// Mysql Api 모듈(CRUD)
var dbconnect_Module = require('./dbconnect_Module');
//Mysql 쿼리 호출정보 입력
req.body.mapper = 'SwToolsMapper';//mybatis xml 파일명
req.body.crud = 'insert';//select, insert, update, delete 중에 입력
req.body.mapper_id = 'insertSwToolsInfo';
router.use('/', dbconnect_Module);
next('route')
} catch (error) {
console.log("Module > dbconnect error : "+ error);
}
}
});
module.exports = router;
3. SwToolsMapper.xml 소스에 insert 쿼리를 추가한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="SwToolsMapper">
<select id="selectSwToolsList">
SELECT
swt_code
, swt_toolname
, swt_function
, swt_imagepath
, swt_big_imgpath
, swt_comments
, swt_demo_site
, swt_manual_path
, swt_github_url
, reg_date
FROM rtrod.rtrod_swtool
ORDER BY update_date DESC
<if test="startRow != null && startRow != ''">
limit ${startRow}, ${endRow}
</if>
</select>
<insert id="insertSwToolsInfo">
INSERT INTO rtrod.rtrod_swtool
(
swt_code
, swt_toolname
, swt_function
, swt_comments
, swt_demo_site
, swt_github_url
<if test="is_LabelImg != null && is_LabelImg != ''">
, swt_imagepath
</if>
<if test="is_MainImg != null && is_MainImg != ''">
, swt_big_imgpath
</if>
<if test="is_MenualName != null && is_MenualName != ''">
, swt_manual_path
</if>
, reg_date
, reg_user
, update_date
, update_user
)
VALUES (
#{is_Swtcode}
, #{is_Swt_toolname}
, #{is_Swt_function}
, #{is_Comments}
, #{is_Swt_demo_site}
, #{is_Giturl}
<if test="is_LabelImg != null && is_LabelImg != ''">
, #{is_LabelImg}
</if>
<if test="is_MainImg != null && is_MainImg != ''">
, #{is_MainImg}
</if>
<if test="is_MenualName != null && is_MenualName != ''">
, #{is_MenualName}
</if>
, DATE_FORMAT(now(), '%Y%m%d%H%i%s')
, #{is_Email}
, DATE_FORMAT(now(), '%Y%m%d%H%i%s')
, #{is_Email}
)
</insert>
</mapper>
소스 저장 후, 등록페이지에서 컬럼 값들을 등록하고 저장버튼을 누른다.
완료 alert 창의 '확인' 버튼을 누르면, 리스트 페이지로 이동한다.
등록한 데이터가 정상적으로 insert 된 것을 확인할 수 있다.
cmd 나 터미널에서 수행된 insert 쿼리를 확인할 수 있다.
https://taling.me/Talent/Detail/19341
강의 문의 : ljung5@naver.com
'탈잉 강의 자료 > 2020_비전공자도 가능한 웹 프로젝트' 카테고리의 다른 글
2-5강 : 수정 페이지 구현, UPDATE쿼리 실행 (0) | 2020.08.02 |
---|---|
2-4강 : 파일, 이미지 업로드 구현 (0) | 2020.08.01 |
2-2강 : AWS RDS 서버 기타 설정 (0) | 2020.08.01 |
2-1강 : AWS 회원 가입, RDS 인스턴스 생성, DB 서버 연결 (0) | 2020.08.01 |
1-4강 : AWS DB서버 연결, 데이터 조회해 리스트 페이지에 노출 (0) | 2020.08.01 |
Comments