Post

[Spring Boot] CRUD할 때 DB에서는 무슨 일이 일어날까?🤔

JPA 로깅 설정하기

서버에서 데이터의 생성, 조회, 수정, 삭제 등을 요청하면 JPA의 리파지터리가 DB에 해당 요청을 전달한다.

요청을 받은 DB는 SQL로 쿼리를 작성해 테이블 속 데이터를 관리한다.

이제 내부에서 어떤 쿼리가 실행되는지 알아보기 위해 JPA 로깅 설정을 해보자.

application.properties 파일에 다음과 같이 작성한다.

1
2
3
4
5
6
# JPA 로깅 설정
logging.level.org.hibernate.SQL=DEBUG
# 매개변수 값 보여주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# 쿼리 줄바꿈하기
spring.jpa.properties.hibernate.format_sql=true

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

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

JPA Logging - 1

이제 쿼리가 실행될 때마다 콘솔에서 위와 같이 확인할 수 있게 됐다!

JDBC URL 고정하기

프로젝트 생성 후 아무것도 설정하지 않으면 H2 DB에 접속할 때 매번 JDBC URL을 검색하게 된다. 따라서 접속할 때 불편함이 있으므로 URL을 고정시켜준다.

application.properties 파일에 다음과 같이 적는다.

1
2
3
4
5
# DB URL 설정
# 유니크 URL 생성하지 않기
spring.datasource.generate-unique-name=false
# 고정 URL 설정하기
spring.datasource.url=jdbc:h2:mem:testdb

JDBC fix url

설정한 값으로 고정되었다.

SQL 쿼리 로그 확인하기

SQL Query - INSERT

데이터를 추가한 후 콘솔을 살펴보면 위와 같은 쿼리가 찍혀있다.

DB가 알아서 id를 생성해주기 때문에 id값에는 default가, contenttitle은 데이터가 들어가기 때문에 ?가 들어가있다.

id 자동 생성 전략 추가 - Primary key 설정

지금은 더미 데이터가 아래와 같이 존재하고 있다.

1
2
3
INSERT INTO article(id, title, content) VALUES(1, '가가가가', '1111');
INSERT INTO article(id, title, content) VALUES(2, '나나나나', '2222');
INSERT INTO article(id, title, content) VALUES(3, '다다다다', '3333');

서버를 재시작할 때마다 더미데이터를 생성하는데, 새 게시글을 작성할 때 id를 1번부터 넣게했기 때문에 에러가 발생한다.

1
2
3
@Id
    @GeneratedValue
    private Long id;

Article.java

따라서 중복되지 않는 기본키로 설정해주고 DB가 알아서 id를 넣어주도록 하기 위해 @GeneratedValue 어노테이션의 속성을 다음과 같이 설정해준다.

1
2
3
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

이제 DB가 id를 자동 생성하므로 data.sql에 입력값으로 준 id 속성과 속성 값을 삭제한다.

1
2
3
INSERT INTO article(title, content) VALUES('가가가가', '1111');
INSERT INTO article(title, content) VALUES('나나나나', '2222');
INSERT INTO article(title, content) VALUES('다다다다', '3333');

🔗 참고자료

📚 더 공부해야 할 것

  • @GeneratedValue
This post is licensed under CC BY 4.0 by the author.