Search

37. 스프링부트 포토그램 구독하기 구독,구독 취소 API 만들기

포토그램 구독하기

구독하기, 구독 취소하기 API를 만들거다
데이터만 리턴하는 컨트롤러를 생성할거다
web 폴더 안 api 폴더 안에 SubscribeApiController.java 생성
@RestController public class SubscribeApiController { @PostMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> subscribe(){ return null; } @DeleteMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> unSubscribe(){ return null; } }
Java
복사
구독하기와 구독취소하기 틀을 만들어줬다
누구를 구독하는지, 누가 구독했는지
누가 구독했는지는 로그인한 사람이 구독한 사람이다.
//누가 구독했는지 @PostMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> subscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int toUserId){ return null; } //누가 구독을 취소 했는지 @DeleteMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> unSubscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int toUserId){ return null; }
Java
복사
이제 데이터를 받아서 DB에 넣어줄려면 service가 필요하다
service 폴더 안에 SubscribeService.java 생성
@Service public class SubscribeService { @Transactional public void 구독하기 (int fromUserId, int toUserId) { } @Transactional public void 구독취소하기 (int fromUserId, int toUserId) { } }
Java
복사
레파지토리를 연결해서 실제 DB와 연결시켜주자.
@RequiredArgsConstructor @Service public class SubscribeService { private final SubscribeRepository subscribeRepository; @Transactional public void 구독하기 (int fromUserId, int toUserId) { } @Transactional public void 구독취소하기 (int fromUserId, int toUserId) { }
Java
복사
SubscribeRepository.java에서
int mSubscribe(int fromUserId, int toUserId); int mUnSubscribe(int fromUserId, int toUserId);
Java
복사
구독하기와 구독취소 관련해서 선언하고 네이티브 쿼리를 이용해서 DB에 넣어줄거다
@Query(value = "INSERT INTO subscribe(fromUserId , toUserId, createDate) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true) int mSubscribe(int fromUserId, int toUserId); @Query(value = "DELETE FROM subscribe WHERE fromUserId = :fromUserId AND toUserId = :toUserId", nativeQuery = true) int mUnSubscribe(int fromUserId, int toUserId);
Java
복사
:fromUserId 이런식으로 넣은거는 int fromUserId를 바인드해서 넣는거다
그리고 데이터베이스 변경되는 쿼리에는 @Modifying 을 추가해줘야한다
public interface SubscribeRepository extends JpaRepository<Subscribe, Integer>{ @Modifying //INSERT, DELETE, UPDATE를 네이티브 쿼리로 작성하려면 해당 어노테이션이 필요 !!! @Query(value = "INSERT INTO subscribe(fromUserId , toUserId, createDate) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true) int mSubscribe(int fromUserId, int toUserId); //성공 1 실패 -1 로 리턴된다 (변경된 행의 갯수만큼 리턴된다 10개 변경 성공시 10으로 리턴) 실패는 그냥 -1 / 0으로 리턴시에는 해당 유저가 존재하지않거나 변경되지 않고 끝날때 @Modifying @Query(value = "DELETE FROM subscribe WHERE fromUserId = :fromUserId AND toUserId = :toUserId", nativeQuery = true) int mUnSubscribe(int fromUserId, int toUserId); //성공 1 실패 -1 로 리턴된다 }
Java
복사
SubscribeService.java
@RequiredArgsConstructor @Service public class SubscribeService { private final SubscribeRepository subscribeRepository; @Transactional public int 구독하기 (int fromUserId, int toUserId) { int result = subscribeRepository.mSubscribe(fromUserId, toUserId); return result; } @Transactional public int 구독취소하기 (int fromUserId, int toUserId) { int result = subscribeRepository.mUnSubscribe(fromUserId, toUserId); return result; } }
Java
복사
결과를 리턴하게 리턴타입을 int로 변경해줌
SubscribeApiController.java
@RequiredArgsConstructor @RestController public class SubscribeApiController { private final SubscribeService subscribeService; //누가 구독했는지 @PostMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> subscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int toUserId){ subscribeService.구독하기(principalDetails.getUser().getId(), toUserId); return new ResponseEntity<>(new CMRespDto<>( 1, "구독하기 성공", null), HttpStatus.OK); } //누가 구독을 취소 했는지 @DeleteMapping("/api/subscribe/{toUserId}") public ResponseEntity<?> unSubscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int toUserId){ subscribeService.구독취소하기(principalDetails.getUser().getId(), toUserId); return new ResponseEntity<>(new CMRespDto<>( 1, "구독취하기 성공", null), HttpStatus.OK); } }
Java
복사
원래는
int result = subscribeService.구독하기(principalDetails.getUser().getId(), toUserId); return new ResponseEntity<>(new CMRespDto<>( result, "구독하기 성공", null), HttpStatus.OK);
Java
복사
이렇게 진행할려 했는데 내부적으로 터지면은 서비스쪽에서 try catch를 이용해서 내부적으로 만든 핸들러(ControllerExceptionHandler.java)에서 처리하는게 나을거같아서 그냥 성공시 1로 변경
SubscribeService.java에서 int로 리턴하던것도 빼주자
@Transactional public void 구독하기 (int fromUserId, int toUserId) { subscribeRepository.mSubscribe(fromUserId, toUserId); } @Transactional public void 구독취소하기 (int fromUserId, int toUserId) { subscribeRepository.mUnSubscribe(fromUserId, toUserId); }
Java
복사
SubscribeRepository.java에도 그냥 void로 변경
public interface SubscribeRepository extends JpaRepository<Subscribe, Integer>{ @Modifying //INSERT, DELETE, UPDATE를 네이티브 쿼리로 작성하려면 해당 어노테이션이 필요 !!! @Query(value = "INSERT INTO subscribe(fromUserId , toUserId, createDate) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true) void mSubscribe(int formUserId, int toUserId); //성공 1 실패 -1 로 리턴된다 (변경된 행의 갯수만큼 리턴된다 10개 변경 성공시 10으로 리턴) 실패는 그냥 -1 / 0으로 리턴시에는 해당 유저가 존재하지않거나 변경되지 않고 끝날때 @Modifying @Query(value = "DELETE FROM subscribe WHERE fromUserId = :fromUserId AND toUserId = :toUserId", nativeQuery = true) void mUnSubscribe(int formUserId, int toUserId); //성공 1 실패 -1 로 리턴된다 }
Java
복사

*참고