- 전체 게시글 목록 조회 API
- 제목, 작성자명(username), 작성 내용, 작성 날짜를 조회하기
- 작성 날짜 기준 내림차순으로 정렬하기
- 게시글 작성 API
- 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
- 제목, 작성자명(username), 작성 내용을 저장하고
- 저장된 게시글을 Client 로 반환하기
- 선택한 게시글 조회 API
- 선택한 게시글의 제목, 작성자명(username), 작성 날짜, 작성 내용을 조회하기
(검색 기능이 아닙니다. 간단한 게시글 조회만 구현해주세요.)- 선택한 게시글 수정 API
수정을 요청할 때 수정할 데이터와 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 수정 가능
- 제목, 작성 내용을 수정하고 수정된 게시글을 Client 로 반환하기
- 선택한 게시글 삭제 API
삭제를 요청할 때 비밀번호를 같이 보내서 서버에서 비밀번호 일치 여부를 확인 한 후- 토큰을 검사한 후, 유효한 토큰이면서 해당 사용자가 작성한 게시글만 삭제 가능
- 선택한 게시글을 삭제하고 Client 로 성공했다는 메시지, 상태코드 반환하기
//전체 게시글 조회
@GetMapping("/board/list")
public List<Board> getBoardList(){
return boardService.getBoardAll();
}
@Transactional
public List<Board> getBoardAll() {
return boardRepository.findAllByOrderByModifiedAtDesc();
}
public interface BoardRepository extends JpaRepository<Board,Long> {
//save(),delete() 같이 기본으로 들어있지 않기 때문에 선언!
List<Board> findAllByOrderByModifiedAtDesc();
}
- 회원 가입을 진행하고, 로그인 된 상태
(JWT을 받은 상태)
에서만 작성 가능- 여기서 과제의 조건이 회원가입과 로그인의 성공 시
msg
,StatusCode
를 리턴하는 것 이였는데,
아무리 생각해도Json
타입으로 반환할 생각이 안나서,DTO
를 따로 만들어서set
한 후 해당DTO
를 리턴했는데, 출력은 잘되지만 뭔가 코드마다 이 객체의 생성이 모두 들어가게 되는 것 같아 불안하다.
//Board(게시물) 추가시 해당 User의 ID를 body로 받아서 ~ 같이 추가해줘야 될 것 같음.
@PostMapping("/board/list")
public Board createBoard(@RequestBody BoardRequestDTO boardDto, HttpServletRequest request){
return boardService.createBoard(boardDto,request);
}
@Transactional
public Board createBoard(BoardRequestDTO boardDto, HttpServletRequest request) {
// Request에서 Token 가져오기
String token = jwtUtil.resolveToken(request);
Claims claims;
// 토큰이 있는 경우에만 게시글 생성 가능
if (token != null) {
// Token 검증
if (jwtUtil.validateToken(token)) {
// 토큰에서 사용자 정보 가져오기
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
Board board = new Board(boardDto, user);
boardRepository.save(board);
return board;
}
return null;
}
@GetMapping("/board/list/{id}")
public Optional<Board> findBoard(@PathVariable Long id){
return boardService.findBoardById(id);
}
@Transactional
public Optional<Board> findBoardById(Long id) {
return Optional.ofNullable(boardRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("특정 게시글이 없습니다!")
));
}
- 로그인이 되어
JWT
를 발급 받고 진행- 본인의
JWT
를 넣어주지 않으면 게시물의 수정이 이뤄지지 않는다.
@PutMapping("/board/list/{id}")
public Board updateBoard(@PathVariable Long id, @RequestBody BoardRequestDTO boardDto , HttpServletRequest request){
return boardService.update(id,boardDto,request);
}
@Transactional
public Board update(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {
// Request에서 Token 가져오기
String token = jwtUtil.resolveToken(request);
Claims claims;
//선택한 게시글 찾기
Board board = boardRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("수정하고자 하는 게시글이 없습니다!")
);
// 토큰이 있는 경우에만 게시글 수정 가능
if (token != null) {
// Token 검증
if (jwtUtil.validateToken(token)) {
// 토큰에서 사용자 정보 가져오기
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (!(board.getUser().getId() == user.getId())) {
throw new IllegalArgumentException("해당 사용자가 아니면 게시글을 수정할 수 없습니다!");
}
board.update(boardDto);
return board;
}
return null;
}
- 로그인이 되어
JWT
를 발급 받고 진행- 본인의
JWT
를 넣어주지 않으면 게시물의 수정이 이뤄지지 않는다.
@DeleteMapping("/board/list/{id}")
public ResponseEntity deleteBoard(@PathVariable Long id, @RequestBody BoardRequestDTO boardDto, HttpServletRequest request){
return boardService.delete(id,boardDto,request);
}
public ResponseEntity delete(Long id, BoardRequestDTO boardDto, HttpServletRequest request) {
// Request에서 Token 가져오기
String token = jwtUtil.resolveToken(request);
Claims claims;
Board board = boardRepository.findById(id).orElseThrow(
() -> new IllegalArgumentException("삭제하고자 하는 게시글이 없습니다!")
);
if (token != null) {
// Token 검증
if (jwtUtil.validateToken(token)) {
// 토큰에서 사용자 정보 가져오기
claims = jwtUtil.getUserInfoFromToken(token);
} else {
throw new IllegalArgumentException("Token Error");
}
// 토큰에서 가져온 사용자 정보를 사용하여 DB 조회
User user = userRepository.findByUsername(claims.getSubject()).orElseThrow(
() -> new IllegalArgumentException("사용자가 존재하지 않습니다.")
);
if (!(board.getUser().getId() == user.getId())) {
throw new IllegalArgumentException("해당 사용자가 아니면 게시글을 삭제할 수 없습니다!");
}
boardRepository.deleteById(id);
DeleteSuccessDto deleteSuccessDto = new DeleteSuccessDto();
deleteSuccessDto.setMsg("게시글 삭제 성공!");
deleteSuccessDto.setStatusCode(200);
return ResponseEntity.status(HttpStatus.OK).body(deleteSuccessDto);
}
return null;
}
- 회원 가입 조차 하지 않은 회원이 접근할 경우 유저를 찾을 수 없다는 메세지가 뜹니다.
- 전체 코드 및 API명세 : https://github.com/PriceHoon/spartaBoard