이번 실습에서 사용할 데이터 베이스는 H2 데이터 베이스이고 실무에서는 사용되지 않는 교육용 고대 DB라고 한다.
설치 링크
해당 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문을 생략할 수 있어 데이터 베이스를 연동하고 각종 메서드를 호출할 때 더 편하게 작업할 수 있다.
리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있다.
'코딩딩 > Spring' 카테고리의 다른 글
스프링 빈과 의존관계 (0) | 2023.07.11 |
---|---|
회원관리 예제 (0) | 2023.07.11 |
회원 서비스 개발 (0) | 2023.07.06 |
회원 서비스 테스트 (0) | 2023.07.06 |
회원 리포지토리 테스트 케이스 작성 (0) | 2023.07.04 |