티스토리 뷰
스프링 데이터 엑세스의 여러가지 방법을 과거의 방법부터 알아보자.
- 순수 JDBC
- JDBC Template
- JPA
- 스프링 데이터 JPA
방법 1. 순수 JDBC
- 고대의 개발자들이 고생고생한 방법. 그랬구나 하고 참고만 하자.
- 순서
- build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가 + build gradle
- 스프링 부트 데이터베이스 연결 설정 추가
- Jdbc 리포지토리 구현
- DataSource를 통해 Connection을 연결한다.
- sql문을 작성한다. (String)
- PrepareStatement에 Connection과 sql문을 담음.
- PrepareStatement에 담긴 sql에 파라미터로 전달받은 값을 넣는다.
- PrepareStatement.excuteUpdate()으로 DB에 실제 쿼리를 보낸다.
- Connection 연결을 끊는다.
- 이 부분의 코드가 정말 길고 번거롭다.
- 스프링 Configuration 변경 -> 개방-폐쇄 원칙(OCP, Open-Closed Principle)
스프링 통합 Test
- 스프링 컨테이너와 DB까지 연결한 테스트
- @SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.
- @Transactional : Test 코드에 해당 어노테이션이 붙을 경우, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.
(기존에 @AfterEach로 매 테스트마다 데이터를 clear 하는 메서드를 실행할 필요가 없어진다.)
- 통합 Test는 Spring을 실행시키는 시간이 오래걸린다는 단점이있다.
기존에 Java 코드만으로 짠 단위 테스트를 잘 만드는게 훨씬 더 좋은 테스트이다.
방법 2. 스프링 Jdbc Template
- 실무에서도 많이 쓰는 방식
- JdbcTemplate 라이브러리가 제공하는 API를 통해 기존의 순수 Jdbc 코드에서 반복되는 코드를 제거해 짧게 축약한다.
- sql은 직접 작성해야한다.
- 순서
- 먼저 JdbcTemplate를 생성한다.
- JdbcTemplate에 DataSource를 넣는다. (JdbcTemplate는 DI해서 쓰는 애가 아님)
- 결과를 담을 rowMapper를 생성한다.
- JdbcTemplate.query()를 통해 sql을 날리고, 결과를 rowMapper로 매핑해줘야한다. (return 형식은 List이다.)
방법 3. JPA
- ORM (Object Relational Mapping)기술. 객체(O)와 관계형데이터베이스(R)를 매핑(M)한다고 생각하면 된다.
- JPA는 인터페이스이다. 구현체로는 Hibernate가 있다.
- 전 세계에서 가장 많이 쓰는 DB 접근 방식. (우리나라와 중국은 아직도 JDBC template 방식을 많이쓴다.)
- JDBC template이 반복되는 코드를 제거하고 sql은 직접 입력했다면, JPA는 sql 조차 직접 작성할 필요가 없다.
- SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다. -> 개발 생산성의 증가!
- 순서
- 관련 dependency 추가. (기존의 jdbc 는 주석)
- application.properties 에 설정 추가
- 엔티티를 매핑한다.
- JPA 레포지토리 생성
- EntityManager를 DI한다. JPA는 모든 동작이 EntityManager를 통해 이루어진다. 스프링부트는 자동으로 Entity Manager와 DataBase를 연결한다. em은 이전에 배웠던 Connection정보 및 DataSource 등을 전부 가지고 있다.
- 쿼리는 JPQL을 쓴다.
- JPA를 통한 모든 데이터 변경은 트랜잭션 안에서 실행해야 한다.
- Config 클래스에서 Repository Bean 등록 (EntityManager DI)
- Test
방법 4. 스프링 데이터 JPA
- JPA 만으로도 반복되는 코드를 제거하고 쿼리사용을 줄일 수 있어서 편했다. 하지만 여기서 스프링 데이터 JPA를 사용하면 Repository의 구현체를 만들 필요조차 없어지고 인터페이스만으로 개발할 수 있다.
- 기본 CRUD 또한 스프링 데이터 JPA에서 제공한다.
- 개발의 효율이 좋아지지만 JPA를 모르고 스프링 데이터 JPA만 알면 절대 안된다.
- 순서
- JpaRepository를 상속받는 인터페이스 생성. 제네릭의 첫번째 인자는 Type이고 두번째 인자는 PK의 Type이다.
이게 끝이다.
JpaRepository 인터페이스를 상속받으면 자동으로 구현체를 만들고 Spring Bean에 등록한다. - Config 설정
- JpaRepository에서 구현하지 않은 부분은 규칙에 맞춰 추상메소드를 작성하면 자동으로 구현해준다.
꿀팁
- 생성자가 1개일 경우 @Autowired를 생략할 수 있다.
- @Commit을 활용하면 Test 코드에서도 결과를 DB에 반영할 수 있다.
- 인터페이스가 인터페이스를 구현할 때는 extends(상속)를 쓴다.
'Web 개발' 카테고리의 다른 글
[Web] Spring 핵심 원리 1 - Spring은 뭘까? Spring의 핵심? (0) | 2021.12.16 |
---|---|
[Web] Spring Basic 7 - AOP (0) | 2021.12.16 |
[Web] Spring Basic 5 - 웹 MVC 개발 (0) | 2021.12.12 |
[Web] Spring Basic 4 - DI, Spring Bean 과 의존관계 (0) | 2021.12.11 |
[Web] Spring Basic 3 - 백엔드 개발 (0) | 2021.12.10 |
- Total
- Today
- Yesterday
- Spring Boot
- g4
- 다익스트라
- S2
- 알고리즘
- 그리디
- map
- G5
- 우선순위큐
- laugh4mile
- react native
- 백준
- react
- S3
- 자바
- PriorityQueue
- 문자열
- 리액트
- 객체지향
- 코딩새내기
- DFS
- 백트래킹
- 구현
- 시뮬레이션
- java
- Spring
- 현꾸라지
- BFS
- 리액트 네이티브
- SWEA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |