[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, 로깅 기능 해제
이제 쿼리가 실행될 때마다 콘솔에서 위와 같이 확인할 수 있게 됐다!
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
설정한 값으로 고정되었다.
SQL 쿼리 로그 확인하기
데이터를 추가한 후 콘솔을 살펴보면 위와 같은 쿼리가 찍혀있다.
DB가 알아서 id
를 생성해주기 때문에 id
값에는 default
가, content
와 title
은 데이터가 들어가기 때문에 ?
가 들어가있다.
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