[Spring] 임시저장 기능

merci·2023년 3월 11일
0

임시저장

임시저장 기능은 한번도 저장한 적이 없으면 해당 테이블에 새로운 레코드를 추가해서 저장하게 된다.
이후 임시저장 기능을 이용하면 이미 기록한 레코드가 존재하므로 해당 레코드를 update해야 한다.

만약 한 화면에서 해당 버튼을 이용해서 insert / update를 구현하기 위해서는 처음 insert 버튼을 클릭했을때 해당 레코드의 id를 반환받아서 해당 기능의 버튼에 넣어줘야 한다.

먼저 간단하게 insert 하는 상황부터 보자

<button type="button" class="btn btn-success "
  	onclick="saveTemp(`${compSession.compId}`,`${jDto.jobsId}`)">임시저장</button>

saveTemp() 함수는 insert기능을 수행한다.
지금은 ${jDto.jobsId} 의 값이 없으므로 아무런 값도 파라미터에 전달 되지 않는다

	function saveTemp(id, jobs) {
            if (jobs > 0) {
			// id가 있으면 update 비동기 통신
            } else {
			$.ajax({
                    type: "post",
                    url: "/comp/jobs/write",
                    data: JSON.stringify(data),
                    headers: {
                        "content-type": "application/json; charset=utf-8"
                    },
                    dataType: "json"
                }).done((res) => {
                    jobsId = res.data;
                    changeBtn();
                    alert(res.msg);
                }).fail((err) => {
                    alert(err.responseJSON.msg);
                });
     }

해당 요청을 받는 컨트롤러는

    @PostMapping("/comp/jobs/write")
    public ResponseEntity<?> writeJobs(@RequestBody JobsWriteReqDto jDto) {
        Comp compSession = (Comp) session.getAttribute("compSession");
		// 유효성 검사
        Integer jobsId = jobsService.공고작성(jDto, compSession.getCompId());
        return new ResponseEntity<>(new ResponseDto<>(1, "저장 완료", jobsId), HttpStatus.CREATED);
    }

insert 를 수행하는 서비스는

    @Transactional
    public Integer 공고작성(JobsWriteReqDto jDto, Integer compId) {
        Integer jobsId = 0;
		// 권한 검사 
        try {
            jobsRepository.insert(jDto);
            jobsId = jDto.getJobsId();
        } catch (Exception e) {
            throw new CustomApiException("서버에 일시적인 오류가 발생했습니다22.", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return jobsId;
    }

insert를 수행하고 해당 id 를 리턴해줘야 한다.

insert를 수행하는 쿼리는

    <insert id="insert" useGeneratedKeys="true" keyProperty="jDto.jobsId">
      insert into jobs_tb <!-- insert 내용 -->
    </insert>

useGeneratedKeys="true" 옵션을 사용해서 insert된 레코드의 id를 리턴해야 한다.
keyProperty="jDto.jobsId" 는 리턴받을 id를 저장할 위치를 입력해주면 된다.

서비스에서 insert이후 id를 리턴하게 되고 컨트롤러에서 해당 id를 오브젝트에 저장한다.
비동기 통신이 성공하면 해당 id를 전역변수에 저장하고 changeBtn() 함수가 실행된다.

        function changeBtn() {
            $('#jobs-remove').remove();
            renderBtn();
        }

        function renderBtn() {
            let el = `
                    <div class="rButton ms-5 view-right2" id="jobs-remove">
                        <div class="row mb-2">
                            <button type="button" class="btn btn-success" 
							onclick="saveTemp(`+ compId + `,` + jobsId + `)">임시저장</button>
                        </div>
                        <div class="row mb-2">
                            <button type="button" class="btn btn-success" 
							onclick="saveJobs(`+ compId + `,` + jobsId + `)">공고등록</button>
                        </div>
                    </div>
        `;
            $('#jobs-render').append(el);
        }

saveJobs() 함수에 id 가 등록된 버튼을 다시 그린다.
이제 임시저장 버튼을 클릭하면 id가 존재하므로 update 요청을 하면 된다.

        function saveTemp(id, jobs) {
            compId = id;
            let data = {
				// 데이터 가져옴
            };
            if (jobs > 0) {
                $.ajax({
                    type: "put",
                    url: "/comp/jobs/update",
                    data: JSON.stringify(data),
                    headers: {
                        "content-type": "application/json; charset=utf-8"
                    },
                    dataType: "json"
                }).done((res) => {
                    jobsId = res.data;
                    alert(res.msg);
                }).fail((err) => {
                    alert(err.responseJSON.msg);
                });
            } else {
			// insert 하는 비동기 통신
            }
        }
profile
작은것부터

0개의 댓글