Closed wongakim-99 closed 3 months ago
서버에서 데이터의 생성, 조회, 수정, 삭제 등을 요청하면 JPA의 리파지터리가 DB에 해당 요청을 전달한다. 요청을 받은 DB는 자신의 언어, SQL로 쿼리를 작성해 테이블 속 데이터를 관리한다. 여기서 쿼리(query)란 DB에 정보를 요청하는 구문을 말한다. 데이터의 생성은 INSERT문, 조회는 SELECT문, 수정은 UPDATE문, 삭제는 DELETE문을 사용한다.
로깅 레벨은 7단계가 있다. TRACE(레벨1), DEBUG(레벨2), INFO(레벨3), WARN(레벨4), ERROR(레벨5), FATAL(레벨6), OFF(레벨7) 순이다.
- TRACE(레벨1) : DEBUG 레벨보다 더 상세한 정보 - DEBUG(레벨2) : 응용프로그램을 디버깅하는 데 필요한 세부 정보 - INFO(레벨3) : 응용 프로그램의 순조로운 진행 정보 - WARN(레벨4) : 잠재적으로 유해한 상황 정보 - ERROR(레벨5) : 응용 프로그램이 수행할 수 있는 정도의 오류 정보 - FATAL(레벨6) : 응용 프로그램이 중단될 만한 심각한 오류 정보 - OFF(레벨7) : 로깅 기능 해제
먼저 유니크 URL 설정을 false로 하고, 그 다음으로 어떤 값을 고정 URL로 할 건지 적어 준다. 여기서는 jdbc:h2:mem:testdb 라는 고정 URL을 사용하겠다.
그러고 나서 앞으로 h2-console db에 접속할 때 서버를 재시작하고 다시 새로운 유니크 URL을 찾는게 아니라 고정 URL인 jdbc:h2:mem:testdb 을 사용해서 접속하면 된다.
앞에서 JPA 로깅 설정을 마쳤다. 이제 서버에서 데이터를 생성, 조회, 수정, 삭제할 때 내부에서 어떤 SQL 쿼리가 동작하는지 로그를 통해 확인할 수 있다.
가장 먼저 데이터를 생성(Create)할 때 어떤 SQL 쿼리가 동작하는지 확인해 보겠다.
만약 서버를 실행하고 테스트를 위해 제목에다가 "ㅂㅈㄷㄱ" 입력 내용에다가 "ㅌㅋㅊㅍ" 입력하고 submit 버튼을 누르면 오류가 뜰 것이다.
그 이유는 data.sql 파일을 열어 보면 3개의 더미 데이터를 생성하는 INSERT 문이 있다. 서버를 재시작할 때마다 더미 데이터를 생성하는 코드이다. 근데 id가 1번부터 3번까지 있는데 entity 패키지의 Article.java 코드를 보면 @Id, @GeneratedValue 로 인해서 자동으로 ID가 1부터 설정이 되는 것이다.
추가로 인텔리제이 실행 로그창을 보면 Unique index or primary key violation 이라고 뜰 것이다. 바로 ID가 겹쳐서 이런 문제가 발생한 것이다.
엔티티 패키지에 Article.java 파일을 오픈한다. id 변수에 @Id 와 @GeneratedValue 어노테이션이 있다. id를 자동 생성하기 위해 붙인 건데, 이 코드를 수정해 DB가 알아서 id를 넣을 수 있도록 하겠다.
@GeneratedValue(strategy = GenerationType.IDENTITY)
데이터를 조회(Read)할 때는 어떤 SQL 쿼리가 동작하는지 확인해 보겠다.
SELECT 절에는 조회할 속성인 id, content, title이 있고 FROM 절에는 조회할 테이블명인 article이 있다. 이는 article 테이블에서 id, content, title을 조회하라는 쿼리이다. 이 쿼리가 수행돼 목록 페이지에서 모든 게시글을 볼 수 있다.
// JPA 로깅 설정
// 디버그 레벨로 쿼리 출력
logging.level.org.hibernate.SQL=DEBUG
// 쿼리 줄바꿈하기
spring.jpa.properties.format_sql=true
// 매개변수 값 보여 주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id 자동 생성
DB의 데이터는 JPA의 리파지터리를 통해 관리한다고 배웠다. 서버에서 CRUD를 수행했을 때 내부적으로 어떤 SQL쿼리가 동작하는지 살펴본다. 그리고 DB에서 직접 SQL 쿼리로 조작해 본다.