MapleStory Cookie With Halo

๐Ÿƒ Spring/๐Ÿƒ Spring Boot

[SpringBoot][Gradle]DB์ ‘๊ทผ๊ธฐ์ˆ -์ˆœ์ˆ˜JDBC

๋‰ด์ด NUEY 2025. 1. 8. 15:24
๋ฐ˜์‘ํ˜•

 

๊ฐ•์˜์— ์‚ฌ์šฉ๋œ H2 Database ์„ค์น˜์™€ ์‚ฌ์šฉ๋ฒ•์€ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

2025.01.08 - [๐Ÿ’พ Data Base] - H2 Databas ์„ค์น˜๋ถ€ํ„ฐ ์‚ฌ์šฉ๊นŒ์ง€

 


 

ํ™˜๊ฒฝ์„ค์ •

 

  1. build.gradle ํŒŒ์ผ์— jdbc, h2 Database ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€.

    1. implementation 'org.springframework.boot:spring-boot-starter-jdbc'
      โ†’ java๋Š” DB๋ž‘ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ  jdbc๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    2. runtimeOnly 'com.h2database:h2'
      โ†’ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ.

    3. testImplementation('org.springframework.boot:spring-boot-starter-test') {
          exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
      }

  2. 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

 


 

์‚ฌ์šฉ๋ฒ•

 

  1. 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);
          }
      }
  2. 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);
          }
      }
  3. cmd๋กœ h2.bat์„ ์‹คํ–‰ํ•ด์„œ h2์— ์—ฐ๊ฒฐํ•œ๋‹ค.
  4. ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋‹ˆ ์ž˜๋œ๋‹ค.

 

 


โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373

๋ฐ˜์‘ํ˜•