반응형
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);
}
}
반응형
'SPRING' 카테고리의 다른 글
[스프링 핵심 원리] 객체 지향 설계 원칙(SOLID) / IoC / DI / DI 컨테이너 (0) | 2022.09.26 |
---|---|
[스프링 핵심 원리] 주문과 할인 도메인 개발 (0) | 2022.09.21 |
[JPA] ids for this class must be manually assigned before calling save() (0) | 2022.08.28 |
[인프런/SPRING] 회원 서비스 개발 assertThrows()/DI/Optional<T> (0) | 2022.08.27 |
[인프런/SPRING] 회원관리프로그램 - 리포지토리 테스트 작성 Optional<T>/stream().Filter/findAny()/@AfterEach (0) | 2022.08.26 |