1) https://www.h2database.com/html/download-archive.html
1.4.200 버전 설치
2) h2\bin 디렉토리에서 h2.bat
실행
h2\bin> h2.bat
만약, 접속이 안될 경우 주소창의 IP 주소를 localhost로 바꾸어주면 된다.
3) 연결 클릭
4) 새 cmd 창을 열어 dir
test.mv.db 가 생성되어있는 것을 확인
5) 소켓을 통해 접근할 수 있도록 url 변경
jdbc:h2:tcp://localhost/~/test
CREATE TABLE member
(
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
name VARCHAR(255),
PRIMARY KEY (id)
);
MEMBER table이 생성된 것을 확인
id BIGINT GENERATED BY DEFAULT AS IDENTITY
: id 값이 들어오지 않으면 DB가 자동으로 Default 값을 채워넣어줌
SELECT * FROM MEMBER;
INSERT INTO MEMBER(name) VALUES('spring');
build.gradle의 dependencies에 추가
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
자바 프로그램과 DB를 연결할 때 필요한 driver
1) MemberRepository interface를 구현한 JdbcMemberRepository class 생성
public class JdbcMemberRepository implements MemberRepository
2) configuration만 수정하면 된다!
spring에서 제공하는 DataSource를 생성하여 memberRepository에 DI해준다.
private DataSource dataSource;
@Autowired
public SpringConfig(DataSource dataSource) {
this.dataSource = dataSource;
}
@Bean
public MemberRepository memberRepository() {
// return new MemoryMemberRepository();
return new JdbcMemberRepository(dataSource);
}
실행 결과 : DB에 잘 연결된다.
확장에는 열려있고, 수정과 변경에는 닫혀있다.
스프링과 연결된 DB까지 통합된 테스트 진행
@SpringBootTest
: 스프링 컨테이너와 테스트를 함께 실행
@Transactional
: 테스트 케이스에서 사용하면 test를 시작하기 전에 transaction을 시작하고, test가 완료되면 rollback
▶ test 후에 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지않고 반복 가능
Jdbc 코드를 축약하여 간단하게 사용할 수 있도록 해주는 template
@Override
public Optional<Member> findById(Long id) {
List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper());
return result.stream().findAny();
}
JPA는 ORM이다!
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것
dependencies
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
spring.jpa.show-sql=true // sql을 볼 수 있음 spring.jpa.hibernate.ddl-auto=none // 테이블을 자동으로 생성
- 예제에서는 미리 만들어져있는 테이블을 사용할 것이므로 ddl-auto는 none으로 설정
JPA(표준)는 interface로 제공되기 때문에 이를 구현하는 hibernate(기업) library 필요
@Entity
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // system이 회원을 구분하기 위해 부여하는 식별자 id
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity
: JPA가 관리하는 Entity
@Id
: 해당 property가 PRIMARY KEY임을 나타냄
@GeneratedValue
: PRIMARY KEY의 값을 DB가 자동으로 생성해주는 경우 명시
- strategy : persistence provider가 Entity의 primary key를 생성할 때 사용할 생성 전략
- generator :
@SequenceGenerator
나@TableGenerator
annotation에서 명시된 primary key 생성자를 재사용할 때 사용됨
👀 DB의 column 명과 property 명이 다를 경우
@Column
annotation을 사용하여 매핑해준다.@Column(name = "username") private String name;
em.find()
: primary key로 데이터를 조회하는 경우 사용
em.find(조회할 데이터 타입, key);
em.createQuery()
: primary key가 아닌 property로 데이터를 조회하는 경우 사용
em.createQuery(qlString, 조회 데이터 타입) .getResultList(); // 조회된 데이터 목록을 얻어옴
데이터를 저장하거나 변경할 때에는 꼭
@Transaction
을 사용해야 한다.
public interface SpringDataJpaMemberRepository extends JpaRepository<Member, Long>, MemberRepository {
@Override
Optional<Member> findByName(String name);
}
JpaRepository interface를 상속한 SpringDataJpaMemberRepository interface를 발견하면 SpringDataJpa가 구현체로 만들어 스프링 빈에 등록
- find, save, delete, get 등의 대략적인 메서드 정의
PagingAndSortingRepository
interface 상속- 🌟 Spring Data JPA가 이 interface를 상속하는 interface의 구현체를 자동으로 생성해준다.
- save, find, exists, count, delete 등의 메서드 정의
Repository
interface 상속
- findAll 메서드 정의
CrudRepository
interface 상속
만약, 내가 정의한 property로 데이터를 조회하는 메서드를 정의하고 싶은 경우
@Override Optional<Member> findByName(String name);
@Override Optional<Member> findByNameAndId(Spring name, long id);
JPQL :
select m from Member m where m.name=?
findByName()
, findByEmail()
처럼 메서드 이름 만으로 조회 기능 제공