관심쟁이 영호

[ADYB] 게시판 글쓰기 구현 ㅣ JPA + Spring Boot + Thymeleaf 본문

Project/ADYB - 쇼핑몰

[ADYB] 게시판 글쓰기 구현 ㅣ JPA + Spring Boot + Thymeleaf

관심쟁이 영호 2021. 8. 3. 15:50
반응형

오늘은 게시판 글쓰기를 구현할 것이다.

 

목차

  • Board 도메인 생성
  • 뷰 구현하기
  • Board Repository 생성
  • 컨트롤러 구현하기
  • 서비스 구현하기

Board 도메인 생성

@Data
@Entity(name = "board")
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int boardId;

    @Column(nullable = false, length = 100)
    private String title;

    @Lob
    private String content;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="userId")
    private User user;

    @OneToMany(mappedBy = "board")
    private List<Reply> reply;

    @ColumnDefault("0")
    private int count;

    @CreationTimestamp
    private Timestamp createDate;

};

코드 설명:

  • user는 다대일 매핑으로 한다.
  • LAZY로 지연 로딩을 실시한다.

 


 

뷰 구현하기

 

뷰는 다음과 같이 간단히 만들었다.

 

<!DOCTYPE html>
<html th:replace="~{layouts/base :: layout(~{::title},~{::section})}"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>게시판 쓰기</title>
</head>
<body>
<section class="masthead text-center">
<div>
게시판 쓰기 입니다.

</div>
    id="signUpForm" action="/signup" method="post" th:object="${user}"
    <form id="board" action="/board_write" method="post" th:object="${board}">

        제목 : <input name="title" id="title" type="text">
        내용 : <input name="content" id="content" type="text">


        <button type="submit">제출</button>
    </form>

</section>
</body>
</html>

Board Repository 생성

public interface BoardRepository extends JpaRepository<Board, String> {

};

간단히 CRUD만 구현!

 


@Controller
@RequiredArgsConstructor
@Slf4j
public class BoardWriterController {

    private final BoardWriteService boardWriteService;
    @GetMapping("/board_write")
    public String BoardWriter(
            @SessionAttribute(name = SessionConst.LOGIN_USER, required = false)
                    User user, Model model
    ){

        addUser(user, model);
        return "board_write";
    }

    @PostMapping("/board_write")
    public String BoardWriter(@ModelAttribute Board board, @SessionAttribute(name = SessionConst.LOGIN_USER, required = false)
            User user){

        boardWriteService.write(board, user);
        return "redirect:/";

    }


    public void addUser(User user, Model model){
        if(user == null) {
            model.addAttribute("user", new User());
            return;
        }
        model.addAttribute("user", user);
        return;
    }
};

 

코드 설명:

  • GET, POST 매핑 두 가지가 있다.
  • GET은 뷰를 리턴
  • POST는 게시글 쓰기 폼 데이터를 받는 매핑이다.

서비스 구현하기

@Service
@Slf4j
@RequiredArgsConstructor
public class BoardWriteService {
    private final BoardRepository boardRepository;
    private final UserRepository userRepository;
    public void write(Board board, User user){

        User findUser = userRepository.findByUserId(user.getUserId());
        board.setUser(findUser);
        boardRepository.save(board);

    }
};

코드 설명:

  • 컨트롤러에서 넘겨준 user를 이용하여 userRepository에서 user 객체를 받아온다.
  • board에 user를 set 해준다.
  • boardRepository.save를 이용하여 board 객체를 저장한다.

※ 여기서 userRepository를 이용하여 user 객체를 받아오지 않고, 컨트롤러에서 "@ModelAttribute"를 통해서 받아온 user를 바로 board.setUser(user)를 해주면 에러가 뜬다.

 

이유는 : "@ModelAttribute"에서 받아온 user는 그냥 바인딩된 객체일 뿐, DB에 등록된 객체가 아니기 때문이다. FK를 이어주어야 하는데, JPA는 해당 user가 기존에 로그인한 user인지 모른다. 그래서 userRepository의 findByUserId를 통해서 user를 가지고 와서 save를 해주어야 한다.


다음은 게시판 조회를 구현할 예정이다.

300x250
Comments