본문 바로가기
개발/Spring

[스프링 입문] 스프링 회원관리 예제 - 7. 스프링 DB 접근 기술

by ujin2021 2021. 6. 30.

* 인프런 김영한님의 '스프링 입문' 강의를 듣고 작성한 내용입니다! (https://inf.run/txXC)

 

H2 DB 설치

 

H2 Database Engine

H2 Database Engine Welcome to H2, the Java SQL database. The main features of H2 are: Very fast, open source, JDBC API Embedded and server modes; in-memory databases Browser based Console application Small footprint: around 2 MB jar file size     Suppor

h2database.com

  • (Windows 기준) Download -> Windows Installer 클릭해서 설치
  • 설치 후 H2 console 실행
  • jdbc:h2:~/test 생성
  • 이후 ~/ 경로 에서 test.mv.db 파일 생성 확인
  • 이후부터는 jdbc:h2:tcp://localhost/~/test 로 접속
  • 접속 후 member table생성 (테이블 관리 위해 프로젝트 루트에 sql/ddl.sql 파일 생성)
  • id 설정시 generated by default as identity 라고 해주면 id값을 setting안하고 insert해도 자동으로 db가 채워준다

 

순수 Jdbc

  • 옛날에는 이렇게 코드를 길게 짰었다...(코드는 강의 자료 참고)
  • SpringConfig.java에 MemberRepository에서 return new JdbcMemberRepository(dataSource); 로 변경해준다 (repository 구현체를 memory에서 순수 jdbc로 바꾸기)
  • => 이렇게 해주는 것을 OCP(개방 폐쇄 원칙) 이라 한다. 확장에는 열려있고, 수정에는 닫혀있다. 객체지향의 다형성 이용

 

스프링 통합 테스트

  • 테스트 시에 db에 데이터를 넣어 주는 것을 여러번 해야하는데, 테스트를 여러번 하니까 test class위에 @Transactional annotation을 달아줘서 테스트 하나가 끝나면 rollback 하도록 (만약 commit 해야하면 해당 테스트 위에 @Commit 달아주면 된다)
  • 스프링 위에 올려서 하는 테스트를 통합테스트라고 한다 (이전에 java 코드로 짠것은 단위테스트라 한다)
  • 단위테스트가 실행이 더 빠르다(스프링 컨테이너 없이 하니까)

 

스프링 JdbcTemplate

  • 순수 jdbc와 동일
  • sql은 직접 작성

 

JPA

  • 기존의 반복되는 코드를 줄여준다
  • sql과 데이터 중심 설계에서 객체 중심 설계로 전환 가능
  • 생산성을 높일 수 있다
  • build.gradle에 jpa, h2 데이터베이스 관련 라이브러리를 추가한 후 refresh(코끼리 모양 누르기)
  • EntityManager을 사용한다(em, 이전엔 datasource사용)
  • jpa 사용시에는 꼭 transaction이 필요하다. 따라서 MemberService에 @Transactional을 추가한다

 

스프링 데이터 JPA

  • jpa기술을 spring이 한번 감싸서 제공하는 기술이다
  • 인터페이스를 통해 CRUD 구현한다
  • 인터페이스를 만들어 놓으면 스프링이 인터페이스 구현체를 만들어 spring bean에 등록하기 때문에 우리는 injection만 해주면 된다
  • JpaRepository<Member, Long> Long은 pk의 data type
  • JpaRepository에 들어가보면 이미 findById, findAll 이(공통 인터페이스) 구현되어 있으므로 우리가 필요한 findByName만 만들어 주면된다
  • 이때 findBy + ? 로 해주고 안에 조건들을 넣어주면 자동으로 select m from Member m where m.name = ? 이렇게 만들어준다