[Spring#41] Spring 팀과제 : NateamStore 프로젝트 리뷰 조회, 수정, 삭제 API 기능 구현 / 알고리즘 : 공원 산책

김한준 Hanjun Kim·2023년 12월 7일
0

내일배움캠프

목록 보기
42/70

NateamStore 프로젝트 리뷰 조회, 수정, 삭제 API 기능 구현

오늘 알게된 것

  • Java Record + 정적 팩토리 메서드

    • 어제 리뷰 등록 기능을 구현하면서 알게되었다고 생각하였는데, 오늘 조회를 만드려고 헷갈려서 다시 공부했다.
    • DTO를 예시로 들면 (보통 record 클래스는 DTO 만들 때 많이 쓴다고 한다)
    @Builder
    public record GetReviewDTO(
            String userName,
            Long gameId,
            Long reviewId,
            String reviewContent,
            int reviewRank,
            LocalDateTime createdDate,
            LocalDateTime lastModifiedDate
    ) {
    
        public static GetReviewDTO of(User user, Review review){
    
            return GetReviewDTO.builder()
                    .gameId(review.getGameId())
                    .userName(user.getUserName())
                    .reviewId(review.getReviewId())
                    .reviewContent(review.getReviewContent())
                    .reviewRank(review.getReviewRank())
                    .createdDate(review.getCreatedTime())
                    .lastModifiedDate(review.getLastModifiedTime())
                    .build();
        }
    }
    • Record : 불변(immutable) 데이터 객체를 쉽게 생성할 수 있도록 하는 새로운 유형의 클래스
      • 이런식으로 DTO를 만들 때, 생성자를 생략할 수 있다.
      • 물론 다른 생성자를 추가할 수도 있다.
    • 정적 팩토리 메서드
      • DTO 이름 옆에 'of'가 정적 팩토리 메서드의 이름이다.
      • 컨벤션으로 미리 정의되어 있으며 / 예를들면 of : 받는 인자가 2개 이상 from : 받는 인자가 1개
  • 연관관계 설정 안한 이유는
    쿼리 메서드를 활용해서 하면 좋지만 여러 데이터를 join해서 가져와야 해서 어쩔수없이 SQL문을 사용해야 해서 쿼리메서드를 사용하지 못한 것이였다.
    SQL문을 연습하려고 한것이라고 하기보다는 ..

    • QueryDSL을 쓰는 이유는 컴파일 단계에서 자바코드로 짤 수 있다는게 장점이다.
      • 쓰기 편하고 컴파일 단계에서 오류를 잡을 수 있기 때문에!

코드를 좀 더 좋게 만드는 방법!

  • 다른 도메인 접근은 서비스 통해서만 접근할 수 있게
    남의 레포지토리 접근하지 못하게

    • 무슨 말이냐면,

      Review review = reviewRepository.save(reviewRequest.toEntity(userId, gameId));
            User user = userService.findById(review.getUserId());
      
            return ReviewRegisterDTO.Response.of(user, review);

      이런 경우에서 보통은 다른 Repository를 주입받아서 그 안에서 ID값을 이용해서 데이터를 찾는데,
      이렇게 하지 말고 서비스를 주입받아서 해당 서비스의 findById를 사용해서 아이디를 가져오는게 낫다.
      남의 레포지토리를 접근하는거는 좋지 않다!

  • update같은 경우에, 엔티티를 건드리지 말라는 건 필드를 건들지 말라는 거지
    엔티티에서 메서드는 만들 수 있다.
    -> review를 찾아온 후에 review.modify를 통해 수정 기능을 만들고
    Transaction 으로 영속성 컨텍스트 적용
    영속성 컨텍스트는 findById할 시에 "스냅샷"을 찍어놓고 그 이후에 값이 변경된 걸 Transaction을 통해 적용한다.


알고리즘

깃허브 주소 : https://github.com/wkdehf217/codingTest/blob/9fe2083b513b5800edeea6af7294c6f2043f9a1f/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/1/%EA%B3%B5%EC%9B%90%20%EC%82%B0%EC%B1%85/%EA%B3%B5%EC%9B%90%EC%82%B0%EC%B1%85.java

나중에 알고보니 BFS 문제였다고 한다. 나중에 기억해두자.

문제는 지도를 그린 후에 장애물 / 지도 초과 인 경우는 해당 이동을 무시하고 넘어가고,
이동을 모두 마친 뒤에 좌표를 반환하는 문제였다.

  • 나는 주어진 문자열을 활용해서 지도를 만들고
    • 지도를 만들 때 for문을 돌면서 X를 만나면 1로 , 나머지는 0으로 만들었다.
  • 시작위치를 answer에다가 저장한 후에
  • for문을 돌면서 '이동 문자' 를 split으로 쪼개서 방향 / 이동 수 를 체크하고(- '0'으로 int로 변환)
  • 지도 초과를 걸러내고
  • 1칸씩 이동하면서 이동한 위치에 X가 있으면 flag를 false로 바꾼 후에
  • flag가 true인 경우
    에만 이동을 하였다.
    성공!
profile
개발이 하고싶은 개발지망생

0개의 댓글