Spring/SpringCore

스프링 DB 접근 기술 - H2 데이터베이스 설치

느리지만 꾸준하게 2022. 3. 22. 19:57

h2 데이터베이스를 설치를 해보자. 여기 클릭

링크에 들어가서 1.4.200 버전을 설치한다.

 

터미널에서 아래와 같이 명령어를 쳐준다.

// h2 폴더로 이동

open .
ls
cd bin

// Mac에서 실행권한을 주기 위해서 아래 명령어를 입력
chmod 755 h2.sh

./h2.sh

 

아래와 같이 h2 데이터베이스가 뜨게 된다.

 

JDBD URL의 ~/test는 home에 있는 test 폴더 경로를 의미한다. 그대로 connect를 시켜주면 아래와 같이 뜨게 된다.

좌측 상단을 클릭하면 나갈 수 있게 된다. terminal창에서 home directory를 가보자.

파일 목록들을 보게 되면 test.mv.db가 있다. 이 파일은 꼭 있어야 한다.

 

이제부터 접속을 할 때는 파일로 접근하지 말고(동시에 application과 web console이 같이 접근이 안될 수 있다. 즉 파일 충돌이 일어날 수도 있다.) 아래와 같이 하자. 파일을 직접 접근하는 것이 아니고 소켓을 통해 접근하게 된다. (즉 여러군데에서 접근 가능해짐)

 

다시 접근하려고 하는데 터미널에서 아래와 같은 에러가 발생

milaju@MacBook-Pro bin % chmod 755 h2.sh
milaju@MacBook-Pro bin % ./h2.sh        
The Web Console server could not be started. Possible cause: another server is already running at http://localhost:8082?key=c1d298524dc0823da6857ae81d389480057e630881003a15c6e3198a596354aa
Root cause: Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use" [90061-200]
Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientConnectionException: Exception opening port "8082" (port may be in use), cause: "java.net.BindException: Address already in use" [90061-200]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:622)
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)
	at org.h2.message.DbException.get(DbException.java:194)
	at org.h2.util.NetUtils.createServerSocketTry(NetUtils.java:180)
	at org.h2.util.NetUtils.createServerSocket(NetUtils.java:146)
	at org.h2.server.web.WebServer.start(WebServer.java:389)
	at org.h2.tools.Server.start(Server.java:511)
	at org.h2.tools.Console.runTool(Console.java:208)
	at org.h2.tools.Console.main(Console.java:72)
Caused by: java.net.BindException: Address already in use
	at java.base/sun.nio.ch.Net.bind0(Native Method)
	at java.base/sun.nio.ch.Net.bind(Net.java:555)
	at java.base/sun.nio.ch.Net.bind(Net.java:544)
	at java.base/sun.nio.ch.NioSocketImpl.bind(NioSocketImpl.java:643)
	at java.base/java.net.ServerSocket.bind(ServerSocket.java:388)
	at java.base/java.net.ServerSocket.<init>(ServerSocket.java:274)
	at java.base/java.net.ServerSocket.<init>(ServerSocket.java:167)
	at org.h2.util.NetUtils.createServerSocketTry(NetUtils.java:176)
	... 5 more
milaju@MacBook-Pro bin %

terminal  다시 실행시켜서 해결

 

이제 table을 생성시켜보자. 아래와 같이 생성을 하게되면 MEMBER 테이블에 ID NAME column이 생성된다.

 

drop table if exists member CASCADE;
    create table member
    (
    
    // 이 부분에서 값을 세팅하지 않고 insert를 하면 db가 들어왔을 때 자동으로 id값을 채워준다.
        id   bigint generated by default as identity,
        name varchar(255),
        primary key (id)
);

 

이 부분은 지워도 된다.

drop table if exists member CASCADE;

 

MEMBER부분을 살짝 클릭하면 아래와 같이 나오게 된다.(조회)

SELECT * FROM MEMBER

 

아래와 같이 데이터를 삽입해보자.

insert into member(name) values("spring")
insert into member(name) values("spring2")

조회하면 아래와 같이 뜨게 된다.

전에 만들었던 memorymemberRepository도 sequence가 아래처럼 db에 save됐을 때 자동으로 증가되게 만들어 주었다.

public class MemoryMemberRepository implements MemberRepository {

    private static Map<Long, Member> store = new HashMap<>();
    
    
//sequence가
    private static long sequence = 0L;


// db에 save됐을 때 자동으로 증가
    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(), member);
        return member;
    }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 >

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com