티스토리 뷰

구독 버튼을 누르면 실행될 컨트롤러를 만들어보자.

 

web - api -SubscribeApiController.java생성

package com.cos.photogramstart.web.api;

@RestController
public class SubscribeApiController {

	@PostMapping("/api/subscribe/{toUserId}")
	public ResponseEntity<?> subscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int id){
		return null;
	}
	
	@DeleteMapping("/api/subscribe/{toUserId}")
	public ResponseEntity<?> unSubscribe(@AuthenticationPrincipal PrincipalDetails principalDetails, @PathVariable int id){
		return null;
	}
	
}

principalDetails매개변수가 내가되고 id에 to인 당하는사람이 매개변수로 받게된다

 

그렇다면 이제 이데이터를 받아서 DB에 반영해줄 서비스가 필요하다 바로 만들러 가자.

package com.cos.photogramstart.service;

@RequiredArgsConstructor
@Service
public class SubscribeService {

	private final SubscribeRepository subscribeRepository;
	
	@Transactional
	public void 구독하기(int fromUserId, int toUserId) {
		
	}
	
	public void 구독취소하기(int fromUserId, int toUserId) {
		
	}
}

 

 

findById를 하여 테이블에서 데이터를 찾아 수정 하는것보다 네이티브 쿼리로 sql명령문에다가 바로 기입이 가능하여 훨씬 편리하다 구독같이 간단한 기능은 네이티브 쿼리가 편한데 이기능을 만들어서 넣어줄려하니 기능 만드는법을 알아보자

 

SubscribeRepository.java 인터페이스 명령문 추가

package com.cos.photogramstart.domain.subscribe;

public interface SubscribeRepository extends JpaRepository<Subscribe, Integer> {

	// insert,delete, update 를 네이티브 쿼리로 작성하려면 해당 어노테이션 필요!
	@Modifying
	@Query(value="insert into subscribe(fromUserId,toUserid,createDate) values(:fromUserId,:toUserId,now())",nativeQuery = true)
	int mSubscribe(int fromUserId, int toUserId);
	
	
	@Modifying
	@Query(value="delete from subscribe where fromUserId = :fromUserId and toUserId=:toUserId",nativeQuery = true)
	int mUnSubscribe(int fromUserId, int toUserId);
	
}

@Query(value="실행할 명령문",nativeQuery=true) 형식으로 내가원하는 명령문을 넣어주고

:fromUserId 같이  " : " 은 매개변수로 받아온 값이 " : " 에 명시된 같은 이름으로 들어가게 된다.

반환형이 int인 이유는 jsp에서 prepareStatment를 사용해본사람은 이해할것이다 

수정된 행의 개수가 리턴되고 수정된게 없다면 0을 리턴 명령문이 잘못되었다면 -1을 리턴하게된다.

nativeQuery를 true로 주셔야 작동 잘됩니다.

원래는 우리가 회원가입할때처럼 하나의 클래스로 객체를 만들어서 유효성 검사하고 넣어줬지만 구독같은 경우는 간편하게 네이티브 쿼리로 위와같이 간편하게 입력이 가능하다.

 

이제 네이티브 쿼리를 완성하였으니 서비스에 적용시키러 가보자

package com.cos.photogramstart.service;

@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;
	}
}

위처럼 간단하게 받아온 매개변수만 잘 넣어주게 되면 우리만든 네이티브 쿼리가 잘 실행된다.

성공 여부를 판단하기위헤 result에 담고 반환시켜준다

이제 돌려받은 result를 컨트롤에 넘겨주자.

 

하지만 result로 성공여부를 받아 처리하는 방식은 너무 옛날 방식이라 사용하지 않고 만약 예외가 터진다면 새로운 예외처리를 만들어서 처리할 것이라 result를 받지않고 void로 모두 바꿔 주었다. (더 편리합니다 예외 만들어 처리하는게)

 

SubscribeApiController의 추가 및 수정

package com.cos.photogramstart.web.api;

@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);
	}
	
}

원래 구독취소하기와 구독하기에 반환형을 int로 잡아 result에 저장하도록 할려하였지만 void반환형으로 바꿔 반환값이 없도록 설정하고 CMRespDto를 반환하게 하였다 무조건 성공한다고 1을반환하고 메시지와 data는 보내지 않을것이지 null로 설정 그리고 상태코드는 OK로 성공을 반환하였다.

SubscribeRepository 인터페이스, SubscribeService 의 반환형도 void로 바꿔주고 result변수를 없애줍니다.

 

계정 3개를 만들어 postman으로 요청을 보내보니 데이터가 잘 입력되고있는것을 확인할 수 있다.

 

하지만 예외처리는 아직 안되어있어서 1번이 2번을 두번 구독하는경우 500을 뱉어내고있다 이제 다음에서 예외처리를 해보자.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함