본문 바로가기

백/spring boot

스프링부트 스터디-5

<h2 데이터베이스 사용 & COURSE 테이블 생성하기>

 

h2 데이터베이스 url

-> http://localhost:8080/h2-console

 

<접속 시>

-> JDBC URL 칸에 적어야 하는 값이 항상 다름!!

  (h2 데이터베이스에 필요한 URL이 아직 구성되지 않아 URL이 동적으로 생성된다)

-> 파란 부분이 URL이다

 이 값을 JDBC URL로 연결 후 connect 입력하면 h2 console로 연결할 수 있게 된다

 

-> 이렇게 동적인 url을 사용하게 되면 접속할때마다 바뀐 값을 복붙해야 해서 번거로움

따라서 application.properties에 정적 h2 URL 작성하기

 

이렇게 작성한 정적 URL로 h2콘솔 JDBC URL 설정해주기


h2 데이터베이스에 테이블 구성하기

-> shcema.sql 파일 구성하기

 

Java로 뭔가 long으로 저장할 때마다 h2 데이터베이스는 bigInt 타입을 갖게 된다

(long타입이 bigInt로 매핑된다)

 

데이터베이스에서 텍스트는 가변문자인 varchar로 표현함

 

<schema.sql>

-> Spring Data JPA Starter를 활용할 때마다 자동으로 schema.sql 파일을 가져와서 h2에 테이블을 생성해준다

 

서버를 껐다가 다시 run 시켜주고 h2 console을 새로고침하여 다시 connect 해주면

이렇게 COURSE 테이블이 생성되었음을 확인할 수 있다!


JDBC

 

JDBC, Spring JDBC 둘다 sql 쿼리문을 많이 작성해야하지만

Spring JDBC를 사용하면 Java 코를 훨씬 덜 작성할 수 있긴 함!

-> 위 : JDBC  /   아래 : Spring JDBC


이렇게 새로운 패키지에 Repository 클래스 만들어주기

-> Spring Jdbc를 이용하여 쿼리를 실행할 때 JdbcTemplate이 필요함

 

어플리케이션이 시작할 때 내가 작성한 insert query를 시작하게끔 하고 싶으면 CommandLineRunner를 이용해야 함

 

<Insert>

내용을 삽입할 때는 Course 객체 이용하기

 

<Course>

 

<CourseJdbcRepository>

<CourseJdbcCommandLineRunner>

 


<Delete>

 


<데이터베이스에서 데이터 불러오기>

-> 명령을 보내 return 값을 받아온다. 따라서 update가 아니라 query 메소드를 사용해야함

 (결과 하나만 돌려받는 경우에는 queryForObject 메소드 사용하기) -> 특정 객체를 생성한다는 뜻

 

Row Mapper : Result_set(데이터베이스 조회 결과)을 Bean으로 매핑해주는 것 (결과 세트의 각 행을 특정 bean에 매핑해준다)

-+ Course 클래스에 setter도 등록해주기


스프링 Jdbc 요약

-> 자바 코드는 간단하지만 쿼리문이 복잡해진다! (INSERT_QUERY, DELETE_QUERY,...)


JPA

-> 엔티티를 테이블에 매핑하는 게 전부!

 

JPA를 활용하게 되면 Course Bean을 데이터베이스에 존재하는 테이블로 직접 매핑하게 된다

-> @Entity를 통해!

(Java Bean과 테이블 사이에 매핑을 생성하고 그 매핑을 이용하여 값을 삽입하고 값을 검색하고 테이블에서 작업을 수행한다)

-> 즉, JPA를 사용할 때마다 Java Bean을 테이블에 매핑하게 된다

 

 

1) <Bean에서 테이블로의 매핑>

 

2) <이 엔티티를 활용할 레포지토리 생성하기>

-> JPA를 이용하여 데이터베이스에 연결하려면 EntityManager 라는 게 필요하다 (사용하기 전에 @PersistenceContext 달아주기! @Autowired와 같은 역할이지만 JPA와 관련된 더 구체적인 어노테이션이다)

    -> EntityManager : 엔티티를 관리하는 애

         -> 행 삽입하는 역할 : merge

         -> 찾는 역할 : find

         -> 삭제하는 역할 : remove   (찾고나서 삭제한다)

 

 

3) CourseCommandLineRunner

 

4) @Transactional

Jpa 쿼리를 실행하려고 할 때마다 트랜잭션을 허용해야 하므로 CourseJpaRepository에 @Transactional 어노테이션 추가하기

 

 

5) Jpa를 실행하고 있을 때 생성된  SQL을 확인하고싶을 때 application.properties에 추가

-> 실행결과

 

 


Spring Data JPA

-> JpaRepository라는 인터페이스를 extends로 상속받아야 한다

 

<CourseSpringDataJpaRepository>

-> 그냥 인터페이스만 생성하면 된다!!

-> SpringDataJpaRepository 클래스 생성 후 JpaRpository를 상속받으면서 엔티티와 ID 지정해주

 

< CourseCommandLineRunner>

- JpaRepository<"어떤 엔티티를 관리할지", "id 필드의 타입">

- 데이터를 넣을 때 "insert" 대신 "save"메소드 사용

- 메소드는 long 타입을 기대하고 있기에 끝에 "l" 붙여줌

 

Spring Data Jpa는 사용할 때마다 EntityManager에 연결해줄 필요 없다

 

- 모든 데이터 조회 : .findAll()

- 저장된 데이터 갯수 조회 : .count()

 

내가 구문 추가해주고 싶다면 CourseSpringDataJpaRepository interface에 메소드 형태로 정의해주고 CourseCommandLineRunner 에서 이용하기!

 

 


Hibernate vs JPA

- JPA : 엔티티를 테이블에 매핑하는 방식을 정의

         : 기술 명세서 (API)

         : 엔티티가 무엇인지 정의하는 방식

- Hibernate : JPA를 구현

                   : JPA에서 매우 인기 있는 구현체

 

-> 색칠된 걸 쓰면 Hibernate를 쓰게 되는데 이거 안쓰고 jakarta.persistence 이용하는 이유는 Hibernate만으로 한정해서 쓰고 싶지 않아서

-> 웬만하면 항상 Hibernate가 아니라 JPA 이용하기!

' > spring boot' 카테고리의 다른 글

스프링부트 스터디-7 (91강~)  (0) 2024.03.20
스프링부트 스터디-6 (섹션7 ~90강)  (0) 2024.03.18
스프링부트 스터디-3  (0) 2024.03.13
스프링부트 스터디-2  (0) 2024.03.12
스프링부트 스터디 -1  (0) 2024.03.10