본문 바로가기
독서/클린코드_노개북

[노개북] 클린코드 15일차 - 노마드 코더

by 공부하는개미 2022. 2. 4.

 

코마드코더

 

노개북 13일 차에 7장의 내용을 다 읽고 정리했습니다.

그래서 해당 내용을 바탕으로 제 코드를 리팩터링 하는 걸 정리해봤습니다.

 

 

😅 리팩터링(53번째 줄)

//region 게시글 작성
@Transactional
public BoardUploadResponseDto uploadBoard(UserDetailsImpl userDetails,
BoardUploadRequestDto boardUploadRequestDto,
String categoryName,
MultipartFile multipartFile) {
// 글 작성할려는 유저 로그인 여부 확인
ValidChecker.loginCheck(userDetails);
// 1. Request 로 넘어온 데이터 유효성 검사(게시글 제목, 게시글 내용)
String boardTitle = boardUploadRequestDto.getTitle();
String boardContent = boardUploadRequestDto.getContent();
if (boardTitle.isEmpty()) {
throw new IllegalArgumentException(TITLE_IS_EMPTY);
}
if (boardContent.isEmpty()) {
throw new IllegalArgumentException(CONTENT_IS_EMPTY);
}
// 2. Request 로 넘어온 카테고리 네임 DB 에서 조회
BoardCategory boardCategory = getSafeBoardCategory(categoryName);
// 3. multipartFile 로 넘어온 이미지 데이터 null 체크 => null 이 아니면 S3 버킷에 저장
String imageUrl = "";
if (!multipartFile.isEmpty()) {
imageUrl = s3Uploader.upload(multipartFile, S3dirName);
}
// 4. 게시글 데이터 DB에 저장
Board board = Board.builder()
.title(boardTitle) // 제목
.content(boardContent) // 내용
.boardCategory(boardCategory) // 카테고리
.user(jwtAuthenticateProcessor.getUser(userDetails)) // 유저
.thumbNail(imageUrl) // 이미지 URL
.enabled(true) // 게시글 삭제 여부
.build();
boardRepository.save(board);
// 5. 작성한 게시글에 맞는 이미지 저장
BoardImage boardImage = BoardImage.builder()
.board(board)
.imageUrl(imageUrl)
.build();
boardImageRepository.save(boardImage);
// 6. 저장한 데이터 기반으로 Response(게시글번호, 제목, 내용, 카테고리, 이미지 URL, 생성날짜)
return BoardUploadResponseDto.builder()
.boardId(board.getBoardId()) // 게시글아이디
.title(board.getTitle()) // 제목
.content(board.getContent()) // 내용
.category(board.getBoardCategory().getCategoryName()) // 카테고리
.thumbNail(board.getThumbNail()) // 이미지 URL
.createdAt(board.getCreatedAt() == null ? null : board.getCreatedAt()) // 게시글 생성 날짜
.build();
}
//endregion
view raw gistfile1.txt hosted with ❤ by GitHub

문제점

  • 53번째 줄을 보면 게시글의 생성날짜가 null이면 그냥 클라이언트 단으로 null을 전달하는 문제가 있습니다.
  • null이 전달되면 프론트엔드 개발자가 한번 더 게시글의 작성 날짜 처리를 해야 하는 문제 발생
    *근데 여기서 궁금한거 TimeStamp

 

 

😀 리팩터링 후(8번째 줄)

// 6. 저장한 데이터 기반으로 Response(게시글번호, 제목, 내용, 카테고리, 이미지 URL, 생성날짜)
return BoardUploadResponseDto.builder()
.boardId(board.getBoardId()) // 게시글아이디
.title(board.getTitle()) // 제목
.content(board.getContent()) // 내용
.category(board.getBoardCategory().getCategoryName()) // 카테고리
.thumbNail(board.getThumbNail()) // 이미지 URL
.createdAt(board.getCreatedAt() == null ? LocalDateTime.now() : board.getCreatedAt()) // 게시글 생성 날짜
.build();
view raw gistfile1.txt hosted with ❤ by GitHub
  • 8번째 줄
  • 우선 LocalDateTime.Now 를 통해 게시글 작성 시간을 리턴해주는 방법 적용
  • 하지만 여기서 또 문제점은 DB에 게시글 작성 날짜가 저장되지 않는 문제 발생
    => 게시글을 다시 조회(새로고침)했을 때 게시글 작성 날짜가 안나오는 문제 발생

 

🤔 리팩터링 후 문제점

  • DB에 해당 게시글의 데이터가 저장 되면서 저절로 생성 날짜(CreatedAt)가 저장되도록 Entity를 구성했습니다.
    => 여기서 진짜 만약에 CreateAt이 작동 되지 않을 경우를 대비하기 위해 null을 클라이언트단에 리턴하는 방식
  • 이 만약을 위해 게시글의 생성날짜를 해당 Entity에 다시 넣어주고 DB에 저장하는 단계를 거쳐야 하나?
    => Entity 부분에 생성날짜(CreatedAt)을 다시 넣어주고 저장하는 수요 발생
    => 생성날짜를 다시 넣어주고 저장하는 단계에서 SQL문이 추가로 발생하는 번거로움 발생

 

 

 

반응형