길벗 코딩자율학습단 9일차

donghan378·2025년 1월 19일

9일차

~9.3 기본 SQL 쿼리 작성하기(종이책 p.249~274)

9장 CRUD와 SQL 쿼리 종합

9.1 JPA 로깅 설정하기

서버에서 데이터의 생성, 조회, 수정, 삭제 등을 요청하면 JPA의 리파지터리가 DB에 해당 요청을 전달한다. 요청을 받은 DB는 자신의 언어, 즉 SQL로 쿼리를 작성해 테이블 속 데이터를 관리한다.

  • 쿼리(query)란 DB에 정보를 요청하는 구문을 말한다.

먼저 JPA 로깅 설정을 한다.

resources/application.properties 파일에 다음과 같은 코드를 추가한다.

logging.level.org.hibernate.SQL=DEBUG

로깅 레벨은 7단계가 있으며, 출력 레벨을 설정하면 해당 레벨 이상의 로그가 출력된다.

  • TRACE(레벨1): DEBUG 레벨보다 더 상세한 정보
  • DEBUG(레벨2): 응용 프로그램을 디버깅하는 데 필요한 세부 정보
  • INFO(레벨3): 응용 프로그램의 순조로운 진행 정보
  • WARN(레벨4): 잠재적으로 유해한 상황 정보
  • ERROR(레벨5): 응용 프로그램이 수행할 수 있는 정도의 오류 정보
  • FATAL(레벨6): 응용 프로그램이 중단될 만한 심각한 오류 정보
  • OFF(레벨7): 로깅 기능 해제

여기서는 로그 레벨을 DEBUG로 설정한다.
서버를 실행해보면 SQL 쿼리가 로그로 찍히는 것을 확인 할 수 있다.

쿼리들이 한 줄로 나오므로 보기 편하게 정렬해준다.

  • appcliation.properties 파일에 다음과 같은 코드를 추가해준다.
	spring.jpa.properties.hibernate.format_sql=true

또한 JPA 쿼리에서 DB로 넘어가는 매개변수 값을 확인하는 코드를 추가해준다.

  • appcliation.properties 파일에 다음과 같은 코드를 추가해준다.
	logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

마지막으로, 그동안 H2 DB에 접속할 때 매번 JDBC URL을 검색해서 입력했는데 이 URL 값을 고정시킨다.

  • appcliation.properties 파일에 다음과 같은 코드를 추가해준다.
	// 유니크 URL 생성하지 않기
	spring.datasource.generate-unique-name=false

	// 고정 URL 설정하기
	spring.datasource.url=jdbc:h2:mem:testdb

이제 서버를 재시작하고 localhost:8080/h2-console 페이지에 접속해 고정 URL(jdbc:h2:mem:testdb)을 입력하면 접속할 수 있다.

9.2 SQL 쿼리 로그 확인하기

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을 삭제한다.

실제로 쿼리가 어떤식으로 동작하는지를 알아보기 위해 데이터 생성, 조회, 수정, 삭제를 직접 해보고 로그를 확인해본다.

  1. 데이터 생성시: INSERT 문

    • localhost:8080/articles에 접속해 New Article을 클릭하고 제목과 내용을 입력한후 Submit 하고 로그를 살펴본다.

      ?, ? 부분은 바로 아래 로그에서 Article 객체를 보면 알 수 있다.
  2. 데이터 조회시: SELECT 문

    • localhost:8080/articles에 접속했을 때 수행되는 쿼리를 확인해본다.
    • 4번 데이터만 조회해보면 다음과 같이 수행한다.

      where절이 추가로 들어가는 것을 확인할 수 있고, id의 ?값은 위의 로그에서 확인할 수 있다.
  3. 데이터 수정 시: UPDATE 문

    • 4번 데이터 페이지에서 Edit 버튼으로 수정한 후 확인해본다.
  4. 데이터 삭제 시: DELETE 문

    • 4번 데이터 페이지에서 Delete 버튼으로 삭제 후 확인해본다.

9.3 기본 SQL 쿼리 작성하기

앞에서 실행한 로그를 보면 CREATE TABLE 문이 있는 것을 확인할 수 있다. 이것은 테이블을 만드는 쿼리이다.

이 쿼리는 entity/Article.java에서 쓴 @Entity 어노테이션이 DB가 해당 객체를 인식할 수 있게 해주었기 때문에 동작하는 것이다. 해당 클래스로 테이블을 만들라는 뜻이다.

CREATE TABLE 문의 형식은 다음과 같다.

CREATE TABLE 테이블명 {

	속성명1 자료형,

	속성명2 자료형,

	속성명3 자료형,

	PRIMARY KEY (기본키)

};

※ 생성 테이블을 클래스명이 아닌 특정 값으로 명시하고 싶으면 엔티티 클래스에 @Table 어노테이션을 사용하면 된다.

0개의 댓글