SpringBoot-Board "week03 게시글 상세페이지 부터 파일업로드까지."

dong.___.ju·2025년 5월 3일

SpringBoot-Board

목록 보기
2/3

3주차 DB 테이블 생성부터 게시글 리스트까지.

3주차에는

  • 게시글 상세 페이지
  • 게시글 삭제
  • 게시글 수정
  • 메시지 띄우기
  • 파일 업로드까지 해보겠다.

1.게시글 상세페이지

게시글 list 페이지에서 제목을 클릭하면 상세페이지로 이동하게 만들어 볼 것이다.

먼저 상세페이지를 보는 페이지를 mapping 할려면
BoardController에서
/board/view를 만들어 줄것이다

게시글이 1개가 아니기 때문에 /board/view?id=게시글 번호 형식으로 지정해주겠다.

@GetMapping("/board/view") //localhost:8080/board/view?id=1
public String boardview(Model model, Integer id){
model.addAttribute("board", boardService.boardview(id));
return "boardview";
}
하단의 사진과 같이 122번글에 제목: 구름톤, 내용 유니브 란 내용이 나온다.

이게 게시글 list에서 제목을 클릭하여 view로 넘어가게 만들어보겠다.
BoardService에서 특정 게시글을 불러오게 만들어준다.

//특정 게시글 불러오기
public Board boardview(Integer id){
return boardRepository.findById(id).get();
}

다음으로 Boardlist에서

id를 담아서 보내주게 만들어준다

    <tr th:each = "board : ${list}">
      <td th:text="${board.id}">1</td>
      <td>
        <a th:text="${board.title}" th:href="@{/board/view(id=${board.id})}"></a>
      </td>
    </tr>

이렇게 만들고 실행해보면 하단의 사진과 같이 제목에 이동 할 수 있게 되었다. 이동하면 최상단의 사진과같이 /view?id로 이동하게 된다.

2.게시글 삭제

먼저 버튼을 만들어주겠다

<a th:href=@{/board/delete(id=${board.id})}>글삭제

BoardService에서 특정 게시물을 삭제하는 부분을 만든다

//특정 게시글 삭제
public void boardDelete(Integer id){
boardRepository.deleteById(id);
}

BoardService에서 만든걸 활용하기위해 BoardController에서 GetMapping하여 게시글 id를 delete에 넘겨준다.

@GetMapping("/board/delete")
public String boardDelete(Integer id){
boardService.boardDelete(id);
return "redirect:/board/list";
}

여기서 글삭제를 클릭하면

이렇게 내가 보고있던 페이지의 게시물이 삭제되며 게시글 list로 넘어오게 된다.

3.게시글 수정

먼저 수정 버튼을 만들어주겠다

th:href="@{/board/modify/{id}(id = ${board.id})}">수정

글삭제 버튼 뒤에 수정버튼이 생성된다.

다음으로 버튼을 매핑해보겠다.

GetMapping("/board/modify/{id}")
public String boardModify(@PathVariable("id") Integer id){
return "boardmodify";
}

이렇게 작성하면 기존글이 불러와지며 텍스트를 입력하여 수정도 할 수 있다.

이제 입력한 텍스트를 저장 해 볼 것 이다.

@PostMapping("/board/update/{id}")
public String boardUpdate(@PathVariable("id") Integer id, Board board){
Board boardTemp = boardService.boardview(id);
boardTemp.setTitle(board.getTitle());
boardTemp.setContent(board.getContent());
(여기에 추가)
return "redirect:/board/list";
}

위의 코드를 작성하고 실행하면 정상적으로 수정이 안되고 다시 게시글 리스트로 넘어온다. 문제가 발생한 이유는 영상에서 boardService.write(boardTemp); 코드의 작성이 누락되며 점프되어 덮어씌워지지 않고 다시 리스트를 넘어 온것이다 다시 추가해주고 실행해보면 정상적으로 수정된것을 볼 수 있다.

4.처리메시지 출력

글 작성이 완료되면 "글작성이 완료되었습니다."라는 메시지를 띄워보겠다.
먼저 메시지를 띄워줄 message.html을 생성후 아레와 같이 작성해준다 자바스크립트를 이용하겠다.

글을 작성하면 메시지를 출력하기 때문에 BoardController에서
writepro 부분의 코드를 수정해준다.
아레와 같이 제목, 내용을 입력후 작성을 클릭하면 "글작성이 완료되었습니다." 메시지가 출력된다.!

@PostMapping("/board/writepro")
public String boardWritePro(Board board, Model model) {
boardService.write(board);
model.addAttribute("message", "글작성이 완료되었습니다.");
model.addAttribute("searchUrl", "/board/list");
return "message";
}

5.게시판 파일 업로드

게시판 작성시 파일을 같이 업로드하는 부분을 구현해보겠다.
먼저 mysql에 들어가 filename과 filepath를 만들어준다.

이제 boardwrite에서

input type="file" name="file" 코드를 추가해준다

다음으로 BoardService의 write에서 아래의 코드로파일의 저장 경로와 uuid를 설정해준다.

public void write(Board board, @RequestParam(name="file",required = false) MultipartFile file) throws Exception{
String projectPath = System.getProperty("user.dir") +"\board\src\main\resources\static\files";
UUID uuid = UUID.randomUUID();
String fileName = uuid + "_" + file.getOriginalFilename();
File saveFile = new File(projectPath, fileName);
file.transferTo(saveFile);
board.setFilename(fileName);
board.setFilepath("/files/" + fileName);
boardRepository.save(board);
}

정상적으로 실행되었다면 mysql에서 uuid가 추가된것을 확인 할 수있다.
업로드중..

사진을 업로드 한 후 해당 게시글에 들어가 다운 버튼을 클릭하면 화면이 업로드한 사진으로 변경된다.
업로드중..

파일 경로를 못 찾는 오류가 발생하였는데 @RequestParam(name="file",required = false)

또한 파일 경로가 /board/board로 중복 설정이되어있어서 해당 부분을 찾고 수정하는데 굉장히 오랜 시간이 소요되었다.

한코딩 게시판을 만들면서 반복, 조건문 보단 새롭게 사용하는 어노테이션, 외부라이브러리등을 공부하면서 새로운 개발에 대한 나의 개발 장벽을 많이 무너트린거 같아 굉장히 많은 공부와 도움이 되었다.

1개의 댓글

comment-user-thumbnail
2025년 5월 3일

동작 화면을 순서대로 잘 정리해주셔서 어떻게 동작하는지 파악하기가 좋네용!!! 이번주도 고생하셨습니다ㅎㅎ

답글 달기