๋ฐ์ํ
๊ฐ์์ ์ฌ์ฉ๋ H2 Database ์ค์น์ ์ฌ์ฉ๋ฒ์ ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
2025.01.08 - [๐พ Data Base] - H2 Databas ์ค์น๋ถํฐ ์ฌ์ฉ๊น์ง
ํ๊ฒฝ์ค์
- build.gradle ํ์ผ์ jdbc, h2 Database ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ.
- implementation 'org.springframework.boot:spring-boot-starter-jdbc'
โ java๋ DB๋ ์ฐ๊ฒฐํ๋ ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก jdbc๊ฐ ํ์ํ๋ค. - runtimeOnly 'com.h2database:h2'
โ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ๊ณตํ๋ ํด๋ผ์ด์ธํธ. - testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
- implementation 'org.springframework.boot:spring-boot-starter-jdbc'
- src-main-resources-application.propertiesํ์ผ์ ์๋ ์ฝ๋๋ฅผ ์ ์ด์ค๋ค.
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
์ฌ์ฉ๋ฒ
- Repository
- src-main-java-hello-hellospring-repositoryํจํค์ง ์์ JdbcMemberRepositoryํด๋์ค๋ฅผ ๋ง๋ ๋ค.
- ์ฌ๊ธฐ์๋ ์คํ๋ง ์์JDBC๋ฅผ ์ฌ์ฉํ๋ ๋ฒ์ด๊ณ ์ ๊ฐ JDBC์ ๋ํด ๊ฐ๋จํ ์ ๋ฆฌํด์ค ๊ฒ ์์ต๋๋ค.
2025.01.01 - [โ JAVA/โ ๊ฐ๋ฐํ๊ฒฝ] - [JAVA]JDBC๋? ์ฌ์ฉ๋ฒ๊น์ง ๊ฐ๋ต ์ ๋ฆฌ - public class JdbcMemberRepository implements MemberRepository
์ ์ ๊ฐ ์ ๋ฆฌํ JDBCํฌ์คํธ ์ธ์ ์ถ๊ฐ ๋ด์ฉ๋ง ์ ๋ฆฌํ๊ฒ ์ต๋๋ค. - pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
โ sql์ ๋ฃ์ต๋๋ค. ๋ท ๋ถ๋ถ์ id๋ฅผ ์๋์ผ๋ก ๋ฃ๋ ์ฝ๋์ ๋๋ค. - pstmt.setString(1, member.getName());
โ insert์ฟผ๋ฆฌ์ (?) ์ ๋ฃ์ ๋ฐ์ดํฐ์ ๋๋ค. - rs = pstmt.getGeneratedKeys();
โ ์ ์ฝ๋์์ Statement.RETURN_GENERATED_KEYS๋ ๋งค์นญ๋๋ ์ฝ๋์ ๋๋ค. ์์ฑ๋ ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค. - DataSourceUtils๋ฅผ ํตํด์ Data connection์ ํ๋ํด์ผ ๋๊ฐ์ ๊ฑธ ์ ์งํ ์ ์๋ค.
- ๋ซ์ ๋๋ DataSourceUtils๋ฅผ ํตํด ๋ซ๋๋ค.
- ์ ์ฒด์ฝ๋
๋๋ณด๊ธฐ
package hello.hellospring.repository; import hello.hellospring.domain.Member; import org.springframework.jdbc.datasource.DataSourceUtils; import javax.sql.DataSource; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; public class JdbcMemberRepository implements MemberRepository { private final DataSource dataSource; public JdbcMemberRepository(DataSource dataSource) { this.dataSource = dataSource; } @Override public Member save(Member member) { String sql = "insert into member(name) values(?)"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); pstmt.setString(1, member.getName()); pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); if (rs.next()) { member.setId(rs.getLong(1)); } else { throw new SQLException("id ์กฐํ ์คํจ"); } return member; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findById(Long id) { String sql = "select * from member where id = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setLong(1, id); rs = pstmt.executeQuery(); if (rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } else { return Optional.empty(); } } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public List<Member> findAll() { String sql = "select * from member"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); List<Member> members = new ArrayList<>(); while (rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); members.add(member); } return members; } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } @Override public Optional<Member> findByName(String name) { String sql = "select * from member where name = ?"; Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; try { conn = getConnection(); pstmt = conn.prepareStatement(sql); pstmt.setString(1, name); rs = pstmt.executeQuery(); if (rs.next()) { Member member = new Member(); member.setId(rs.getLong("id")); member.setName(rs.getString("name")); return Optional.of(member); } return Optional.empty(); } catch (Exception e) { throw new IllegalStateException(e); } finally { close(conn, pstmt, rs); } } private Connection getConnection() { return DataSourceUtils.getConnection(dataSource); } private void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (pstmt != null) { pstmt.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { close(conn); } } catch (SQLException e) { e.printStackTrace(); } } private void close(Connection conn) throws SQLException { DataSourceUtils.releaseConnection(conn, dataSource); } }
- src-main-java-hello-hellospring-repositoryํจํค์ง ์์ JdbcMemberRepositoryํด๋์ค๋ฅผ ๋ง๋ ๋ค.
- SpringConfig ์์
- DataSource๋ฅผ DI, ์์กด์ฑ์ฃผ์
์ผ๋ก ์ ์ด์ค๋๋ค.
- return new JdbcMemberRepository(dataSource);
โ MemberRepository๋ฅผ ์์๋ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ค ์ค Jdbc๋ก ๋ฐ๊ฟ์ค๋๋ค. - ์ ์ฒด์ฝ๋
๋๋ณด๊ธฐ
package hello.hellospring; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import hello.hellospring.repository.JdbcMemberRepository; import hello.hellospring.repository.MemberRepository; // import hello.hellospring.repository.MemoryMemberRepository; import hello.hellospring.service.MemberService; @Configuration public class SpringConfig { private DataSource dataSource; @Autowired public SpringConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { // return new MemoryMemberRepository(); return new JdbcMemberRepository(dataSource); } }
- DataSource๋ฅผ DI, ์์กด์ฑ์ฃผ์
์ผ๋ก ์ ์ด์ค๋๋ค.
- cmd๋ก h2.bat์ ์คํํด์ h2์ ์ฐ๊ฒฐํ๋ค.
- ์๋ฒ๋ฅผ ์คํํด๋ณด๋ ์๋๋ค.
โป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373
๋ฐ์ํ
'๐ Spring > ๐ Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SpringBoot]DB์ ๊ทผ๊ธฐ์ -JdbcTemplate (0) | 2025.01.09 |
---|---|
[SpringBoot]์คํ๋ง ํตํฉํ ์คํธ (0) | 2025.01.08 |
[SpringBoot][Thymeleaf]ํ์๊ด๋ฆฌ-์น MVC๊ฐ๋ฐ (1) | 2025.01.07 |
[SpringBoot]์คํ๋ง ๋น ๋ฑ๋ก:2.์๋ฐ์ฝ๋ (0) | 2025.01.06 |
[SpringBoot]์คํ๋ง ๋น ๋ฑ๋ก:1.์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ค์ (0) | 2025.01.06 |