전체 코드 중 주요 기능으로 잡은 에어비엔비 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에서 삭제해 준다.
'항해99 개발 일지 > [7주차] 클론 프로젝트' 카테고리의 다른 글
[06] Spring 이메일 인증 구현 (1) | 2023.01.01 |
---|---|
[05] Spring 페이징처리 + 키워드 검색기능 구현 (0) | 2022.12.30 |
[04] OAuth 2.0 카카오 로그인 구현 (0) | 2022.12.28 |
[03] S3 이미지파일 다중업로드 (0) | 2022.12.27 |
[01] WebSecurityConfig (0) | 2022.12.27 |