본문 바로가기

백엔드 잡학사전

[스프링 입문] 스프링에서의 DB 접근 기술

순서는,

H2라는 가벼운 DB 설치 및 접근 => 순수 JDBC => 스프링 JPA

 

이렇게 진행이 될 예정이다. 내 컴퓨터에는 H2 설치가 에러가 뜨면서 계속 안 돼서 직접 해보지는 않고 간접 체험했다.

 

H2 데이터베이스

설치 후 깔끔한 GUI가 보임.

일반적인 쿼리문을 통해서 DB에 들어가는 데이터를 만들어줌. 매우 직관적이고 쉬움.

JAVA에서 Long을 쓴다면 SQL에서는 bigint를 사용함.

 

* 이건 근데 cmd로 DB서버를 띄워둬야 한다. 그걸 끄면 작동 안 됨.

 

이제 이걸 앱과 연동시켜보자. 메모리가 아닌 DB에 데이터가 저장되게끔 해보자!

 

순수 JDBC 그리고 템플릿 사용

지금 실무를 하는 데는 몰라도 지장없지만, 예전에는 어떻게 진행했는지를 알아보는 시간.

,,,

알아보기는 했는데 적기는 너무 귀찮으므로, 나중에 레퍼런스로 돌아오던가 하자!

 

JDBC로 진행하면, 따로 리포지토리를 만들고 DB를 연결해주면 된다.

연결을 시켜주고, 전체가 잘 돌아가는지 통합테스트를 해주면 된다.

 

테스트 전용 DB는 운영 DB와 별개로 따로 구축한다.

 

@SpringBootTest를 통해서 통합테스트를 진행한다 - 스프링 컨테이너와 테스트를 함께 실행한다.

이제는 afterEach 및 deleteAll 이런 거 없애고 대신해서 @Transactional도 해주고. 이거는 테케를 다 돌린 다음에 roll-back해서 테스트 시 썼던 내용들을 전부 지워주는 것이다. 테스트 케이스마다 그렇게 해준다.

 

물론 테케가 많아지면, 저렇게 SpringBootTest는 너무 오래 걸리기 때문에, 기존에 진행했던 것처럼 JAVA 테스트로 진행하는 게 같은 값이면 더 좋은 테스트다. 그러니까 단위테스트에 익숙해져야 한다.

 

또 구현에서 어지간한 객체들은 @Autowired로 받아주면 된다.

 

앞으로 엔지니어가 되면, 프로덕션 코드가 아닌 테스트 코드를 중점적으로 짜게 될 거다. 거의 두배 이상의 시간을 할애할 만큼 테스트가 중요하다.

 

JPA (Java Persistence API)

* ORM (Object-Relational Mapping)은 뭐지? 새로운 용어들이 자꾸 들어오니까 헷갈리는데,,,

   ORM은 객체 지향 프로그래밍에서 사용되는 객체와 RDBMS의 테이블 간의 데이터를 자동으로 매핑해주는 기술.

   DB의 테이블과 OOP의 언어를 연결시켜, SQL 쿼리를 작성 안해도 DB 작업을 할 수 있게 해준다.

 

   JPA는 자바만의 ORM이라고 생각하면 된다.

   그러니까 ORM의 한 종류인데, 언어가 JAVA일 때 사용하는 ORM의 이름이 JPA다 라고 생각하면 그만이다.

   JPA는 SQL과 유사하지만 객체를 대상으로 쿼리를 작성하는 JPQL을 제공함.

 

   JPA는 표준 인터페이스고, 그걸 활용해서 만든 구현체가 hibernate, eclipse 등이 있는 거다.

   그 중 hibernate에만 집중해도 무방.

 

- JPA는 개발자로 하여금 SQL을 쓰지 않고 JPA가 모두 직접 만들어서 실행해준다.

- JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임으로 전환을 할 수 있다.

- JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

 

 

▶사용하는 방법은 어떻게 될까?

 

1 우선 build.gradle(컨픽 파일)에 starter-data-jpa를 구현해준다.

2 Member 파일에 가서 Member 클래스에 @Entity 딱지 붙여주고, @Id @GeneratedValue 이런 식으로 붙여주면 Id에 대해서 자연스럽게 저장을 해준다. 뒤에 strategy = GenerationType.IDENTITY를 해주는 것도 잊지말자.

3 JpaMemberRepository 라는 폴더를 만들고 그 안에 MemberRepository를 implement 받고, EntityManager를 정의한다.

-> 이 EntityManager라는 녀석이 바로 스프링과 DB를 연결하는 주체가 된다. EntityManager가 가장 중요하다.

4 그리고 서비스 단에서 @Transactional을 써준다.

 

엔티티라는 게, 매우 간편하게도 이미 매핑이 다 되어있다.

 

스프링 데이터 JPA

스프링 부트 + JPA 위에 스프링 데이터 JPA를 올리면 이게 된다고? 할만한 것들이 다 된다고 한다.

스프링 데이터 JPA는 어디까지나 JPA를 더 효율적으로 할 수 있게 도와주는 녀석이므로, 잊지 말자.

 

 

스프링 데이터를 쓰면 스프링 JPA 보다도 훨씬 쉬워지기는 하는데, 일단 이런 게 있다는 것만 알고 넘어가자.