스프링 DB 접근 기술 - 순수 JDBC, 다형성 짱!

장서연·2022년 1월 3일
0

스프링 입문

목록 보기
19/25

어떤 식으로 DB를 다루어왔었는지의 역사를 알아보자

순수 JDBC

환경설정

  • build.gradle 파일에 jdbc, h2데이터베이스 관련 라이브러리 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
runtimeOnly 'com.h2database:h2'

자바는, DB에 접근하려면 JDBC 드라이버가 꼭 있어야 한다.

DB에 붙으려면 접속정보 같은 것을 넣어야 하는데, 요즘에는 스프링 부트가 다 해줌. 경로만 넣으면 됨

src/main/resources/application.properties

이렇게까지하면, DB에 접근하기 위한 준비는 다 되었다. 이제 서버를 다시 시작하면, 스프링이 DB와 연결하기 위한 작업을 다~ 해준다!

이제부터 JDBC API를 가지고 개발을 시작해보겠다!!!
근데 어디다 개발...?

기존에, 구현체로 메모리기반 리포지토리(MemoryMemberRepository)를 만들었었던것 기억하는가?
인터페이스도 만들었었는데, 이제는 새로 JdbccMemberRepository 구현체로 갈아끼워줄 것이다 드디어!!!

repository/JdbcMemberRepository

public class JdbcMemberRepository implements MemberRepository{
    @Override
    public Member save(Member member) {
        return null;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.empty();
    }

    @Override
    public Optional<Member> findByName(String name) {
        return Optional.empty();
    }

    @Override
    public List<Member> findAll() {
        return null;
    }
}

하나하나 구현해나가면 됨~

Jdbc 리포지토리 구현

이렇게 JDBC API로 직접 코딩하는 것은 20년 전 이야기. 따라서 고대 개발자들이 이렇게 고생하고 살았구나 생각하고, 정신건강을 위해 참고만 하고 넘어가자.

우선, DB에 붙으려면 DataSource 라는 것이 필요하다.
repository/JdbcMemberRepository

public classs JdbcMemberRepository implements MemberRepository {
	private final DataSource dataSource;
    // dataSource 를 스프링으로부터 주입받아야 한다.
    public JdbcMemberRepository(DataSource dataSource){
        this.dataSource = dataSource;
        // dataSource.getConnection();
    }
    ... 이하의 코드는 고대의 코드라 여기서는 생략했다.
    모든 코드를 보려면, github 으로!
}

DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다. 스프링부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어둔다. 그래서 DI를 받을 수 있다.

설정파일에 jdbc 관련 설정과 h2데이터 베이스 설정을 해주었으므로, 스프링이 처음에 뜰 때 자기가 dataSource 라는 접속 정보를 만들어놓기 때문에 이 객체를 주입받을 수 있다.

dataSource.getConnection(); 으로 커넥션을 얻을 수 있음

스프링 설정 변경

SpringConfig.java

@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 JdbcMemberRepository(dataSource);
    }

}

return new MemoryMemberRepository -> JdbcMemberRepository 로만 바꿔주었는, DB와 성공적으로 연결할 수 있다! 이것이 바로 객체지향의 다형성이며, 스프링을 쓰는 이유!!!


구현체로, MemoryMemberRepository와 JdbcMemberRepository가 있게 되었다.

SOLID 원칙 중,

  • 개방 폐쇄 법칙(OCP, Open-Closed principle)
    - 확장에는 열려있고, 수정에는 닫혀있다
  • 스프링의 DI(Dependeuccy Injectin)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다
  • 회원을 등록하고 DB에 결과가 잘 입력되는지 확인하자
  • 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다

다형성 짱!

0개의 댓글