98DAYS) [Main-Project] Review 패키지 1차 구현, 사용자 요구사항 정의서 수정

nacSeo (낙서)·2023년 3월 9일
0

드디어 본격적으로 코드를 짜기 시작했다. 앞서 pre-project를 하면서 기본 CRUD를 작성한 경험이 크게 도움이 되었다. 기본 CRUD 작성이기에 크게 특별한 점은 없었지만, 사용한 몇 가지만 이야기하고자 한다.

  1. @RequiredArgsConstructor 어노테이션

생성자 주입을 할 때, 기존에는

@RestController
@RequestMapping("/example")
public class RequiredArgsConstructorControllerExample {

  private final FirstService firstService;
  private final SecondService secondService;
  private final ThirdService thirdService;
  
  @Autowired
  public RequiredArgsConstructorControllerExample(FirstService firstService, SecondService secondService, ThirdService thirdService) {
    this.firstRepository = firstRepository;
    this.secondRepository = secondRepository;
    this.thirdRepository = thirdRepository;
  }
}

와 같이 선언된 final 변수들과 필드들을 일일이 선언해줘야 했지만, 해당 어노테이션을 사용하면

@RestController
@RequiredArgsConstructor
@RequestMapping("/example")
public class RequiredArgsConstructorControllerExample {

  private final FirstService firstService;
  private final SecondService secondService;
  private final ThirdService thirdService;
  
  ...
}

다음과 같이 일일이 선언해야하는 부분들을 자동으로 생략할 수 있는 Lombok의 기능이다. 이를 사용하여 @Getter, @Setter 어노테이션들과 같이 번거로움을 없앨 수 있었다.

  1. 전체 리뷰 조회시 리스트 구현

전체 리뷰를 조회할 때 무한스크롤로 구현하는 걸로 FE와 이야기됐는데, 무한스크롤을 처음 사용하다보니 데이터를 리스트로 보내줘야할지 페이지네이션으로 보내줘야할지 고민됐다. 우선은 리스트로 구현하기 위해 다음과 같이 stream을 사용하여 구현해주었다.

@GetMapping
    public ResponseEntity<List<ReviewDto.Response>> getReviews() {
        List<Review> reviews = reviewService.findReviews();

        List<ReviewDto.Response> response = reviews.stream()
                .map(review -> mapper.reviewToReviewResponseDto(review))
                .collect(Collectors.toList());

        return new ResponseEntity<>(response, HttpStatus.OK);
    }
  1. Optional.ofNullable().ifPresent(); 사용

리뷰를 수정할 때 리뷰 사진만 수정하는 경우, 리뷰 텍스트만 수정하는 경우, 둘 다 수정하는 경우가 각각 존재하기에 하나만 수정하여도 수정이 가능하도록 Optional.ofNullable().ifPresent()문을 사용하였다.

        Optional.ofNullable(review.getReview_pic())
                .ifPresent(review_pic -> findReview.setReview_pic(review_pic));
        Optional.ofNullable(review.getReview_text())
                .ifPresent(review_text -> findReview.setReview_text(review_text));

위의 내용을 포함하여 Review에 대한 Controller, Dto, Entity, Mapper, Repository, Service 클래스 및 인터페이스를 1차 구현하였다.

이 후 이어진 오후 회의에서는 각자 진척도를 공유하고, 미용실 정보와 미용실 상세정보 간 내용이 비슷해서 미용실 정보 내용을 줄이는 등 사용자 요구사항 정의서를 다소 수정하였다. 그리고 클라이언트와 서버쪽이 같은 유효성 검사를 실시하기 위해 정규 표현식을 공유하였다.

사용자 요구사항 정의서 (ver.3)



profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글