전체 코드 중 주요 기능으로 잡은 에어비엔비 Room CRUD 부분을 정리해보려 한다.

+ 추가기능 ( 페이징 처리, 검색어 입력, S3, 게시글 좋아요, 비회원처리 ) 

 

Dto, Entity 등은 제외하고 Controlle / Repository / Service 부분만 정리


Room Controller

1. 숙소등록 부분

  • 등록 부분이기 때문에 @PostMapping 어노테이션 사용
  • RoomService 의존성 주입
  • Json형식과 Form Data 형식 같이 받아오기
    • (Value="/이름", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}})
    • @RuquestPart로 Json 형식인 RoomRequestDto와 MultipartFile 형태인 이미지를 받아온다.
    • (value = "data"),(value = "file")을 통해 Json, FormData 각각 key값을 명시해 준다.
  • @AuthenticationPrincipal 스프링시큐리티를 이용해 인증된 유저정보를 가져온다.

 

2. 숙소 정보 조회 부분

  • 조회 부분이기 때문에 @GetMapping 어노테이션 사용
  • Pageable을 이용하여 페이징처리 기능을 구현
  • 비회원인 경우 토큰값이 필요 없기 때문에 @AuthenticationPrincipal 유저정보를 매개 값에서 빼준 형식으로 작성
  • 키워드 조회의 경우 쿼리문에 사용할 String keword값이 추가된다.

 

3. 숙소정보 수정 / 삭제 부분 

  • @PathVariable로 게시글 고유 id 값을 조회하여 해당 게시글을 불러온다
  • 작성과 마찬가지로 @RequestPart 어노테이션을 사용하여 Json 형식과 FormData 형식을 불러온다.
  • @CrossOrigin은 CORS오류를 해결하는 방법 중 하나인데, 사실 이번프로젝트는 config 파일에서 CORS에러처리를 해주었기 때문에 필요는 없지만 참고용으로 달아보았다.
  • 삭제 부분은 Request가 따로 필요없기 때문에 유저정보와 해당 글을 불러 올 @Pathvariable만 필요하다.

 

4. 숙소 좋아요 취소기능 부분

 

Repository

1. RoomRepository

  • @Repository 어노테이션으로 빈에 등록해주기.
  • JpaRepository<>를 상속받고 있다.
  • 윗 쿼리문은 전체 조회시 사용 된다.
  • 아래 쿼리문은 검색어 입력후 조회시 사용 된다.

 

2. RoomLikeRepository

  • 가장 윗 쿼리문은 해당 게시글 좋아요 추가 기능에 사용된다.
  •  아래 쿼리문은 해당 게시글 좋아요 취소 기능에 사용된다.
  • 가장 아래 쿼리문은 게시글 삭제 부분에서 좋아요도 삭제해주기 위해 사용된다.

 

3. ImageFileRepository

  • 위의 쿼리문은 게시물을 수정하고, 게시글을 삭제하 때  삭제할 이미지 파일을 조회하면서 하나씩 DB에서 불러오는 데 사용된다.
  • 아래 쿼리문은 위의 쿼리문으로 불러운 이미지를 삭제할 때 사용된다.

 

Service

1. 의존성 주입

 

2. 숙소 정보 작성 (Create)

  • 먼저 Room테이블에 작성자로부터 받은 requestDto와 유저 정보를 저장
  • 이미지 파일이 있다면, S3Service부분에 만들어준 upload메소드를 이용하여 S3와 이미지 테이블에 입력받은 데이터 저장
  • return은 프론트엔드와 메시지 그리고 Status Code로 맞췄기 때문에 미리 만들어준 StatusMsgCode enum을 이용하여 반환

 

 3. 숙소 정보 전체 조회 (로그인 했을 경우 - 토큰유효)

  • Spring Data JPA 에서 제공하는 Pageable 인터페이스를 이용해 페이지처리를 해준다.
  • Room테이블에 저장되어 있는 게시글들을 찾아서 불러오고
  • RoomResponseDto로 되어있는 빈 배열을 하나 만들어준다.
  • 테이블에서 불러온 Room테이블을 바깥 for문에서 돌려주면서 엔티티를 디티오 타입으로 변환시켜 준다.
  • 그리고 이중 for문을 사용하여 각 게시글에 달려있는 이미지파일들을 String 타입으로 변화시켜 path 라고 지정한 url 값만 새로 만들어준 imageFileList배열에 넣어준다.
  • 최종적으로 roomResponseDto에 담겨진 room 정보와, 그에 딸린 좋아요 여부/ 좋아요 수, 그리고 이미지 파일까지 같이 return해준다.

 

