Board Domain Entity 필드 정의
@Getter
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String hostId;
@Column(length = 100)
private String title;
@Column(length = 500)
private String content;
private FlagType flag;
private String place;
private LocalDate time;
private String runTime;
private String walkTime;
private int play_time;
private int joinMember;
private int totalMember;
private BoardStatus status;
}
멤버와 마찬가지로 등록될때 마다 자동으로 아이디 값을 증가시켜서 board의 id를 관리한다.
모임을 주최하는 host의 id도 같이 관리한다.
그리고 모임에 대한 제목, 상세설명, 뛰기 종류, 장소, 시간, 뛰는 시간, 걷는 시간, 총 운동 시간, 참여인원, 제한인원, 모임의 진행상황을 정의했다.
Board Controller 구현
@Slf4j
@RestController
public class BoardController {
private final BoardService boardService;
@Autowired
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
@PostMapping("/board")
public boolean openRun(@RequestBody BoardForm boardForm){
Optional<Board> board = boardService.openRunning(boardForm);
return board.isPresent();
}
@GetMapping("/board/{boardId}")
public Board getBoard(@PathVariable Long boardId){
log.info(String.valueOf(boardId));
return boardService.findByBoardId(boardId).orElse(null);
}
@DeleteMapping("/board/{boardId}")
public String deleteBoard(@PathVariable Long boardId){
log.info("delete 시도 {}",boardId);
return boardService.removeBoard(boardId);
}
@PatchMapping("/board/{boardId}")
public boolean updateBoard(@PathVariable Long boardId, @Valid @RequestBody EditBoardDto editBoardDto){
log.info("update 시도 {}",boardId);
Optional<Board> board = boardService.findByBoardId(boardId);
if(board.isPresent()){
String hostId = board.get().getHostId();
if(editBoardDto.getMemberId().equals(hostId)){
return boardService.editBoard(boardId, editBoardDto);
}
}//모임이 있는지 확인
return false;
}
@GetMapping("/week/{date}")
public List<Board> getWeek(@PathVariable String date){
StringToLocalDate converter = new StringToLocalDate();
LocalDate time = converter.convert(date);
return boardService.findAllBoardByTime(time);
}
}
모임 관리에서 필요한 기능은 모임을 등록하고, 조회하고, 삭제하고, 수정하는 기능(CRUD)이다.
그래서 컨트롤러에서는 위의 코드처럼 따로 Board에서 제공해야 할 Service를 불러와서 처리하도록 구현하였다. 추가로 날짜에 따라 모임들의 리스트를 전달해주는 코드를 작성했다. 이 과정에서 parameter에서 받아온 String 타입을 변환하기 위해서 Converter를 정의하여 LocalDate로 변환해주었다.
Converter String->Locale
@Component
public class StringToLocalDate implements Converter<String, LocalDate> {
@Override
public LocalDate convert(String source) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
return LocalDate.parse(source,formatter);
}
}
그럼 이제 Controller에서 사용한 BoardService의 구현을 보겠다.
Board Service구현
기능별로 코드를 정리해보자.
먼저, 수정이든, 삭제든, 조회든지 일단 등록된 모임이 있어야 가능한 것이기 때문에 가장 먼저 등록 기능을 구현한다.
public Optional<Board> openRunning(BoardForm boardForm){
Board board = boardJpaRepository.save(Board.builder()
.hostId(boardForm.getHostId())
.title(boardForm.getTitle())
.content(boardForm.getContent())
.totalMember(boardForm.getTotalMember())
.flag(boardForm.getFlag())
.time(editBoardDto.getTime())
.runTime(boardForm.getRunTime())
.walkTime(boardForm.getWalkTime())
.play_time(boardForm.getPlay_time())
.status(boardForm.getStatus())
.build());
log.info("board 생성 {}",board.getTitle());
return Optional.of(board);
}
JPA를 사용하여 Board들을 저장하는 데이터 테이블을 만들었다. 그래서 builder를 사용하여 Controller에서 받아온 등록폼의 내용들을 옮겨 넣는 방식으로 진행하였다.
그리고 이렇게 등록된 모임을 조회하는 기능을 구현했다.
public Optional<Board> findByBoardId(Long boardId){
return boardJpaRepository.findBoardById(boardId);
}
public Long findByHostId(String hostId){
Optional<Board> board = boardJpaRepository.findBoardByHostId(hostId);
board.ifPresent(value -> log.info(String.valueOf(value.getId())));
return board.map(Board::getId).orElse(null);
}
public List<Board> findAllBoardByTime(LocalDate date){
return boardJpaRepository.findAllByTime(date);
}
모임의 id를 이용해서 조회하는 방법, 모임의 주최자인 host의 id로 조회하는 방법, 동일한 날짜에 있는 모든 모임을 조회하는 방법으로 3개의 메서드를 구현했다.
그리고 모임을 잘못 개설하거나 수정이 필요한 경우를 위해서 삭제와 수정 메서드를 구현했다.
public String removeBoard(Long boardId){
boardJpaRepository.deleteById(boardId);
return "ok";
}
boardId를 통해서 모임을 삭제하는 간단한 메서드와 아래의 사용자가 수정을 한 부분만을 업데이트 하기위한 수정 메서드를 구현했다.
@Transactional
public boolean editBoard(Long boardId, EditBoardDto editBoardDto){
Board board = boardJpaRepository.findBoardById(boardId).orElseThrow();
EditBoardDto.EditBoardDtoBuilder exist = board.toEditor();
EditBoardDto editNew = exist.title(editBoardDto.getTitle())
.content(editBoardDto.getContent())
.flag(editBoardDto.getFlag())
.place(editBoardDto.getPlace())
.runTime(editBoardDto.getRunTime())
.walkTime(editBoardDto.getWalkTime())
.time(editBoardDto.getTime())
.totalMember(editBoardDto.getTotalMember())
.play_time(editBoardDto.getPlay_time())
.status(editBoardDto.getStatus())
.build();
board.edit(editNew);
log.info("board title {}", board.getTitle());
log.info("board content {}", board.getContent());
return true;
}
추가로 이 부분에서 기존의 내용을 불러와서 수정권한이 없는 부분은 그대로 두고 수정이 필요한 부분만을 수정하도록 만든다.
이를 위해서 board에 두개의 메서드를 추가한다.
public EditBoardDto.EditBoardDtoBuilder toEditor(){
return EditBoardDto.builder()
.title(title)
.content(content)
.place(place)
.runTime(runTime)
.walkTime(walkTime)
.time(time)
.totalMember(totalMember)
.status(status)
.flag(flag)
.play_time(play_time);
}
public void edit(EditBoardDto editBoardDto){
title = editBoardDto.getTitle();
content = editBoardDto.getContent();
flag = editBoardDto.getFlag();
place = editBoardDto.getPlace();
runTime = editBoardDto.getRunTime();
walkTime = editBoardDto.getWalkTime();
time = editBoardDto.getTime();
totalMember = editBoardDto.getTotalMember();
play_time = editBoardDto.getPlay_time();
status = editBoardDto.getStatus();
}
BoardJpaRepository
Board JPA는 아래와 같이 정의한다.
@Repository
public interface BoardJpaRepository extends JpaRepository<Board,Long> {
Optional<Board> findBoardById(Long boardId);
Optional<Board> findBoardByHostId(String hostId);
List<Board> findAllByTime(LocalDate time);
}
이렇게 정의한 domain, service, repository에 접근할 때 사용할 DTO들 또한 정의한다.
BoardForm
처음 모임 주최자인 host가 모임을 생성할 때 입력한 값을 전달 받아오는 객체
@Data
@Builder
public class BoardForm {
private String hostId;
private String title;
private String content;
private String place;
private List<Member> guest;
private FlagType flag;
private LocalDate time;
private String runTime;
private String walkTime;
private int play_time;
private int totalMember;
private BoardStatus status;
}
EditBoardDto
모임의 내용을 수정할 때 사용자의 입력을 전달받는 객체
@Data
@Builder
public class EditBoardDto {
private String memberId;
@NotBlank
private String title;
@NotBlank
private String content;
@NotBlank
private String place;
private FlagType flag;
@NotBlank
private String runTime;
@NotBlank
private String walkTime;
@NotBlank
private LocalDate time;
private int totalMember;
private int play_time;
private BoardStatus status;
}
'LikeLion🦁' 카테고리의 다른 글
뛰슈 - JWT (0) | 2023.08.31 |
---|---|
뛰슈 - guest 모임 참여 (0) | 2023.08.22 |
뛰슈 - LoginService (0) | 2023.08.14 |
뛰슈 - Memeber정의 (0) | 2023.08.10 |
떠나요~ 대천으로🏖️ (3) | 2023.08.01 |