포토그램 구독하기
구독하기, 구독 취소하기 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
복사