~9.3 기본 SQL 쿼리 작성하기(종이책 p.249~274)
서버에서 데이터의 생성, 조회, 수정, 삭제 등을 요청하면 JPA의 리파지터리가 DB에 해당 요청을 전달한다. 요청을 받은 DB는 자신의 언어, 즉 SQL로 쿼리를 작성해 테이블 속 데이터를 관리한다.
먼저 JPA 로깅 설정을 한다.
resources/application.properties 파일에 다음과 같은 코드를 추가한다.
logging.level.org.hibernate.SQL=DEBUG
로깅 레벨은 7단계가 있으며, 출력 레벨을 설정하면 해당 레벨 이상의 로그가 출력된다.
여기서는 로그 레벨을 DEBUG로 설정한다.
서버를 실행해보면 SQL 쿼리가 로그로 찍히는 것을 확인 할 수 있다.
쿼리들이 한 줄로 나오므로 보기 편하게 정렬해준다.
spring.jpa.properties.hibernate.format_sql=true
또한 JPA 쿼리에서 DB로 넘어가는 매개변수 값을 확인하는 코드를 추가해준다.
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
마지막으로, 그동안 H2 DB에 접속할 때 매번 JDBC URL을 검색해서 입력했는데 이 URL 값을 고정시킨다.
// 유니크 URL 생성하지 않기
spring.datasource.generate-unique-name=false
// 고정 URL 설정하기
spring.datasource.url=jdbc:h2:mem:testdb
이제 서버를 재시작하고 localhost:8080/h2-console 페이지에 접속해 고정 URL(jdbc:h2:mem:testdb)을 입력하면 접속할 수 있다.
localhost:8080/articles에 접속해 데이터를 하나 만들고 Submit 하면 에러 페이지가 뜬다.
이전에 더미 데이터를 id 1,2,3 으로 넣었는데 새 게시글을 작성할 때 id를 1번으로(Article.java에서 id 값을 자동으로 1씩 증가) 만들어서, 중복이 된 것이다.
이렇게 테이블에 저장된 각 데이터를 유일하게 구분할 수 있도록 지정한 속성을 기본키(primary key)라고 하고 중복되어서는 안된다.
이러한 중복을 막기위해 이전에 resources/entity/Article.java에서 작성했던 @GeneratedValue 어노테이션을 다음과 같이 수정해준다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
이러면 앞으로 데이터를 생성할 때마다 DB가 알아서 id에 값을 넣어준다.
이제 DB가 id를 자동으로 생성하므로 data.sql에 입력값으로 준 id 속성과 속성값 1,2,3을 삭제한다.
실제로 쿼리가 어떤식으로 동작하는지를 알아보기 위해 데이터 생성, 조회, 수정, 삭제를 직접 해보고 로그를 확인해본다.
데이터 생성시: INSERT 문


데이터 조회시: SELECT 문


데이터 수정 시: UPDATE 문

데이터 삭제 시: DELETE 문

앞에서 실행한 로그를 보면 CREATE TABLE 문이 있는 것을 확인할 수 있다. 이것은 테이블을 만드는 쿼리이다.
이 쿼리는 entity/Article.java에서 쓴 @Entity 어노테이션이 DB가 해당 객체를 인식할 수 있게 해주었기 때문에 동작하는 것이다. 해당 클래스로 테이블을 만들라는 뜻이다.
CREATE TABLE 문의 형식은 다음과 같다.
CREATE TABLE 테이블명 {
속성명1 자료형,
속성명2 자료형,
속성명3 자료형,
PRIMARY KEY (기본키)
};
※ 생성 테이블을 클래스명이 아닌 특정 값으로 명시하고 싶으면 엔티티 클래스에 @Table 어노테이션을 사용하면 된다.