#4 - Board 테이블, View 컨트롤러

📋차례

  • Board.java
  • BoardRepository.java
  • BoardSaveDto.java
  • BoardEditDto.java
  • BoardPostingService.java
  • BoardPostingController.java

📌정리 방향

Board 테이블의 로직을 정리해 놓은 포스팅이며, 기본적인 세팅은 User 테이블의 로직과 동일합니다.


📌코드

  • Board.java
@Getter
@Entity(name = "board")
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Board {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "BOARD_ID")
    private Long id;

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

    @Lob
    private String content;

    private int count;

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

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "USER_ID")
    private User user;

    @Column(nullable = false)
    private String auth;

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;

    public void setCount(int count){this.count = count;}
    public void setAuth(User user){this.auth = user.getNickname();}
    public void editTitle(String title){this.title = title;}
    public void editContent(String content){this.content = content;}
}

마찬가지로 Setter는 없으며, 게시판의 기본적인 속성들(제목, 내용, 조회수, 댓글, 작성자, 작성시간, 수정시간)을 칼럼으로 지정하고 생성.

  1. @CreatedDate, @LastModifiedDate
    JPA Auditing으로 생성시간/수정시간 자동화
  • BoardRepository.java
import org.springframework.data.jpa.repository.JpaRepository;

public interface BoardRepository extends JpaRepository<Board, Long> {
}

JPA Repository 상속받는 Repository 생성.

  • BoardSaveDto.java
@Builder
@Getter
@AllArgsConstructor
public class BoardSaveDto {
    @NotNull
    private String title;

    @NotNull
    private String content;

    private Integer count;

    private User user;

    public Board toEntity(User user) {
        return Board.builder()
                .title(title)
                .content(content)
                .count(0)
                .user(user).build();
    }
}

게시글 작성에 필요한 제목, 내용, 유저 정보만 간략하게 받는 클래스 생성.
Builder를 통해 기본 count(조회수)는 0으로 지정했음.

  • BoardEditDto.java
@Builder
@Getter
@AllArgsConstructor
public class BoardEditDto {
    private Long id;
    private String title;
    private String content;
}

게시글 수정에 필요한 제목, 내용 말고는 필요없기에 해당 필드만 존재하는 클래스를 생성.

  • BoardPostingService.java
@Service
@RequiredArgsConstructor
public class BoardPostingService {

    private final BoardRepository boardRepository;
    private final UserRepository userRepository;

    @Transactional
    public void save(BoardSaveDto boardSaveDto, String nickname) {
        User findUser = userRepository.findByNickname(nickname).orElse(null);
        Board board = boardSaveDto.toEntity(findUser);
        board.setAuth(findUser);
        boardRepository.save(board);
    }
}

게시글 작성 Service로 BoardSaveDto 형태와, Session의 회원 닉네임을 받아와서 처리하는 서비스 로직.
닉네임으로 유저 정보를 찾은 후 Board클래스 Build 후, MySQL에 저장.

  • BoardPostingController.java
@Controller
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardPostingController {

    private final BoardPostingService boardPostingService;

    @GetMapping("/notice/write")
    public String noticePosting(BoardSaveDto boardSaveDto) {
        return "/board/notice_posting";
    }

    @PostMapping("/notice/write")
    public String noticePosting(BoardSaveDto boardSaveDto, HttpSession session) {
        boardPostingService.save(boardSaveDto, session.getAttribute("loginUser").toString());
        return "redirect:/board/notice";
    }
}

Post로 접근 시, BoardSaveDto와 Session을 통해 서비스 로직에 전달.


기본적인 설정과 설명은 User 코드 설명과 동일하여 대부분을 스킵했습니다.
코드 정리를 최대한 빠르게 정리 후, 기능을 따로 정리해 두겠습니다.

좋은 웹페이지 즐겨찾기