어떤 식으로 DB를 다루어왔었는지의 역사를 알아보자
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 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 원칙 중,
다형성 짱!