v10
★ LAB · REST

자잘한 비동기 + 첨부파일

REST API와 마무리 — 실습

📍 지금 어디를 만지고 있나요?
브라우저
REST API와 마무리
DB

사전 준비

이번 실습의 목표

myboard 에 ALTER 두 번으로 view_count·photo 컬럼을 추가. 동적 SQL 로 photo 가 있을 때만 UPDATE. fetch + FormData 로 파일 업로드.

1
코드 작성
-- ① 조회수 컬럼 (DEFAULT 0)
ALTER TABLE myboard ADD COLUMN view_count INT DEFAULT 0;

-- ② 사진 컬럼 (NULL 허용)
ALTER TABLE myboard ADD COLUMN photo VARCHAR(200) NULL;

// Board.java 에 두 필드 추가 (com.smhrd.domain)
private int viewCount;
private String photo;

<!-- 동적 SQL — photo 가 있을 때만 -->
<update id="update" parameterType="com.smhrd.domain.Board">
    UPDATE myboard
    SET title = #{title}, content = #{content}
    <if test="photo != null">, photo = #{photo}</if>
    WHERE num = #{num}
</update>

<update id="incrementViewCount" parameterType="int">
    UPDATE myboard SET view_count = view_count + 1 WHERE num = #{num}
</update>

// 조회수 +1 (com.smhrd.controller)
@PostMapping("/api/boards/{num}/view")
public Map<String, Integer> incrementView(@PathVariable int num) {
    int newCount = service.incrementViewCount(num);
    return Map.of("viewCount", newCount);
}

// 첨부파일 업로드
@PostMapping("/api/boards/upload")
public Map<String, String> upload(@RequestParam("file") MultipartFile file)
        throws IOException {
    String saved = UUID.randomUUID() + "_" + file.getOriginalFilename();
    file.transferTo(new File("/uploads/" + saved));
    return Map.of("filename", saved);
}

// 클라이언트 — FormData
const formData = new FormData();
formData.append('file', fileInput.files[0]);
fetch('/api/boards/upload', {method: 'POST', body: formData});
CHECKPOINT
  • 코드를 작성한 뒤 빨간 줄(컴파일 오류)이 없는가?
2
실행 + 결과 확인

Run on Server 또는 javac+java 로 실행하고 결과를 확인합니다.

CHECKPOINT
  • 예상한 동작이 일어났는가?
  • 안 됐다면 F12 / 콘솔 / 로그 어디서 단서가 보이는가?

실습 완료 체크리스트

ALTER ADD COLUMN 두 번 적용 — view_count, photo
동적 SQL <if test="photo != null"> 동작 확인
incrementViewCount UPDATE 가 SQL 로그에 보이는가
FormData 로 multipart 업로드 성공
v10 마일스톤