주노 님의 블로그

[Spirng] 7. Spring 데이터베이스 연동 - JDBC를 통한 데이터베이스 연동 본문

공부/Spring

[Spirng] 7. Spring 데이터베이스 연동 - JDBC를 통한 데이터베이스 연동

juno0432 2024. 7. 29. 00:01

시작하기에 앞서

아래 내용은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB접근기술에서 발췌한 내용입니다.

 

 

강의자료 일부를 발췌하는건 괜찮다고 하셨다.

무료강의로 지식을 공유해주신 김영한님께 다시한번 감사의 인사를 올리겠습니다

(_ _) (유료도 샀어요!)

 

애플리케이션에서 DB와 연동하는방법중 하나인 JDBC를 이용해보자

JDBC 학교에선 많이 배웠던거같은데 그냥 스르르륵... 들으면된다더라

 

 

 

1. repository 생성

 

그리고 repository에 JdbcMemberRepository를 만들어준다

 

public class JdbcMemberRepository implements MemberRepository {

    // 데이터베이스 연결을 위해 DataSource 객체를 사용합니다. 이 객체는 데이터베이스 커넥션 풀을 관리합니다.
    private final DataSource dataSource;

    // 생성자를 통해 Spring 컨테이너로부터 DataSource 객체를 주입받습니다. 이 방법은 의존성 주입을 통해 객체를 관리하고, 결합도를 낮춥니다.
    public JdbcMemberRepository(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
public Member save(Member member) {
    // SQL 쿼리 문장을 정의합니다. 여기서는 member 테이블에 name을 삽입합니다.
    String sql = "insert into member(name) values(?)";

    // JDBC에서 사용될 Connection, PreparedStatement, ResultSet 객체를 초기화합니다.
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    try {
        // 데이터베이스 연결을 확립합니다.
        conn = getConnection();
        // SQL 문을 준비하고, 자동으로 생성되는 키(주로 ID)를 반환받을 수 있도록 설정합니다.
        pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
        // 첫 번째 파라미터(?)에 회원 이름을 설정합니다.
        pstmt.setString(1, member.getName());
        // SQL 쿼리를 실행하고, 데이터베이스에 데이터를 삽입합니다.
        pstmt.executeUpdate();
        // 삽입된 데이터의 생성된 키(예: auto-increment ID)를 가져옵니다.
        rs = pstmt.getGeneratedKeys();
        // 생성된 키가 있는지 확인하고, 있다면 Member 객체에 ID를 설정합니다.
        if (rs.next()) {
            member.setId(rs.getLong(1)); // 키 값이 있다면 Member 객체에 설정
        } else {
            // 키를 조회할 수 없는 경우, 예외를 발생시킵니다.
            throw new SQLException("id 조회 실패");
        }
        // 작업이 성공적으로 완료되면 수정된 Member 객체를 반환합니다.
        return member;
    } catch (Exception e) {
        // 예외 발생 시, 상태를 불안정 상태로 표시하고 예외를 던집니다.
        throw new IllegalStateException(e);
    } finally {
        // finally 블록에서는 열린 자원들을 반드시 닫아줍니다. 이는 자원 누수를 방지합니다.
        close(conn, pstmt, rs);
    }
}
// 나머지도 구현
}

 

모든 코드를 제공하기엔 그렇고 save메서드만 확인하면 될것같다

 

2. config 수정

기존에 작성해둔 SpringConfig를 들어간다

 

 

    //스프링 부트가 데이터베이스와 연결할수있는 데이터소스를 생성해준다
    private DataSource dataSource;

    //생성자 주입을 통해 의존성을 주입해준다.
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    @Bean
    public MemberRepository memberRepository()
    {
//        return new MemoryMemberRepository();
        return new JdbcMemberRepository(dataSource);
    }

위 내용을 추가한다

config만 수정을 했어도, 메모리에서 데이터베이스 연동으로 바꿀수있다

DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체이다.

 

 

문제없이 실행되는것을 볼 수 있다

 

3. 스프링을 왜쓰나

객체지향적인 설계가 가능하기때문이다

 

다른 기능이 추가되었을때, 의존하는 다른 모든 코드의 수정이 필요하지만,

스프링의 의존성 주입을 사용하면 기존의 코드를 수정하지않고, 한 부분의 코드만 수정하면된다.

 

이는 객체지향의 원칙 중 개방 - 폐쇄원칙을 준수하였다.