4. 비회원일 경우 전체 조회

  • 로그인 후 전체조회와 구조는 같지만, 매개값에 user 정보만 빠져있는 형태이다.
  • 참고로 이전에는 이미지 파일의 path(url의미)를 객체타입으로 줬는데, 프론트엔드에서 String 타입이 더 가공하기 쉽다고 하여 아랫 부분에 String 타입으로 다시 배열을 만들어 주었다.

 

5. 키워드 검색

  • 전체 조회 부분에 keyword 매개 값이 추가된 형태이다.
  • Containing 쿼리문을 이용하여 roomrepository에서 관련된 키워드만 꺼내 올 수 있다.

 

6. 숙소 정보글 수정 

  • @Transactional 어노테이션을 까먹지 말자!
  • 가장 먼저 해당하는 게시글이 있는지 여부를 파악하고 없다면 만들어둔 CustomException을 던져준다.
  • 이어서 해당 게시글의 작성자와 수정하려는 자가 일치하는지 파악하고 다르다면 또한 예외처리를 던져주었다.
  • 이어서 받아온 Json타입의 request들을 먼저 update메소드를 통해 업데이트 해준다.
  • 다음, 해달 게시글에 이미지파일이 있다면(if 문), 해당 글에 달려있던 이미지 파일을 조회해서 먼저 S3에서 삭제를 해준다.
  • 이어서 DB에 저장되어있는 파일도 삭제해준다.
  • 그리고 새로 받은 이미지 파일을 upload메소드를 통해 S3와 DB에 업로드 한다.
  • try- catch 문을 사용하여 과정에 문제가 있다면 예외처리를 해주고, 없다면 return 값으로 StatusMsgCode를 반환한다.

 

7. 숙소 글 삭제

  • @Transactional 어노테이션을 까먹지 말자!
  • 게시글과 작성자 정보를 조회하는 것까지 수정 부분과 동일하다.
  • 가장 먼저 게시글에 달려있는 좋아요를 삭제한다.
  • 다음으로 이미지 파일을 삭제한다. 순서는 해당 글의 이미지 파일을 DB에서 조회하고, S3에서 먼저 삭제해 준 다음 DB에서도 삭제한다.
  • 마지막으로 Room테이블에서 해당 글을 삭제해 준다.
  • 수정글과 마찬가지로 try-catch문을 사용하여 예외처리를 해주고 return값을 주었다.

 

8. 좋아요 추가 / 삭제

  • @Transactional 어노테이션을 까먹지 말자!
  • roomLikeRepository에서 user정보와 게시글 정보를 조회하여 해당 like를 조회한다.
  • boolean 타입으로 해당 글의 좋아요 여부를 확인한다. 좋아요가 추가된 상태인 경우 true를 반환 한다.

 

  • 먼저 해당 게시글이 존재하는지 체크하고 없을 경우 예외를 날려준다.
  • 위에서 만들어둔 checkLike 메소드를 이용해, 만약 값이 true라면 (즉, 이미 좋아요를 한 상태라면) 만들어둔 StatusMsgCode 를 이용해 상태코드와 함께 "이미 좋아요를 추가했습니다." 라는 예외를 날려 준다.
  • 예외처리가 되지 않은 경우 saveAndFlush 메소드를 통해 좋아요 추가 정보를 저장해준다.

 

  • 먼저 해당 게시글이 존재하는지 체크하고 없을 경우 예외를 날려준다.
  • 위에서 만들어둔 checkLike 메소드를 이용해, 만약 값이 false라면 (즉, 이미 좋아요를 취소한 상태라면) 만들어둔 StatusMsgCode 를 이용해 상태코드와 함께 "이미 좋아요를 삭제했습니다." 라는 예외를 날려 준다.
  • 예외처리가 되지 않은 경우 deleteByRoomIdAndUserId 쿼리를 통해 좋아요를 DB에서 삭제해 준다.

+ Recent posts