공부공부

공부공부-230320

nayoon 2023. 3. 20. 07:47

@SpringBootTest 애노테이션을 사용하면 스프링 컨테이너와 함께 테스트를 실행한다.

 

스프링 통합 테스트 시 보통 운영 DB가 아닌 테스트 DB를 구축한다.

 

 

@Transactional

데이터베이스에는 트랜잭션이라는 개념이 있어서 insert를 하면 바로 데이터가 들어가는 게 아닌 commit을 해야 데이터가 insert가 된다.

근데 보통은 auto commit이라 바로 데이터가 들어가기는 한다. (auto-commit mode인지 아닌지의 차이)

 

스프링 통합 테스트 시에 @Transactional 애노테이션을 사용하게 되면

1. 테스트를 실행할 때 먼저 트랜잭션을 실행하고

2. DB에 insert 쿼리를 실행한 다음

3. 테스트가 끝날 때 롤백을 해준다.

 

DB에 어떠한 데이터도 반영되지 않기 때문에 다음 테스트에 영향을 주지 않는다.

 

이때, @Commit 애노테이션을 붙이면 @Transactional 애노테이션이고 뭐고 DB에 데이터가 반영된다.

 

단위 테스트와 스프링 통합 테스트 차이

JUnit을 이용해서 단위 테스트를 진행할 수도 있고 @SpringBootTest 애노테이션을 이용해서 스프링 통합 테스트를 진행할 수도 있다.

 

시간 차이

스프링 컨테이너를 띄우고 말고의 차이이기 때문에 시간 차이가 많이 난다.

 

스프링 컨테이너를 반드시 띄워야한다?

또한, 스프링 컨테이너를 반드시 띄워야만 테스트가 가능하다면 테스트 설계 혹은 기능 설계가 잘못된 프로젝트일 가능성이 높다고 한다.

 

결론

따라서 되도록이면 순수한 단위 테스트 위주로 진행할 수 있도록 설계하는 것이 좋겠다.

 

 

 

클래스 내에 생성자가 딱 하나일 경우 @Autowired를 생략해도 스프링 컨테이너에 하나만 등록할 수 있다.

 

template method pattern을 사용해서 JdbcTemplate이라고 불린다.

 

JPA

순수 JDBC에서 JdbcTemplate을 사용하면 반복 작업을 크게 줄일 수 있었다.

그렇지만 JdbcTemplate에서도 개발자가 쿼리를 짜야한다는 사실은 변함이 없다.

Java 진영의 표준 인터페이스라고 보면 되고 Hibernate 등의 구현체가 존재한다.

 

이때, JPA를 사용하면 기존의 반복 코드는 물론이고, 기본적인 쿼리까지 JPA가 직접 만들어서 실행해준다.

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

 

spring.jpa.hibernate.ddl-auto=none

JPA를 사용하면 클래스 객체를 보고 테이블도 다 만들어 주기 때문에 해당 기능을 끄는 코드이다.

 

spring.jpa.hibernate.ddl-auto=create

테이블까지 자동으로 생성해줌

 

 

JPA는 ORM을 기반으로 하는데 Object와 Relational Database Table을 Mapping해준다고 보면 된다.

따라서 매핑하고자 하는 객체에 @Entity 애노테이션을 붙이면 해당 객체는 JPA가 관리하게 된다.

 

 

JPA는 EntityManager를 통해 모든 것들이 동작하게 된다.

build.gradle 파일에서 아래 코드를 넣어줄 경우 스프링 부트가 자동으로 EntityManager를 생성해서 컨테이너에 등록한다.

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

데이터베이스와 연결까지 다 해주었기 때문에 그냥 사용하기만 하면 된다.

 

보통은 테이블 대상으로 쿼리를 실행하는데, JPA는 Entity를 대상으로 쿼리를 실행한다.

@Override
public List<Member> findAll() {
    return em.createQuery("select m from Member m", Member.class).getResultList();
}

위를 보면 JPA를 이용한 모습인데, 쿼리의 모습을 보면 기존과 형태가 다르다.

select 시 Member 자체를 조회하는 것이기 때문에 select m 이다.

 

(JPA를 사용하지 않았다면 select * from Member m 혹은 select m.id, m.name from Member m)

'공부공부' 카테고리의 다른 글

공부공부-230419  (0) 2023.04.21
공부공부-230410  (0) 2023.04.12
공부공부-230409  (1) 2023.04.10
공부공부-230401  (0) 2023.04.01
공부공부-230319  (0) 2023.03.19