제가 자바 초보시절에는 무조건 mysql 을 썼었습니다.
하지만 mysql 의 문제점은 제가 만든 프로젝트를 다른 곳에서 실행시키고 싶으실 때,
뭐 예를 들자면 면접때나, 아니면 외부사용자에게 바로 보여주고 싶을 때,
프로그램을 바로 실행시키기가 까다로운 단점이 있습니다.
이러한 단점들을 해소시키기위해 자바에서는 내장DB를 사용합니다.
메모리에서 돌아가기 때문에 속도도 무척 빠르구요.
이번 편에서는 자바 라이브러리 빌드도구인 메이븐과 내장db를 사용해보도록 하겠습니다.^^;
아. 그리고 liquidbase 인가도..쓸 수 있으면 써보려고 합니다 ㅎㅎ.
추후 공지:
( liquidbase) 는 안쓰고 그냥 프로그램 킬때마다, 내장database 를 직접 초기화시키는 걸로 해보겠습니다
앞으로 동영상 속도를 위해서, 바로 동영상을 다이렉트로 녹화합니다. 삽질을 바로 보실 수 있으실 겁니다;;
설명을 대신 좀 더 보충시키겠습니다.
동영상
메이븐 설정 변경
프로젝트 이름 우측 마우스 클릭 - Configure 에서 - Convert to Maven project 를 클릭하여서 메이븐으로 변경시킨다.
메이븐으로 변환시키면서 에러가 날 수도있는데 일단 빌드 정보를 다음과 같이 바꿔주자. Java8 설정으로 되어있다.
그리고 에러가 나오면 메이븐 정보를 업데이트(프로젝트 누르고 alt+ f5) 해주자.
<build> <sourceDirectory>src</sourceDirectory> <testSourceDirectory>test</testSourceDirectory> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build>
그리고 외부 라이브러리로 mysql과 h2 database 를 써보자. 라이브러리 정보는 http://http://mvnrepository.com/ 에서 검색하면된다.
pom.xml 안의 프로젝트 정보에 다음 외부 라이브러리를 등록해준다.
<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.34</version> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.184</version> </dependency> </dependencies>
데이터 베이스 정보 변경
자, 이제 DBCOnnection MGR 파일정보들을 바꿔주면 된다.
이 부분들을 수정해주자.
private String _driver = "org.h2.Driver", /* _url = "jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE", */ _url = "jdbc:h2:~/test", _user = "sa", _password = "";
그리고 다음 소스는 member_test 테이블을 만드는 자바 클래스이다.
package test.etc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class H2DBtest { private static PreparedStatement pstmt; private static Statement stmt; public static void main(String[] args) throws SQLException, ClassNotFoundException { Class.forName("org.h2.Driver"); /*Connection conn = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");*/ Connection conn = DriverManager.getConnection("jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE", "sa", ""); String sql = "drop table if exists member_test"; stmt = conn.createStatement(); stmt.execute(sql); String sql2 = "CREATE TABLE member_test(" + "NUM INT auto_increment, " + "ID VARCHAR primary key, " + "PASSWORD VARCHAR, " + "AGE INT," + "PHONE VARCHAR," + "MILEAGE INT);"; Statement stmt = conn.createStatement(); stmt.execute(sql2); pstmt = conn.prepareStatement("show tables"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { System.out.println(rs.getObject(1)); } rs.close(); pstmt.close(); // add application code here conn.close(); } }
데이터베이스를 만들었으면 이제 데이터를 넣어보면서 확인해보자.
성공하는 것을 볼 수가 있다. (안되면 알아서 각자 수정 부탁드립니다;;; )
이제 어딜 가도 이 프로그램은 내장디비로 작동을 할수 있게 되었다!!
package test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import test.etc.H2DBtest; import asset.DBConnectionMgr; public class LoginTest { public static void main(String[] args) throws Exception { H2DBtest h2db = new H2DBtest(); h2db.main(args); int test2 = insertUser(); boolean test = loginTest("test", "1234"); System.out.println("로그인 결과 :" + test + "생성결과 :" + test2); } public static int insertUser() throws Exception { DBConnectionMgr pool = DBConnectionMgr.getInstance(); Connection con = null; PreparedStatement pstmt = null; String sql = null; con = pool.getConnection(); sql = "insert into member_test (id, password) values ('test', '1234');"; pstmt = con.prepareStatement(sql); return pstmt.executeUpdate(); } public static boolean loginTest(String id, String password) { boolean flag = false; DBConnectionMgr pool = DBConnectionMgr.getInstance(); Connection con = null; PreparedStatement pstmt = null; ResultSet rs = null; String sql = null; String getPass = null; try { con = pool.getConnection(); // 문장생성 sql = "select password from member_test where id=?"; // 문장연결, 열차준비 pstmt = con.prepareStatement(sql); // 빈칸채워주기 pstmt.setString(1, id); // 실행, 열차출바알~! rs = pstmt.executeQuery(); if (rs.next()) { // 패스워드를 읽어온다. getPass = rs.getString("password"); // 데이터베이스에서 읽어온 문자열과 사용자가 입력한 비밀번호가 같을 경우에는 // 참을 반환을 하겠죠? if (getPass.equals(password)) { System.out.println("받아온 비밀번호 : " + getPass); flag = true; } } } catch (Exception e) { // 원래 예외처리는 크게 잡으면 안되고, 따로 처리가 되어야 합니다. e.printStackTrace(); } finally { // 자원반납 pool.freeConnection(con, pstmt, rs); } // 결과값 반납 return flag; } }