Process

Ini.html 사용자 데이터를 입력 뒤 submit 버튼을 누르면 ajax를 통해 컨트롤러에 데이터 전달 👇
TestController.java key : value 형식의 map타입으로 데이터를 받고 service 레이어에 전달
service 레이어에 전달할 때는 map에 있는 값들을 알맞은 데이터 타입 변수에 넣어서 보내줌
왜냐면 mapper에서 hashmap으로 데이터 받아서 insert 하면 타입 에러남
👇
IniService.java insertIni 메소드 생성
👇
IniServiceImpl.java Initiative(DTO)에 데이터를 넣어줌
IniMapper.xml에 있는 insertIni에 사용자에게 받은 데이터를 갖고 있는 Initiative를 파라미터로 넘겨줌
👇
IniMapper.xml SQL문 실행 DB에 데이터 저장

readForm 함수 (common.js)

function readForm(formId, url){

      $.ajax({
             url : url,
             type : "post",
             dataType :"text",
             data : $(formId).serialize(),
             success : function(result){
                 console.log(result);
             },
             error : function(err){
                 console.log(err+"에러발생");
             }
      });

}

앞으로 작성할 모든 폼 데이터를 컨트롤러로 넘겨주는 함수


ini.html

        $("click").click(function(){
            console.log("click");
            readForm("iniForm","/readForm");
            console.log("readForm 종료");
        })

view에 함수 적용


컨트롤러 test2

    @RequestMapping(value="/readForm", produces="text/html;charset=UTF-8")
    @ResponseBody
    @PostMapping
    public String test2(@RequestParam Map<String, String> param){
        for (String key : param.keySet()) {
            System.out.println(key + " : " + param.get(key));
        }

        return "success";
    }


Map도 key : value 형태니까
syso로 찍어낼 때 key : value로 찍어내기
사실 .get()으로 해도 가능은하다
하지만 요일의 경우 집합 형태로 다수의 요일 데이터를 가져온다
그래서 집합 형태로 Map에서 데이터를 가져오는 keySet을 사용


image

이렇게 view에서 선택했다
폼 제출 뒤 결과는 이렇게 나왔다
image 일단 데이터 받는 것은 잘 되는데
“매일”을 선택하면 어떤 주든 상관 없어야 해서 week 부분이 공란이어야 하는데 이상하다



image 공란인 옵션을 추가하니 원하는대로 작동된다




TestController에 내용 추가

    public String test2(@RequestParam Map<String, String> param) throws ParseException {
        for (String key : param.keySet()) {
            System.out.println(key + " : " + param.get(key));
        }
        // Ob 코드
        String obCodeString = param.get("obCode");
        int obCode = Integer.parseInt(obCodeString);

        //dateListCode??? 이거는 어떻게 추가할지? 매일이면 0123456

        // 달 주 일(iniPeriod)
        String iniPeriodString = param.get("iniDuration");
        int iniPeriod = Integer.parseInt(iniPeriodString);

        // 한 주마다 몇 번씩 진행할 것인지(iniCount)
        int iniCount = 0;
        if(iniPeriod == 2){
            iniCount = 7;
        }

        // iniOrder

        // ini 내용(iniContent)
        String iniContent = param.get("iniContent");

        // iniMonthDate

        // 시작일(iniStartDate)
        String iniStartDateString = param.get("iniStartDate");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
        Date iniStartDate = sdf.parse(iniStartDateString);

        // 종료일(iniEndDate)
        String iniEndDateString = param.get("iniEndDate");
        Date iniEndDate = sdf.parse(iniEndDateString);

        // 전체 기간(iniDuration)
        int iniDuration = 6;

        // 전체 기간 동안 가능한 횟수(iniPossibleCount)
        int iniPossibleCount = 30;

        iniService.insertIni(obCode, iniPeriod, iniCount, iniContent, iniStartDate, iniEndDate);
        return "success";
    }
}

원래는 map으로 데이터를 전달한 뒤 serviceImpl에서 map에 있는 데이터를 각각 꺼내고
dto로 데이터를 보내려 했으나 밤에 serviceImpl에 써야할 코드를 컨트롤러에 적었다..
나중에 수정하면 되고 어쨌든 insert가 되는지 확인하는게 목적이니 그냥 진행

IniService

package com.project.smallbeginjava11.service;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.project.smallbeginjava11.DTO.Initiative;

public interface IniService {
    void insertIni(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) throws ParseException;
}

각각 파라미터 데이터 타입에 맞게 작성해줌
insert니까 리턴해줄 필요 없으니 void로 작성


IniServiceImpl

public class IniServiceImpl implements IniService{

    private final IniMapper iniMapper;

    @Override
    public void insertIni(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) throws ParseException {

        // DTO에 파라미터 값들 넣어주고 DTO를 Mapper로 넘겨주어 insert 실행
        Initiative initiative = new Initiative(obCode, iniPeriod, iniCount, iniContent, iniStartDate, iniEndDate);
        iniMapper.insertIni(initiative);
    }
}


IniMapper.java

public interface IniMapper {
    void insertIni(Initiative initiative);
}


IniMapper.xml

<?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="com.project.smallbeginjava11.mapper.IniMapper">

    <insert id="insertIni" parameterType="Initiative">
        INSERT INTO initiative values(
            100, #{obCode}, 100, 100, #{iniPeriod}, #{iniCount}, null, #{iniContent}, null, #{iniStartDate}, #{iniEndDate}, 100);
    </insert>

</mapper>

테스트니까 시퀀스, 데이트 계산 등은 나중에 하고
일단 view에서 받은 데이터들은 #{}형태로 해서 저장



실행 결과

image 타입에러가 났다
생각해보니 view에서 obCode를 가져올 때 categoryName(String) 값을 가져온다
obCode에는 int가 들어가야하는데

view 수정

                <option th:each="category: ${category}"
                        th:value="${category.categoryCode}" th:utext="${category.categoryName}">
                </option>



다시 실행
image iniDuration이 아니라 iniPeriod로 받아야하는데 변수 이름이 틀렸음


수정 뒤 다시 실행
image view에서 받은 데이터를 mapper에 가져오지 못함


체크할 사항

  1. DTO에 생성자가 제대로 생겼는지? Yes
  2. 생성자 코드 (this) 있는지?


인텔리제이에서 생성자 자동으로 만들어주고
this.ini = ~~~ 안넣어줌


    public Initiative(int obCode, int iniPeriod, int iniCount, String iniContent, Date iniStartDate, Date iniEndDate) {
        this.obCode = obCode;
        this.iniPeriod = iniPeriod;
        this.iniCount = iniCount;
        this.iniContent = iniContent;
        this.iniStartDate = iniStartDate;
        this.iniEndDate = iniEndDate;
    }

Initiative.java (DTO)에 코드 추가



실행 결과
image insert 완료