코딩딩/Spring

스프링 DB 접근 기술

전낙타 2023. 7. 11. 20:11

 

이번 실습에서 사용할 데이터 베이스는 H2 데이터 베이스이고 실무에서는 사용되지 않는 교육용 고대 DB라고 한다.

 

설치 링크

https://www.h2database.com

 

해당 DB를 설치 후 h2.sh 파일을 클릭해 설치해준 뒤 h2.bat 파일을 실행해 DB를 제어한다

 

해당 쿼리문을 실행시켜 MEMBER 테이블을 생성해준다.

 

이제 리포지토리와의 커넥션을 끊고 DB와 연결해주는 코드를 작성해준다.

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);     } }

 

자세한 설명은 생략하고 해당 DB를 내 코드에 연결시켜보자

객체지향적 설계를 해준 덕분에 별다른 수정 없이 DB에 연결할 수 있었다.

 

해당 코드로 수정해준 뒤 다시 서버를 시작해보면 DB에 입력되어있는 spring이 바로 출력되는 모습을 확인할 수 있다

 

JPA

 

SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환할 수 있다.

→ 생산성 증가

 

기존에 작성되었던 qurry문을 생략할 수 있어 데이터 베이스를 연동하고 각종 메서드를 호출할 때 더 편하게 작업할 수 있다.

 

리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다.