반응형

JDBC, JDBCTemplate 강의에서의 큰 수확은 스프링의 장점인 개방 폐쇄의 원칙, 다형성을 이해할 수 있다는 점이었다. 스프링 DB접근 기술 쪽은 이 부분을 중점적으로 포스팅

 

강의 비지니스 시나리오는 DB가 정해져 있지 않아 Memory로 repository를 구성했었다.

이를 H2 데이터베이스를 연결하고 JDBC로 구현체를 변경이 필요했다.

 

🎈🎈 개방-폐쇄 원칙(OCP, Open-Closed Principle) :확장에는 열려있고, 수정/변경에는 닫혀있다. 

DataSource dataSource;

@Autowired
public SpringConfig(DataSource dataSource) {
    this.dataSource = dataSource;
}
        
@Bean
    public MemberRepository memberRepository(){
        //new 키워드 뒤에 인터페이스 구현 클래스
        //return new MemoryMemberRepository();
        return new JdbcMemberRepostiory(dataSource);
    }

스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정(어셈블리 라인)만으로 구현 클래스(구현체)를 변경할 수 있다.

 

>> 객체지향의 다형성을 활용

Service 단에서 어떤 Repository를 의존할지 기존 코드를 다 수정해야하지만 DI를 사용하면 SpringConfig만 손봐주면 된다는 말

 


이후에 JDBCTemplate , JPA, 스프링 데이터 JPA도 동일하게 구현체를 쉽게 변경할 수 있었다.

🎈🎈JDBCTemplate 

DataSource dataSource;

@Autowired
public SpringConfig(DataSource dataSource) {
    this.dataSource = dataSource;
}
        
@Bean
    public MemberRepository memberRepository(){
        //new 키워드 뒤에 인터페이스 구현 클래스
        //return new MemoryMemberRepository();
        //return new JdbcMemberRepostiory(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }

 

🎈🎈JPA

//@PersistenceContext
private EntityManager em;

@Autowired
public SpringConfig(EntityManager em) {
    this.em = em;
}

@Bean
public MemberRepository memberRepository(){
    //new 키워드 뒤에 인터페이스 구현 클래스
    //return new MemoryMemberRepository();
    //return new JdbcMemberRepostiory(dataSource);
    //return new JdbcTemplateMemberRepository(dataSource);
    return new JpaMemberRepository(em);
}

 

+) 엔티티 매핑 필요

@Entity
public class Member {
	@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	...
 }

*참고) build.gradle 수정, resources/application.properties 수정도 필요 

 

🎈🎈스프링 데이터 JPA

: JpaRepository를 상속하는 인터페이스를 만들면 자동으로 구현체를 등록해준다. (Repository bean등록 안해도 됨)

@Configuration
public class SpringConfig {
 	private final MemberRepository memberRepository;

	public SpringConfig(MemberRepository memberRepository) {
	 	this.memberRepository = memberRepository;
	 }
	 @Bean
	 public MemberService memberService() {
	 	return new MemberService(memberRepository);
 }
}

 

출처 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

반응형