실행된 SQL문의 확인이 필요한 이유
Spring Data JPA를 사용하면 JpaRepository를 상속해 기본적인 CRUD가 가능한 함수들을 사용할 수 있다. 하지만, 이 함수들을 사용하면, JPA에서 알아서 SQL문을 만들어서 쿼리하기 때문에 어떤 SQL문이 실행되는지 확인하기 어렵다. 대부분의 상황에서 이것은 문제가 되지 않지만, 만약 버그가 일어났다면 어떤 SQL문 때문에 문제가 생겼는지 확인해야 한다.
Spring Data JPA는 이를 위해 실행되는 SQL문을 로깅할 수 있는 기능을 제공한다. 지금부터 이 방법에 대해 알아보자.
실행된 SQL문 로깅하기
실행된 SQL문을 로깅하도록 설정하기 위해서는 application.properties 파일에 다음과 같은 설정을 추가해야 한다.
spring.jpa.show-sql=true
그런 후 이전 글에서 만든 다음 addVocabulary 함수를 호출해보자.
@RestController
class VocabularyController(
private val vocabularyRepository: VocabularyRepository
) {
...
@PostMapping("/vocabulary")
fun addVocabulary(
@RequestParam word: String,
@RequestParam meaning: String
): Vocabulary {
val vocabulary = Vocabulary(word = word, meaning = meaning)
return vocabularyRepository.save(vocabulary)
}
...
}
HTTP 요청은 다음과 같다.
POST http://localhost:8080/vocabulary
Content-Type: application/x-www-form-urlencoded
word=abc&meaning=xyz
그러면 Vocabulary를 입력하는 SQL문이 실행되고, 다음과 같이 성공 응답이 오는 것을 확인할 수 있다.
이제 로그를 확인해보자. 그러면 다음과 같이 어떤 쿼리가 실행됐는지에 대한 정보가 나오는 것을 볼 수 있다.
로깅 시 SQL문 포멧팅 될 수 있도록 하기
위에서는 어떤 SQL문이 실행됐는지 확인할 수 있지만 포멧팅이 되지 않아 가독성이 나쁘다. 이런 문제를 해결하기 위해 Spring Data JPA는 SQL문을 포멧팅 하는 기능도 제공한다. 포멧팅하는 방법은 간단하다. 단순히 application.properties 파일에 다음과 같은 설정을 추가하면 된다.
# SQL 포맷팅
spring.jpa.properties.hibernate.format_sql=true
이제 다시 애플리케이션을 실행해 POST 요청을 날려보자. 그러면 다음과 같이 실행된 SQL문이 포멧팅 되는 것을 확인할 수 있다.
전체 코드: GitHub
이 프로젝트가 도움이 되셨다면 저장소에 Star⭐️를 눌러주세요! Stargazers는 다음 페이지에서 확인할 수 있습니다.