스프링&스프링부트

인프런 스프링 입문 08 / 스프링 DB 접근, H2, JDBC

gitofjy 2022. 12. 6. 22:13

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


스프링 DB 접근 기술

H2 데이터베이스 설치

- https://www.h2database.com/html/download-archive.html

- 1.4.200 버전 platfrom-dindependent 다운로드

- 압축 해제 후 h2.bat 실행

 

 

- 최초 접속(연결) 후 JDBC URL 변경 후 다시 연결

    > jdbc:h2:tcp://localhost/~/test

 

- cmd창에서 파일 확인하기 dir + 파일이름

dir test.mv.db

C:\Users\USER>dir test.mv.db
 C 드라이브의 볼륨: Windows10
 볼륨 일련 번호: 98DC-2E82
 C:\Users\USER 디렉터리
2022-12-06  오후 03:31            24,576 test.mv.db
               1개 파일              24,576 바이트
               0개 디렉터리  134,485,274,624 바이트 남음

 

- member table 생성

 

 

- member table에 'spring' insert, select로 조회

- insert into member(name) values ('spring');에서 insert into member(name) values ("spring"); 했더니 계속 오류, 조심!

 

 

 

순수 JDBC

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

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

- 회원을 등록하고 DB에 결과가 잘 입력되는지 확인

- 데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.

 

 

이번 수업이 조금 충격적이었던 이유 ?

강사님이 이제는 사용하지 않는다, 20년 전에 이렇게 했다 이런 말로 시작해서 뭐 얼마나 복잡하지? 싶었는데

몇 달 전  국비 교육으로 배운 내용이었다... 그때 배울 때 옛날 기술이다 이런 말은 못 들었던 것 같은데...

국비 교육이 옛날 기술을 사용하는 건 알고 있었지만 이번 강의는 조금 충격...

 

 

 

스프링 통합 테스트

@SpringBootTest
@Transactional
class MemberServiceIntegrationTest {
	
	@Autowired MemberService memberService;
	@Autowired MemberRepository memberRepository;
	
	@Test
	public void 회원가입() throws Exception {
 		
		//Given
 		Member member = new Member();
 		member.setName("hello");
 		
		//When
 		Long saveId = memberService.join(member);
 		
		//Then
 		Member findMember = memberRepository.findById(saveId).get();
 		assertEquals(member.getName(), findMember.getName());
 	}
 	
	@Test
 	public void 중복_회원_예외() throws Exception {
 		
        //Given
        Member member1 = new Member();
        member1.setName("spring");
        Member member2 = new Member();
        member2.setName("spring");
        
        //When
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class,
        () -> memberService.join(member2)); //예외가 발생해야 한다.
        assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        
        }
}

- @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.

- @Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다

728x90