CRUD 과정을 해보면서 sql 쿼리를 연습해보자
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true
#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 생성 X
spring.datasource.generate-unique-name=false
#고정 URL 설정
spring.datasource.url=jdbc:h2:mem:testdb
먼저 application.properties 에 설정을 몇가지 해줘야 한다.
sql을 로깅하기 위한 설정과 db url을 고정해주기 위한 설정을 해줬다.
그리고 sql 쿼리가 보일 때 파라미터는 ?로 보이게 되는데 그 ?가 어떤 파라미터인지 표시된다.
h2-console에 접속할 때 계속 jdbc 검색해서 주소 찾아서 들어갔었는데 이제 그냥 jdbc:h2:mem:testdb 로 입력해서 가면 된다. (고정됨)
이렇게 하고 db 로그를 확인해 보려고 /articles 에 드가서
이렇게 입력하고 제출을 누르면 에러가 발생한다..
이유는 더미 데이터를 3개 (각각 id 1, 2, 3)으로 이미 만들어 놨는데 id가 1인 데이터가 또 생기기 때문이다. 데이터의 id는(대표값) 겹치면 안된다.
package com.example.firstproject.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
@Getter
@Entity // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
@AllArgsConstructor
@NoArgsConstructor //디폴트 생성자 추가
@ToString
public class Article {
@Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동생성함
private Long id;
@Column //DB가 필드를 인식할 수 있게 해줌
private String title;
@Column
private String content;
}
해결하기 위해서 엔티티 클래스에서 어노테이션을 살짝 수정해준다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동생성함
id 어노테이션에 stratgey를 추가해줘서 원래는 1부터 자동생성이었는데 이제 db가 id를 알아서 자동생성하도록 했다.
먼저 CRUD 할 때 어떤 쿼리들이 실행되는지 한번 쭉 확인해보자
R
밑줄 친 부분만 보면된다
U
package com.example.firstproject.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.*;
@Getter
@Entity // 이 어노테이션을 붙여야 DB가 이 객체를 인식한다
@AllArgsConstructor
@NoArgsConstructor //디폴트 생성자 추가
@ToString
public class Article {
@Id // 각 객체를 식별하기 위한 Id임 (주민번호 같은거)
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동생성함
private Long id;
@Column //DB가 필드를 인식할 수 있게 해줌
private String title;
@Column
private String content;
}
Article.java에 보면 @Entitiy 어노테이션과 @Column 어노테이션으로 엔티티 클래스를 db가 인식할 수 있게 했는데 이게 바로 이름이 Article인 테이블을 만들고 컬럼은 title, content, id가 있게 하는 것이다.
이러한 이유로 서버를 처음에 시작하면 이런 sql 문이 표시된다.
그리고 CRUD 쿼리 사용 하는것을 강의에서 쭉 진행하는데 나는 부스트코스 강의 들으면서 정리한 내용이 있고 위 스샷도 있으니까 따로 정리는 안하겠음