본문 바로가기
Spring/JPA + Security

[Spring Data JPA] JPA를 사용한 구독하기 2 - 네이티브 쿼리 짜기

by pyogowoon 2023. 1. 8.
@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;
    }
}

 

import com.pyo.yourspick.domain.subscribe.SubscribeRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


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


}
 

기본적인 틀 만들어주고

 

 

 

public interface SubscribeRepository extends JpaRepository<Subscribe , Integer> {

    @Modifying
    @Query(value = "INSERT INTO subscribe(fromUserId ,toUserId,createDate) VALUES( :fromUserId, :toUserId, now())", nativeQuery = true)
 int mSubscribe(@Param("fromUserId") int fromUserId, @Param("toUserId")int toUserId);

    @Modifying
    @Query(value = "DELETE FROM subscribe WHERE fromUserId = :fromUserId AND toUserId = :toUserId" , nativeQuery = true)
 int mUnSubscribe(@Param("fromUserId") int fromUserId,  @Param("toUserId") int toUserId);

}

 

@Modifying 과 쿼리 뒤에 nativeQuery = true 붙이는걸 잊지말자.

 

 JDBC랑 비슷하다고 보면 된다. 쿼리문을 보면  : 이 있는데 이게 JDBC의 ? 역할을 한다. 매개변수를 바인딩해서 넣어준다.

 

  @Param은 java-8 버전부터 붙여줘야한다고 한다. 문법이다

 

 그리고 우리가 작성시간 넣을때 createDate 를 사용했었는데 이건 네이티브 쿼리라 직접 넣어줘야한다.

댓글