H2 DB를 설치형으로 사용하고, 연결해서 JPA를 사용해봅시다.
https://www.h2database.com/html/main.html
저는 mac을 사용하기 때문에 AllPlatforms로 받습니다.
압축을 해제하면 h2라는 디렉토리가 생성되고
bin
폴더안의 h2.sh라는 스크립트가 있습니다.
먼저 다음 명령어를 통해 권한을 부여합니다.
chmod 755 h2.sh
그리고 실행합니다.
./h2.sh
다음과 같이 웹 콘솔
이 실행됩니다.
연결을 누르면 접속됩니다.
데이터의 기본 저장위치는 root 디렉토리이며 test.mv.db
파일로 저장됩니다.
삭제하면 DB의 데이터가 모두 사라지면, 웹 콘솔에 접속하면 새로 파일이 생성됩니다.
저는 h2-db라는 gradle 프로젝트를 생성했습니다.
dependencies에 다음 2개를 넣어주고 refresh 해줍니다.
// java에서 DB에 붙으려면 JDBC 드라이버가 꼭 있어야합니다. spring-data-jpa에 내장되어 있습니다.
// 정말 붙었는지 테스트 하기 위해 JPA를 넣어줍니다.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// DB와 연결하기 위한 클라이언트 입니다.
runtimeOnly 'com.h2database:h2'
설정파일을 넣어줍니다.
(그냥 야믈 파일이 보기 편해서 yml로 .properties 상관없음)
중요한것은
테스트를 위해서 ddl-auto
옵션을 create
로 정했습니다.
create는 JPA가 객체를 보고 있는 테이블도 지우고, 테이블을 자동으로 생성합니다.
테스트 이기 때문에 create로 지정하지만
실제 사용에서는 none으로 합니다.
spring:
# DB 연결
datasource:
# 설치된 H2 DB와 연결 URL
url: jdbc:h2:tcp://localhost/~/test
# 접속을 위한 드라이버
driver-class-name: org.h2.Driver
# springboot 2.4 부터는 username이 꼭 있어야합니다. 없으면 에러가 발생합니다.
username: sa
jpa:
# JPA가 수행하는 SQL을 볼 수 있다.
show-sql: true
# 객체를 보고 자동으로 테이블 생성 여부. 생성 - create, 비생성 - none
# 테스트이기 때문에 create로 설정하며
# 실제로는 none 으로 합니다. create이면 기존의 테이블을 전부 밀어버립니다.
hibernate:
ddl-auto: create
# 콘솔 확인 을 위한 always
output:
ansi:
enabled: always
# 파라미터 확인을 위한 trace
logging:
level:
org.hibernate.type: trace
여기 까지 했으면 연결까지 완료되었습니다. 그런데 실제로 쿼리을 날려봐야 감이 오니까 JPA로 쿼리도 날려봅시다.
id, name만 넣어주었습니다.
@Entity
public class Member {
// PK 지정
@Id
// 데이터베이스에 따라 자동으로 ID가 지정됩니다. - 기본 세팅
@GeneratedValue(strategy = GenerationType.AUTO)
private long 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;
}
}
MemberRepository 인터페이스를 만들고
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
SpringDataMemberRepository 인터페이스를 만들어줍니다.
public interface SpringDataMemberRepository extends JpaRepository<Member, Long>, MemberRepository{
@Override
Optional<Member> findByName(String name);
}
@SpringBootTest
class H2DbApplicationTests {
private final MemberRepository memberRepository;
// 의존성 주입
@Autowired
public H2DbApplicationTests(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Test
void 회원가입() {
// 멤버 저장
Member member = new Member();
member.setName("skyepodium");
memberRepository.save(member);
// 저장한 멤버 아이디로 검색
Member findMember = memberRepository.findById(member.getId()).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
}
테스트 코드도 통과했고
콘솔에서 쿼리로 확인해도 제대로 멤버가 들어갔습니다.