티스토리 뷰

스프링 데이터 엑세스의 여러가지 방법을 과거의 방법부터 알아보자.

  1. 순수 JDBC
  2. JDBC Template
  3. JPA
  4. 스프링 데이터 JPA

 


 

방법 1. 순수 JDBC

- 고대의 개발자들이 고생고생한 방법. 그랬구나 하고 참고만 하자.

- 순서

  1. build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 + build gradle
  2. 스프링 부트 데이터베이스 연결 설정 추가
  3. Jdbc 리포지토리 구현
    • DataSource를 통해 Connection을 연결한다.
    • sql문을 작성한다. (String)
    • PrepareStatement에 Connection과 sql문을 담음.
    • PrepareStatement에 담긴 sql에 파라미터로 전달받은 값을 넣는다.
    • PrepareStatement.excuteUpdate()으로 DB에 실제 쿼리를 보낸다.
    • Connection 연결을 끊는다.
    • 이 부분의 코드가 정말 길고 번거롭다.
  4. 스프링 Configuration 변경 -> 개방-폐쇄 원칙(OCP, Open-Closed Principle)

 

 

스프링 통합 Test

- 스프링 컨테이너와 DB까지 연결한 테스트

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

- @Transactional : Test 코드에 해당 어노테이션이 붙을 경우, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

(기존에 @AfterEach로 매 테스트마다 데이터를 clear 하는 메서드를 실행할 필요가 없어진다.)

- 통합 Test는 Spring을 실행시키는 시간이 오래걸린다는 단점이있다.

기존에 Java 코드만으로 짠 단위 테스트를 잘 만드는게 훨씬 더 좋은 테스트이다.

 

 

방법 2. 스프링 Jdbc Template

- 실무에서도 많이 쓰는 방식

- JdbcTemplate 라이브러리가 제공하는 API를 통해 기존의 순수 Jdbc 코드에서 반복되는 코드를 제거해 짧게 축약한다.

- sql은 직접 작성해야한다.

- 순서

  1. 먼저 JdbcTemplate를 생성한다. 
  2. JdbcTemplate에 DataSource를 넣는다. (JdbcTemplate는 DI해서 쓰는 애가 아님) 
    Spring에서도 이 스타일을 권장한다.
  3. 결과를 담을 rowMapper를 생성한다.
  4. JdbcTemplate.query()를 통해 sql을 날리고, 결과를 rowMapper로 매핑해줘야한다. (return 형식은 List이다.)
    순수 Jdbc 방식에서 줄이고 줄여 2줄이 되었다!

 

방법 3. JPA

- ORM (Object Relational Mapping)기술. 객체(O)와 관계형데이터베이스(R)를 매핑(M)한다고 생각하면 된다.

- JPA는 인터페이스이다. 구현체로는 Hibernate가 있다.

- 전 세계에서 가장 많이 쓰는 DB 접근 방식. (우리나라와 중국은 아직도 JDBC template 방식을 많이쓴다.)

- JDBC template이 반복되는 코드를 제거하고 sql은 직접 입력했다면, JPA는 sql 조차 직접 작성할 필요가 없다.

- SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. -> 개발 생산성의 증가!

- 순서

  1. 관련 dependency 추가. (기존의 jdbc 는 주석)
  2. application.properties 에 설정 추가
    line.5 : sql 출력, line.6 : 테이블을 자동으로 생성하는 기능
  3. 엔티티를 매핑한다.
    @Id : PK, @GeneratedValue : outoIncreament
  4. JPA 레포지토리 생성
    • EntityManager를 DI한다. JPA는 모든 동작이 EntityManager를 통해 이루어진다. 스프링부트는 자동으로 Entity Manager와 DataBase를 연결한다. em은 이전에 배웠던 Connection정보 및 DataSource 등을 전부 가지고 있다. 
    • 쿼리는 JPQL을 쓴다.
  5. JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
    Service 계층에 @Transactional을 추가했다
  6. Config 클래스에서 Repository Bean 등록 (EntityManager DI)
  7. Test

 

방법 4. 스프링 데이터 JPA

- JPA 만으로도 반복되는 코드를 제거하고 쿼리사용을 줄일 수 있어서 편했다. 하지만 여기서 스프링 데이터 JPA를 사용하면 Repository의 구현체를 만들 필요조차 없어지고 인터페이스만으로 개발할 수 있다.

- 기본 CRUD 또한 스프링 데이터 JPA에서 제공한다.

- 개발의 효율이 좋아지지만 JPA를 모르고 스프링 데이터 JPA만 알면 절대 안된다.

- 순서

  1. JpaRepository를 상속받는 인터페이스 생성. 제네릭의 첫번째 인자는 Type이고 두번째 인자는 PK의 Type이다.
    이게 끝이다.
    JpaRepository 인터페이스를 상속받으면 자동으로 구현체를 만들고 Spring Bean에 등록한다.
  2. Config 설정
  3. JpaRepository에서 구현하지 않은 부분은 규칙에 맞춰 추상메소드를 작성하면 자동으로 구현해준다.

 


 

꿀팁

 

- 생성자가 1개일 경우 @Autowired를 생략할 수 있다.

 

- @Commit을 활용하면 Test 코드에서도 결과를 DB에 반영할 수 있다.

 

- 인터페이스가 인터페이스를 구현할 때는 extends(상속)를 쓴다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함