항해99 7기/TIL(Today I Learned)

항해99 7기 17일차 TIL[PUT과 PATCH, MySQL 사용]

고을마을 2022. 5. 26. 00:56

2022년 5월 25일. 항해 17일차.

주특기 입문 커리큘럼대로 개인과제에 몰두한 날.

 


어제 controller, domain, service를 마무리하고 오늘은 html을 만들어봤다.

 

본격적으로 TIL을 작성하기에 앞서서 PUT과 PATCH의 차이를 살펴보자!

PUT은 데이터의 전체 교체에 쓰인다. 일부만 교체 할려고 할 시 나머지에 null이나 초기값이 된다

PATCH는 데이터의 부분 교체이다.

 

{ "title": "앱개발 종합반", "tutor": "김건희" }

 

 

오늘은 이 PUT과 PATCH로 인해서 엄청나게 곤욕을 치른 날이다. 

function submitEdit(id) {
    // 1. 작성 대상 메모의 username과 contents, password 를 확인합니다.
    let contents = $(`#${id}-textarea`).val().trim();
    let password = $(`#${id}-password`).val();
    // 2. 작성한 메모가 올바른지 isValidContents 함수를 통해 확인합니다.
    if (isValidContents(contents) == false) {
        return;
    }
    // 3. 전달할 data JSON으로 만듭니다.
    let data = {'contents': contents, 'password' : password};
    // 4. PUT /api/memos/{id} 에 data를 전달합니다.
    $.ajax({
        type: "PUT",
        url: `/api/memos/${id}`,
        data: JSON.stringify(data),
        contentType: 'application/json',
        success: function (response) {
            alert('메시지 변경에 성공하였습니다.');
            location.href = 'index.html';
        }
    })
}

 

contents, password만 넘기는데 ajax 타입을 PUT으로 해뒀다.

실행시켜보면 당연히 오류발생... 

PUT 타입으로 해주니 title, username이 null로 바뀌게 되면서 Exception이 떴던 것...

PATCH로 바꿔보니 정상 작동이 됐다! 하루종일 이걸로 곤욕을 치른 날이다... 아휴.

 

 

몽고디비와 같이 데이터베이스에 어떠한 정보가 들어갔는지 확인하기 위해 mysql을 인텔리제이에 연동시켜봤다.

 

이제 어떠한 정보가 데이터베이스에 저장됐는지 한 눈에 볼 수 있게 됐다. 

데이터베이스, 테이블, 데이터를 잘 그려지지 않았었는데 이젠 걱정을 덜게 됐다.


내일은 주특기입문 마지막 날이다.

과제를 제출해야하고 제대로 이해하지 못했던 강의도 들어봐야한다.

 

package com.sparta.springBasic.controller;

import com.sparta.springBasic.domain.Memo;
import com.sparta.springBasic.domain.MemoRepository;
import com.sparta.springBasic.domain.MemoRequestDto;
import com.sparta.springBasic.service.MemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RequiredArgsConstructor
@RestController
public class MemoController {

    private final MemoRepository memoRepository;
    private final MemoService memoService;

    // 게시판 글 생성
    @PostMapping("/api/memos")
    public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
        Memo memo = new Memo(requestDto);
        return memoRepository.save(memo);
    }

    // 게시판 전체 조회
    @GetMapping("/api/memos")
    public List<Memo> getMemos() {
        return memoRepository.findAllByOrderByCreatedAtDesc();
    }


    // 게시판 특정 조회
    @GetMapping("/api/memos/{id}")
    public Memo getMemos(@PathVariable Long id) {
        Memo memo =  memoRepository.findById(id).orElseThrow(
                ()->new IllegalArgumentException("아이디가 존재하지 않습니다."));
        return memo;
    }

    // 게시판 특정 글 수정
//    @PutMapping("/api/memos/{id}")
//    public String updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
//        Optional<Memo>  memo = memoRepository.findById(id);
//        if(memo.getPassword().equals(requestDto.getPassword())){
//            memoService.update(id, requestDto);
//            return "수정 완료";
//        }
//        return "비밀번호 불일치";
//    }

    // 게시판 특정 글 수정
    @PutMapping("/api/memos/{id}")
    public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
        Memo memo = memoRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
        );
        if(memo.getPassword().equals(requestDto.getPassword())){
            memoService.update(id, requestDto);
        }
        return id;
    }

    // 게시판 특정 글 삭제
    @DeleteMapping("/api/memos/{id}")
    public String deleteMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
        Optional<Memo>  memo = memoRepository.findById(id);
        if(memo.get().getPassword().equals(requestDto.getPassword())){
            memoRepository.deleteById(id);
            return "삭제 성공";
        }
        return "비밀번호 불일치";
    }
}

//    // 게시판 특정 글 삭제
//    @DeleteMapping("/api/memos/{id}")
//    public Long deleteMemo(@PathVariable Long id, @RequestBody MemoRequestDto requestDto) {
//        Memo memo = memoRepository.findById(id).orElseThrow(
//                () -> new IllegalArgumentException("아이디가 존재하지 않습니다.")
//        );
//        Long a = 0L;
//        if(memo.getPassword().equals(requestDto.getPassword())){
//            memoRepository.deleteById(id);
//            return id;
//        }
//        return a;
//    }
//}

 

위는 내가 작성한 conroller다.

controller의 PutMapping, DeleteMapping를 살펴보면 패스워드를 확인해서 같으면 반환하라는 내용이 들어있다.

해당 내용은 service에 있어야할 내용인데... 이걸 어떻게 service로 옮길지 고민이다.

내일 오후에 있는 조원들과의 코드리뷰 시간을 갖기로 했는데 이 방안이 도출됐으면 좋겠다.

 

항상 느끼지만 코딩은 어렵다.

이 어려움 잘 극복하고 성취감 꼭 느껴보자.