H2 데이터베이스
- 용량이 낮고 가벼움 & 웹으로 DB를 보여줌 → 교육용으로 좋은 DB
- 버전은 1.4.200
- 실행 명령 : ./h2.sh
- 실행하고 DB파일 생성시 파일이름.mv.db 파일이 생김
데이터베이스 접속 설정
- build.gradle에 jdbc, h2 관련 라이브러리를 추가
1
2
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'
application.properties에 DB 접속정보 작성
1 2 3
spring.datasource.url=jdbc:h2:tcp://localhost/~/test spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa
- 접속정보 작성 시 스프링 부트가 자동으로 DataSource를 생성
JdbcMemberRepository
- MemoryMemberRepository처럼 MemberRepository를 상속받아 구현한 구현체 클래스
- Jdbc를 이용해 데이터베이스에 저장하는 MemberRepository이다.
- 접속정보 작성 시 생성된 DataSource를 주입받아 사용
- 기본 구조
- sql문 작성
- Connection, PreparedStatement, ResultSet 변수 초기화
- 위 변수 사용 시 Exception이 많이 발생하므로 try/catch로 감싸놓는다
- try 안에서 Connection 연결, PreparedStatement로 sql 전송, ResultSet에 결과값 저장
- Connection 릴리즈 → 안할 시 Connection이 쌓여 대참사;;
JdbcTemplateMemberRepository
- MemberRepository를 상속받아 구현한 구현체 클래스
- DataSource를 이용해 JdbcTemplate를 생성해 사용한다
- 간단하게 정리하면 위의 Jdbc 코드를 많이 줄인것
JPA 설정
- build.gradle에 JPA 라이브러리 추가
1
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
application.properties에 JPA 설정 작성
1 2
spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=none
- 작성 시 스프링 부트가 자동으로 EntityManager 자동 생성
JPA
- Java ORM
- JPA를 사용하면, SQL과 데이터 중심의 설계에서
객체 중심의 설계
로 패러다임을 전환을 할 수 있고 개발 생산성을 크게 높일 수 있다. - JPA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
- JPA를 사용 시 @Entity 어노테이션 사용 → @Id 선언 필수
- EntityManager 사용 → 영속성 컨텍스트를 관리해주는 매니저
스프링 데이터 JPA
- JPA를 기반으로하는 프레임워크
- 반복적으로 개발해오던 CRUD를 제공 → 반복작업이 줄어들고 그 시간을 핵심 비즈니스 로직을 개발하는데 집중할 수 있음
- 인터페이스 구현만으로 80% 해결 가능 → 어메이징!!!
- 다만 동적쿼리는 해결 x → 동적쿼리는 Querydsl 라이브러리 사용
SpringConfig
- Spring Bean을 수동으로 등록할 때 사용했던 파일
- 기존에 설정해 두었던 MemberRepository의 생성자를 다른 구현체로 변경
- 이 파일만 변경하는 것으로 구현체 변경을 굉장히 쉽게 할 수 있음 → 스프링 DI의 장점
스프링 통합 테스트
- 기존 테스트들은 스프링과 관련이 없는 자바 코드
- 따라서 스프링 컨테이너 내의 스프링 빈 사용 x
- @SpringBootTest, @Transactional를 사용
어노테이션
- @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
- @Transactional : 테스트 케이스에 이 어노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
- @Entity : JPA 사용 시 DB에 대응되는 값
- @Id : JPA 사용 시 DB에서 PK로 사용할 값임을 선언해주는 것
- @GeneratedValue : id 값을 어떻게 설정해줄지 정해주는 것, IDENTITY는 DB에서 자동생성
- @Column : DB의 컬럼명을 설정해줄 수 있음.
팁
- 생성자가 하나라면 @Autowired 생략 가능