REST API와 마무리 — 읽기 자료
인기글을 보여주려면 조회수가 필요하고, 글에 사진을 첨부하려면 컬럼이 필요. 그런데 myboard 에는 둘 다 없음.
기존 myboard 테이블에 view_count(DEFAULT 0) 와 photo(NULL) 두 컬럼을 더한다. 동적 SQL 첫 등장.
-- ① 조회수 컬럼 (DEFAULT 0 — 기존 글도 0 부터)
ALTER TABLE myboard ADD COLUMN view_count INT DEFAULT 0;
-- ② 사진 컬럼 (NULL 허용 — 기존 글은 NULL)
ALTER TABLE myboard ADD COLUMN photo VARCHAR(200) NULL;
// 도메인 (com.smhrd.domain.Board) — 두 줄 추가
private int viewCount;
private String photo;
<!-- BoardMapper.xml — 동적 SQL -->
<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>
// Controller — 조회수 +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);
}
// Controller — 첨부파일
@PostMapping("/api/boards/upload")
public Map<String, String> upload(@RequestParam("file") MultipartFile file)
throws IOException {
String original = file.getOriginalFilename();
String saved = UUID.randomUUID() + "_" + original;
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});
<!-- root-context.xml -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/>
</bean>
<if test="photo != null">myboard 4 컬럼 + created_at. 조회수·사진 없음.
myboard 에 view_count·photo 두 컬럼이 ALTER 로 추가. v10.