본문 바로가기

⭐🌏 JPA/🌏 Native Query

Native Query를 통한 API 개발하기 [SELECT * FROM WHERE = {}]

# Natice Query에 대한 단상

Springboot에서 네이티브 쿼리를 통한 개발을 해야할때가 간혹? 있다. 아니 솔직히 네이티브 쿼리로 개발하고 싶다.

왜냐하면 편하니까... 하지만 현재 개발자들이 네이티브 쿼리를 지향하고 있는 이유는 DB 및 테이블에 종속된다는 단점이 가장 큰거같다.

 

# 하지만 장점은 퍼포먼스 차원에서 생각해 볼때 네이티브 쿼리가 훨씬 빠르다.

아래의 실험 결과를 보면, 네이티브 쿼리가 퍼포먼스 측면에서 훨씬 빠르다.

https://stackoverflow.com/questions/60412667/performance-of-native-sql-query-and-jpa

 

Performance of native sql query and JPA

I have the following methods. The first one is native sql and the second one is JPA query. @Query(value = "SELECT id AS id," + " col1 AS...

stackoverflow.com

# 네이티브 쿼리를 이용한 api 개발에 대해서 알아본다.

1. 컨트롤러에서 api를 생성한다.

    @GetMapping("/searchtitle")
    public List<BoardEntity> searchTitle(@RequestParam(value = "title") String title) {
        return boardService.searchtitle(title);
    }

- @GetMapping("/searchtitle") → 외부에서 url을 호출할때 사용하는 주소이다.

- public List<BoardEntity> searchTitle(@RequestParam(value = "title") String title) { → 외부 url 호출 시 인자값으로 title값을 넣어줘야 한다. (예시 : http://localhost:18081/api/board/searchtitle?title=안녕하세요)

- return boardService.searchtitle(title); → 입력받은 인자값을 가지고 boardService.searchtitle(title); 을 호출한다.

 

2. BoardService의 내용을 살펴보면 아래와 같다.

    public List<BoardEntity> searchtitle(String title) {
        return boardRepository.searchtitle(title);
    }

- public List<BoardEntity> searchtitle(String title) { → List<BoardEntity>를 참조하여 컨트롤러에서 넘겨받은 인자값을 받는다.

- return boardRepository.searchtitle(title); → boardRepository.searchtitle(title) 해당 경로로 이동 후 값을 반환한다.

(return은 값을 반환해 와라! 라는 의미로 받아들이면 쉽다.)

 

3. BoardRepository의 내용을 보면 아래와 같다.

    @Query(value = "select * from board where title = :title", nativeQuery=true)
    List<BoardEntity> searchtitle(@Param("title") String title);

- @Query(value = "select * from board where title = :title", nativeQuery=true) → title을 변수값으로 받는 네이티브 쿼리이다. 해당 title은 api로 전달되는 외부 인자값이다.

- List<BoardEntity> searchtitle(@Param("title") String title); → 파라미터 값 title을 BoardEntity 를 참조하여 조회 후 반환한다.

 

- BoardEntity의 내용은 아래와 같다.

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name = "board")
@Table(name = "board")
public class BoardEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(name = "title")
    private String title;

    @Column(name = "description")
    private String description;

    @Column(name = "published")
    private boolean published;

 

4. Postman과 브라우저에서 결과값 확인하기

- Postman

- 브라우저에서 확인

- 개인적으로 네이티브 쿼리 개발이 더 쉽다.

- JPQL은 네이티브 쿼리와 비슷한점도 있지만 다르다.

- 결론은 재미있다.

'⭐🌏 JPA > 🌏 Native Query' 카테고리의 다른 글

No results were returned by the query. 해결하기  (0) 2022.08.31