[Spring] 스프링 입문 - DB 접근 기술

jy9922·2022년 8월 10일
0

Spring

목록 보기
8/34
post-thumbnail

Spring DB 접근 기술 📃

✅ H2 데이터베이스 설치

  • H2 데이터베이스 member 테이블 생성
create table member
(
	id bigint generated by default as identity,
    name varchar(255),
    primary key (id)
);
  • 테이블에 데이터 insert
insert into member(name) values("spring1");
insert into member(name) values("spring2");

✅ 순수 JDBC

/* SpringConfig */
@Configuration
public class SpringConfig {
	private final DataSource dataSource;
    
    public SpringConfig(DataSource dataSource) {
    	this.dataSource = dataSource;
   	}
    
    ...
    
    @Bean
    public MemberRepository memberRepository(){
        //return new MemoryMemberRepository();
        return new JdbcMemberRepository(dataSource);
  • 기존의 interface를 두고 구현체를 바꾸어 낄 수 있으며, 다형성을 편리하게 구현할 수 있다.
    ( 기존의 코드는 그대로 두고 변경해야 하는 부분만 바꿀 수 있다 )
  • DataSource는 데이터베이스 커넥션을 획득할 때 사용하는 객체다.
  • 스프링 부트는 데이터베이스 커넥션 정보를 바탕으로 DataSource를 생성하고 스프링 빈으로 만들어준다.
  • 따라서 DI를 받을 수 있다.

구현 클래스 추가 이미지

스프링 설정 이미지

개방 폐쇄 원칙 (OCP, Open-Closed Principle)

확장에는 열려있고, 수정에는 닫혀있다.

  • 스프링의 DI를 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.

회원을 등록하고 DB에 결과가 잘 입력되는지 확인하면, 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.

참고 ) SOLID 객체지향 5대 원칙

https://www.nextree.co.kr/p6960/

✅ 스프링 통합 테스트

/* MemberServiceIntegrationTest */
@SpringBootTest
@Transactional
// Transaction을 통해 DB를 주기적으로 rollback
class MemberServiceIntegrationTest {
	@Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;
    
    @Test
    void 회원가입(){
    	//given
        Member member = new Member();
        member.setName("spring");
        
        Long saveId = memberService.join(member);
        
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

@SpringBootTest

  • 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional

  • 테스트 케이스에 이 에노테이션이 있으면, 테스트 시작 전에 트렌젝션을 시작하고, 테스트 완료 후에 항상 rollback한다.
  • DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

🔥 TIP 🔥

위의 코드와 같이 @Transactional 과 같은 에노테이션을 이용한 테스트는 통합테스트이고,

@AfterEach / @BeforeEach 를 이용해 단위로 코드를 작성한 것이 단위 테스트다.

테스트 케이스를 작성할 때, 순수한 단위 테스트가 성능이 훨씬 좋다.

테스트 케이스 코드를 짤 때 단위 테스트 위주의 코드를 짜는 연습을 하는게 좋다!

단위 테스트 코드 예시

@AfterEach 
    // 모든 메서드가 연산을 수행한 후 동작할 수 있도록 선언
    // 콜백 메서드
    public void afterEach() {
        repository.clearStore();
    }
  
    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
		assertThat(member).isEqualTo(result);
    }

0개의 댓글