본문 바로가기

Back-End/SpringBoot

[스프링 부트 입문 17]CRUD와 SQL 쿼리

728x90
* 학습목표
데이터 CRUD 과정의 SQL 쿼리를 분석하시오.

실습 개요
1. 각 과정에서 수행되는 Query를 log로 확인해보기.
2. 확인된 log로 DB에서 직접 사용해보는 훈련

JPA 로깅 설정.
application.properties 파일에

# JPA 로깅 설정
# 디버그 레벨로 쿼리 출력
logging.level.org.hibernate.SQL=DEBUG
//SQL을 출력할때는 DEBUG레벨을 사용한다.
회사에서 업무를 하게되면, 무분별한 로그때문에 로그 확인시 어려움을 겪게되는데,
불필요한 로그로 인해 비지니스 로그를 찾기 힘들어진다.
그래서 레벨을 설정해주어 필요한 부분의 로그만 가져간다.

# Log Level 종류
# TRACE : 추적 레벨은 Debug보다 좀더 상세한 정보를 나타냄
# DEBUG : 프로그램을 디버깅하기 위한 정보 지정
# INFO :  상태변경과 같은 정보성 메시지를 나타냄
# WARN :  처리 가능한 문제, 향후 시스템 에러의 원인이 될 수 있는 경고성 메시지를 나타냄
# ERROR :  요청을 처리하는 중 문제가 발생한 경우
# FATAL :  아주 심각한 에러가 발생한 상태, 시스템적으로 심각한 문제가 발생해서 어플리케이션 작동이 불가능할 경우

# 이쁘게 보여주기()
spring.jpa.properties.hibernate.format_sql=true

쿼리가 한줄로 출력되는걸
포맷을 설정해줘서 해당 형태로 출력한다.

    create table article (
       id bigint generated by default as identity,
        content varchar(255),
        title varchar(255),
        primary key (id)
    )

# 파라미터 보여주기
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
쿼리를 던지다보면 ? 값에 어떤 변수기 담겨있는지 볼 수 있게 해준다.

매번 H2 DB 접근할 때마다
콘솔에서 JDBC URL을 찾아 검색해서 Connect 하는게 귀찮으니
# DB URL 고정 설정을 해준다.
# 유니크 URL 생성 X
spring.datasource.generate-unique-name=false
# 고정 url 설정
spring.datasource.url=jdbc:h2:mem:testdb
                        //JDBC URL,, 앞으로 이걸로만 접속.
서버를 실행하면 이제 JDBC URL값을 바꿔줄 필요가 없다.

게시물을 생성하면 데이터 id 중복 에러가 나는데
데이터의 대표값은 겹치면 안된다.

ID 자동 생성 전략
entity/Article 에
    @id // 대표값을 지정! like a 주민등록번호
    @GeneratedValue() -> @GeneratedValue(strategy = GenerationType.IDENTITY)
                                                         //DB가 id 값을 자동 생성 한다.
    private Long id;

생성(INSERT) 쿼리
    insert
    into
        article
        (id, content, title)
    values
        (default, ?, ?)

조회(SELECT) 쿼리
    select
        article0_.id as id1_0_,
                  //aliasing 처리가 되었는데 무시.
        article0_.content as content2_0_,
        article0_.title as title3_0_
    from
        article article0_
----------------------------------------------------------
조회(SELECT) 특정 게시물 처리 쿼리
    select
        article0_.id as id1_0_0_,
        article0_.content as content2_0_0_,
        article0_.title as title3_0_0_
    from
        article article0_
    where
    //어디서?
        article0_.id=?
                   //1번

2022-05-05 16:35:16.739 TRACE 8356 --- [nio-8080-exec-4] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]

갱신(UPDATE) 쿼리
    update
        article
    set
        content=?,
        title=?
    where
        id=?

2022-05-05 16:37:07.144 TRACE 8356 --- [io-8080-exec-10] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [VARCHAR] - [4444]
2022-05-05 16:37:07.144 TRACE 8356 --- [io-8080-exec-10] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [VARCHAR] - [라라라라]
2022-05-05 16:37:07.145 TRACE 8356 --- [io-8080-exec-10] o.h.type.descriptor.sql.BasicBinder      : binding parameter [3] as [BIGINT] - [1]

삭제(DELETE) 쿼리
    delete
    from
        article
    where
        id=?
2022-05-05 16:37:51.737 TRACE 8356 --- [nio-8080-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [1]
                                                                                                                                                                        //1번게시물 삭제처리

기본 SQL 쿼리 연습
http://localhost:8080/h2-console DB 접속
JDBC URL은 이제 고정 값으로 사용하기에 건들 필요가 없다.

테이블 생성이 왜 만들어지는가?
entity/Article 파일에
@entity // DB가 해당 객체를 인식 가능! (해당 클래스로 테이블을 만든다.)

public class Article {
    @id // 대표값을 지정! like a 주민등록번호
    @GeneratedValue(strategy = GenerationType.IDENTITY) // DB가 id를 자동 생성 어노테이션!
    private Long id;

    @column // DB에 테이블이라는 단위에 연결해줌.
    private String title;

    @column
    private String content;
}

아래의 쿼리문으로 테이블이 생성된다.

    create table article (
       id bigint generated by default as identity,
        content varchar(255),
        title varchar(255),
        primary key (id)
    );

H2 DB에 실습을 위한 테이블 생성
    create table coffee(
        id bigint generated by default as identity,
        name varchar(255),
        price varchar(255),
        primary key (id)
    );

데이터를 집어 넣기 위해 INSERT문 사용
    insert
    into
        coffee
        (id, name, price)
    values
        (1, '아메리카노', 4100);

    insert
    into
        coffee
        (id, name, price)
    values
        (2, '라떼', 4600),
        (3, '모카', 5100),
        (4, '오늘의 커피', 3800);

4개의 데이터 삽입

커피데이터 조회
    select
      id, name, price
    from
      coffee
    where
       id = 3;
3번 데이터인 모카 출력

    select
      id, name, price
    from
      coffee;
전체 데이터 출력

커피 데이터 갱신
    update
        coffee
    set
        price = 9900
    where
        id=4;
4번 데이터 오늘의 커피 price 가격 변경

커피 데이터 삭제
    delete
    from
        coffee
    where
        id=4;
4번 데이터 삭제

CRUD와 관련된 SQL 쿼리문을 log 찍어보는 연습과 DB에서 직접 사용해보는 훈련을 해봤습니다.

https://github.com/Giltaehyeong/firstproject/commit/3141bfef2b89e963f17ccc6b46728302d52b3771

 

[스프링 부트 입문 17]CRUD와 SQL 쿼리 · Giltaehyeong/firstproject@3141bfe

* 학습목표 데이터 CRUD 과정의 SQL 쿼리를 분석하시오. 실습 개요 1. 각 과정에서 수행되는 Query를 log로 확인해보기. 2. 확인된 log로 DB에서 직접 사용해보는 훈련 JPA 로깅 설정. application.properties 파

github.com

소스코드참고.

728x90