wongakim-99 / Spring-study

스프링 공부방 (백엔드 공부)
0 stars 0 forks source link

CRUD와 SQL 쿼리 종합 #10

Closed wongakim-99 closed 3 months ago

wongakim-99 commented 3 months ago

DB의 데이터는 JPA의 리파지터리를 통해 관리한다고 배웠다. 서버에서 CRUD를 수행했을 때 내부적으로 어떤 SQL쿼리가 동작하는지 살펴본다. 그리고 DB에서 직접 SQL 쿼리로 조작해 본다.

wongakim-99 commented 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) : 로깅 기능 해제

wongakim-99 commented 3 months ago

먼저 유니크 URL 설정을 false로 하고, 그 다음으로 어떤 값을 고정 URL로 할 건지 적어 준다. 여기서는 jdbc:h2:mem:testdb 라는 고정 URL을 사용하겠다.

그러고 나서 앞으로 h2-console db에 접속할 때 서버를 재시작하고 다시 새로운 유니크 URL을 찾는게 아니라 고정 URL인 jdbc:h2:mem:testdb 을 사용해서 접속하면 된다.

wongakim-99 commented 3 months ago

SQL 쿼리 로그 확인하기

앞에서 JPA 로깅 설정을 마쳤다. 이제 서버에서 데이터를 생성, 조회, 수정, 삭제할 때 내부에서 어떤 SQL 쿼리가 동작하는지 로그를 통해 확인할 수 있다.

wongakim-99 commented 3 months ago

데이터 생성 시 : INSERT 문

가장 먼저 데이터를 생성(Create)할 때 어떤 SQL 쿼리가 동작하는지 확인해 보겠다.

만약 서버를 실행하고 테스트를 위해 제목에다가 "ㅂㅈㄷㄱ" 입력 내용에다가 "ㅌㅋㅊㅍ" 입력하고 submit 버튼을 누르면 오류가 뜰 것이다.

그 이유는 data.sql 파일을 열어 보면 3개의 더미 데이터를 생성하는 INSERT 문이 있다. 서버를 재시작할 때마다 더미 데이터를 생성하는 코드이다. 근데 id가 1번부터 3번까지 있는데 entity 패키지의 Article.java 코드를 보면 @Id, @GeneratedValue 로 인해서 자동으로 ID가 1부터 설정이 되는 것이다.

추가로 인텔리제이 실행 로그창을 보면 Unique index or primary key violation 이라고 뜰 것이다. 바로 ID가 겹쳐서 이런 문제가 발생한 것이다.

wongakim-99 commented 3 months ago

문제 해결

엔티티 패키지에 Article.java 파일을 오픈한다. id 변수에 @Id 와 @GeneratedValue 어노테이션이 있다. id를 자동 생성하기 위해 붙인 건데, 이 코드를 수정해 DB가 알아서 id를 넣을 수 있도록 하겠다.

@GeneratedValue(strategy = GenerationType.IDENTITY)
wongakim-99 commented 3 months ago

데이터 조회 시 : SELECT 문

데이터를 조회(Read)할 때는 어떤 SQL 쿼리가 동작하는지 확인해 보겠다.

SELECT 절에는 조회할 속성인 id, content, title이 있고 FROM 절에는 조회할 테이블명인 article이 있다. 이는 article 테이블에서 id, content, title을 조회하라는 쿼리이다. 이 쿼리가 수행돼 목록 페이지에서 모든 게시글을 볼 수 있다.

wongakim-99 commented 3 months ago

마무리

  1. JPA 로깅 설정 JPA 동작 시 로그를 보기 위한 설정은 application.properties 파일에 작성한다. 로깅 레벨은 총 7단계 중 하나를 선택할 수 있는데, SQL 로그를 보려면 DEBUG 레벨로 설정한다. SQL 쿼리에 줄바꿈을 적용해서 보려면 format_sql 옵션을 true로 설정하고, JPA 쿼리에서 DB로 넘어가는 매개변수 값을 확인하기 위해 sql의 BasicBinder 를 TRACE로 설정한다.
// JPA 로깅 설정
// 디버그 레벨로 쿼리 출력
logging.level.org.hibernate.SQL=DEBUG

// 쿼리 줄바꿈하기
spring.jpa.properties.format_sql=true

// 매개변수 값 보여 주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
  1. 기본키와 ID 자동 생성 전략 기본키(Primary key)란 테이블에 저장된 각 데이터를 유일하게 구분할 수 있도록 지정한 속성을 말한다. 보통 id를 기본키로 많이 사용하는데, @GeneratedValue 어노테이션의 전략을 IDENTITY로 설정하면 DB가 id를 자동으로 생성하므로 id 값이 중복되지 않는다.
@GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id 자동 생성
  1. CRUD와 SQL 쿼리 서버에서 데이터의 생성, 조회, 수정, 삭제 등의 CRUD 요청을 하면 JPA의 리파지터리가 DB에 해당 요청을 전달 한다. 요청을 받은 DB는 자신의 언어인 SQL로 작성한 쿼리를 사용해 테이블에서 데이터를 관리한다. 데이터의 생성 요청이 들어왔을 때는 INSERT문, 조회 요청이 들어왔을 때는 SELECT 문, 수정 요청이 들어왔을 때는 UPDATE문, 삭제 요청이 들어왔을 때는 DELETE문을 수행한다.