스프링 부트3 제 9장
보이지 않는 DB에서 무슨 일이 일어난 거죠?
스프링 부트3 제 9장
JPA 로깅 설정하기
서버에 CRUD 요청을 하면 JPA 리파지터리가 DB에 해당 요청을 전달한다.
DB는 SQL로 쿼리를 작성해 요청을 처리한다.
서버에서 DB가 무엇을 하는지 알 수 있도록 JPA 로깅 설정을 해주자.
application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ... 생략
# JPA 로깅 설정
# 디버그 레벨로 쿼리 출력
logging.level.org.hibernate.SQL=DEBUG
# 퀴리 줄바꿈하기
spring.jpa.properties.hibernate.format_sql=true
# 매개변수 값 보여주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
# DB URL 설정
# 유니크 URL 생성하지 않기
spring.datasource.generate-unique-name=false
# 고정 URL 설정하기
spring.datasource.url=jdbc:h2:mem:testdb
로깅 레벨에는 7단계가 있다.
- TRACE: DEBUG 레벨보다 더 상세한 정보
- DEBUG: 앱을 디버깅하는 데 필요한 세부 정보
- INFO: 앱의 순조로운 진행 정보
- WARN: 잠재적으로 유해한 상황 정보
- ERROR: 앱이 수행할 수 있는 정도의 오류 정보
- FATAL: 앱이 중단될 만한 심각한 오류 정보
- OFF: 로깅 기능 해제
쿼리를 줄바꿈하는 이유는 한눈에 보기 좋게 로그를 보기 위해서이다.
매개변수 확인 코드를 넣은 이유는 종종 로그에 물음표를 볼 수 있는데, 그 값을 확인하기 위해서이다.
id가 겹치는 에러
data.sql로 DB를 초기화 할 때, id를 1번부터 넣게 설정했다. 이렇게 하면 새 게시글을 작성할 때, id가 중복되어 에러가 발생한다.
따라서 DB가 자동으로 id를 생성하도록 설정해주었다.
Article.java
1
2
3
4
// ... 생략
@Id // 엔티티의 대푯값 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id 자동 생성
private Long id; // 아이디 필드
엔티티 파일 id 변수의 @GeneratedValue 어노테이션에 strategy = GenerationType.IDENTITY를 추가하면 DB가 알아서 id를 자동 생성하게 할 수 있다.
data.sql
1
2
3
insert into article(title, content) values ('aaaa', '1111');
insert into article(title, content) values ('bbbb', '2222');
insert into article(title, content) values ('cccc', '3333');
id는 필요 없으니 없애주었다.
CRUD 시 로그 확인
insert
1
2
3
4
5
6
7
8
9
2025-02-24T14:27:32.713+09:00 INFO 6656 --- [firstproject] [nio-8080-exec-4] c.e.f.controller.ArticleController : Article(id=null, title=제목제목, content=내용내용)
2025-02-24T14:27:32.730+09:00 DEBUG 6656 --- [firstproject] [nio-8080-exec-4] org.hibernate.SQL :
insert
into
article
(content, title, id)
values
(?, ?, default)
2025-02-24T14:27:32.764+09:00 INFO 6656 --- [firstproject] [nio-8080-exec-4] c.e.f.controller.ArticleController : Article(id=4, title=제목제목, content=내용내용)
select
1
2
3
4
5
6
7
8
9
2025-02-24T14:27:37.050+09:00 DEBUG 6656 --- [firstproject] [nio-8080-exec-7] org.hibernate.SQL :
select
a1_0.id,
a1_0.content,
a1_0.title
from
article a1_0
where
a1_0.id=?
update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2025-02-24T14:34:45.911+09:00 INFO 7236 --- [firstproject] [nio-8080-exec-5] c.e.f.controller.ArticleController : Article(id=2, title=제목제목제목, content=내용내용내용)
2025-02-24T14:34:45.911+09:00 DEBUG 7236 --- [firstproject] [nio-8080-exec-5] org.hibernate.SQL :
select
a1_0.id,
a1_0.content,
a1_0.title
from
article a1_0
where
a1_0.id=?
2025-02-24T14:34:45.953+09:00 DEBUG 7236 --- [firstproject] [nio-8080-exec-5] org.hibernate.SQL :
update
article
set
content=?,
title=?
where
id=?
delete
1
2
3
4
5
6
7
2025-02-24T14:35:48.405+09:00 INFO 7236 --- [firstproject] [nio-8080-exec-9] c.e.f.controller.ArticleController : Article(id=2, title=제목제목제목, content=내용내용내용)
2025-02-24T14:35:48.409+09:00 DEBUG 7236 --- [firstproject] [nio-8080-exec-9] org.hibernate.SQL :
delete
from
article
where
id=?
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.