일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- freenom
- lazy evaluation
- ORACLE문법
- Catalyst Optimizer
- 프로그래머스 큰 수 만들기
- 프로그래머스
- 지연연산
- Databricks
- 하둡에코시스템
- 실행엔진
- 카프카
- 데이터베이스복사
- 프로그래머스힙
- 데이터파이프라인
- 하둡2.0
- AWS Crawler
- 스파크
- 문맥교환
- 데이터엔지니어링
- Spark
- 런타임데이터영역
- 하둡1.0
- 서버간 복사
- 데이터 수집
- 하둡
- Spark 최적화
- kafka 설치
- EMR 구조
- 빌드도구
- ORACLE MSSQL차이
- Today
- Total
띵유로그
[Spring Boot] Spring Data Jpa 적용 및 테스트 본문
1. 의존성 추가하기
의존성 | 설명 |
compile('org.springframework.boot:spring-boot-starter-data-jpa') | 스프링 부트용 Spring Data Jpa 추상화 라이브러리. 스프링 부트 버전에 맞춰 자동으로 JPA 관련 라이브러리 버전 관리해줌. |
compile('com.h2database:h2') | 인메모리형 데이터베이스(테스트용으로 사용) |
2. 도메인 패키지 생성. & Posts 클래스 생성.
게시글, 댓글, 회원, 정산 등 sw요구사항을 관리하기 위한 영역.
하위에 posts 패키지와 Posts 클래스를 생성한다.
Posts 클래스는 실제 DB의 테이블과 매칭될 클래스이며 Entity클래스 라고도 한다.
Posts 클래스 내용은 아래와 같다.
롬복라이브러리를 사용해서 getter와 생성자를 자동으로 생성해주었다.
@Entity는 JPA의 어노테이션.
참고.
Annotation | 설명 |
@Entity | 테이블과 링크 될 클래스임을 나타냄. 보통 클래스의 카멜케이스이름을 언더스코어로 네이밍하여 테이블이름으로 지음. SalesManager.java -> sales_manager table |
@id | 테이블의 PK필드 |
@Generated Value | PK 생성규칙. (스프링부트 2.0) GenerationType.IDENTITY 옵션 설정시 auto_increment 됨 |
@Column | 테이블의 칼럼. 굳이 선언하지 않아도 해당 클래스의 필드는 모두 칼럼이 됨. size늘리거나 타입 변경시 지정 필요 |
주의할 점.
Entity 클래스에서는 절대 Setter 함수를 만들지 않는다.
값들이 어떤 함수에서 어떻게 바뀌는지 파악하기 쉽지 않기 때문이다.
setter를 호출하는 것이 아닌 비즈니스 로직에 따라 이름을 정하고 그 안에서 값을 변경해주는것이 좋다.
그렇다면, setter가 없는데 어떻게 값을 채워서 DB에 삽입할까?
기본적으로 생성자를 통해서 값을 채운다.
(이 코드에서는 Builder를 사용 - 지금 채우고있는 값이 어떤값인지 파악하기에 용이함)
생성자를통해 DB에 삽입하고 변경이 필요한 경우 필요한 event 에 맞도록 함수를 호출하는것이 좋다.
3. JpaRepository 생성.
Posts 클래스로 Database를 접근하게 해 줄 Jpa Repository를 생성해야한다.
(ibatis, MyBatis 등에서는 Dao 라고 불린다) Jpa에서는 Repository라고 불리고 인터페이스로 생성한다.
Repository를 생성한 후 <Entity 클래스, PK타입> 을 상속하면 CRUD메소드가 자동으로 생성된다.
* Entity클래스랑 Entity Repository는 같은 경로에 있어야함.
4. 테스트코드 작성.
테스트패키지에 동일한 경로에 PostRepositoryTest클래스 를 만든다.
save, findAll 기능을 테스트 해보자.
위 코드와 같이 test로 게시글을 추가한 다음 곧바로 다시 불러왔다.
assertThat 함수를 통해 정상적으로 저장되었는지 확인해보았다. (assertj 의 assertThat 함수임.)
1) RunWith annotation을 통해, SpringRunner라는 스프링실행자를 사용한다.(Junit과 테스트사이의 연결자)
2) Autowired를 통해 스프링이 관리하는 bean을 주입받았다.
3) After annotation은 Junit에서 단위테스트 종료시마다 수행되는 메소드를 지정한다.
테스트 종료 후 h2 안에 데이터를 다 없애준다.
4) SpringBootTest annotation을 사용하면 H2 데이터베이스를 자동으로 실행해준다.
5. 테스트 결과 확인
정상적으로 테스트가 통과했다.
실제 실행된 쿼리를 확인하기 위해 스프링부트의 설정을 바꿔보자.
resources 폴더에 application.properties 파일을 추가하고
application.properties 추가구문.
다시 테스트틀 실행해보자.
H2의 쿼리로 출력되고있는데 다음과같이 코드를 추가하면 MySQL 구문으로 출력된다.
참고)
intellij idea - Intelij 2019.1 update breaks JUnit tests - Stack Overflow