Team project/'AdvICE' 웹 서비스 프로젝트

[AdvICE] Spring Data JPA의 @Query 어노테이션 사용 방법과 메소드 이름을 이용한 쿼리 자동 생성 방법 차이점

kanado 2024. 8. 28. 23:20

1. @Query 어노테이션 사용 방법

정의: @Query 어노테이션은 Spring Data JPA에서 제공하는 기능으로, 직접 SQL이나 JPQL 쿼리를 메소드 위에 선언할 수 있게 해준다. 이를 통해 JPA 메소드 이름 규칙에 맞지 않는 복잡하거나 특수한 쿼리도 구현할 수 있다.

장점:

1. 복잡한 쿼리를 자유롭게 작성할 수 있어, 데이터베이스의 모든 기능을 최대한 활용할 수 있다.

2. 특정 데이터베이스 함수 사용, 고급 조인 조건 등 JPA에서 지원하지 않는 기능을 사용할 수 있다.

단점:

1. SQL 문법 오류가 런타임에서만 발견되기 때문에 개발 과정에서 오류를 사전에 발견하기 어렵다.

2. 쿼리가 복잡해질수록 코드의 가독성이 떨어지고 유지보수가 어려워질 수 있다.

 

2. @Query 사용 중 발생한 오류와 그 원인

초기 "AdvICE"프로젝트에서 @Query를 사용하여 특정 게시글의 댓글을 "writeDatetime" 기준으로 내림차순으로 조회하는 API를 구현했다.
그러나, 이 과정에서 예상치 못한 오류가 발생. 서버 시간과 데이터베이스에 저장된 시간의 불일치 문제로, 반환된 날짜와 시간 데이터가 스프링 부트에 설정된 시간대를 반영하여 잘못 반환되는 문제가 있다.

 

원인 분석: @Query로 직접 쿼리를 작성할 경우, JPA나 하이버네이트에서 자동으로 처리해주는 시간대 변환을 직접 관리해야 할 필요가 있습다. 이를 소홀히 하면, 애플리케이션과 데이터베이스 간 시간대 불일치 문제가 발생할 수 있다.

@Query 어노테이션 사용 방법

 

3. 메소드 이름을 이용한 쿼리 자동 생성 방법

정의: 메소드 이름을 이용한 쿼리 자동 생성 기능은 메소드의 이름만으로 SQL 쿼리를 생성하는 Spring Data JPA의 기능. 이 방법은 메소드 이름에 쿼리의 조건을 명시하여, 그에 맞는 쿼리를 자동으로 생성하게 한다.

장점:

1. 복잡한 쿼리를 작성할 필요 없이, 메소드 이름을 통해 쿼리를 정의할 수 있어 개발 과정을 간소화한다.

2. 쿼리 생성이 자동화되므로, 실수로 인한 오류 가능성이 줄어듭다.

3. 메소드 이름이 쿼리의 작동 방식을 자연스럽게 설명해줘, 코드의 가독성과 유지보수성이 향상된다.

단점:

1. 복잡한 쿼리나 특정 최적화가 필요한 경우에는 한계가 있다.

2. 데이터베이스의 특정 기능을 직접 사용하기 어려울 수 있다.

Spring Data JPA의 기능 메소드 이름을 이용한 쿼리 자동 생성 반법

 

4. Spring Data JPA의 메소드 이름을 이용한 쿼리 자동 생성 방법 적용 후 개선된 점

시간대 문제를 해결하기 위해, 메소드 이름을 사용한 쿼리 자동 생성 기능을 도입하여 시간대 처리를 JPA에 위임했다. 이로 인해 서버와 데이터베이스 간의 시간대 불일치 문제가 해결되었고, 댓글 데이터가 정확한 시간 정보와 함께 정확히 반환되기 시작됐다.