[테스트 코드] Spring & JPA 기반 테스트 (1)

0
post-thumbnail

[Practical Testing: 실용적인 테스트 가이드]

섹션 6. Spring & JPA 기반 테스트

📌 Layered Architecture

Spring MVC 기반에서 가장 많이 사용되는 아키텍처
사용자의 요청이 왔을 때 각 레이어 별로 역할을 준다.
관심사를 분리해서 책임을 나누고 유지보수하기 용이하게 만든다.

📌 통합테스트

📍 Library vs. Framework

프론트에서 Vue.js는 프레임워크, React는 라이브러리라고 말한다.

❓ 무슨 차이로 구분해야 하나?

❗ 라이브러리는 내 코드가 주체가 된다. 필요한 기능이 있다면 외부(라이브러리)에서 끌어와서 사용하게 된다.
프레임워크는 이미 갖춰진 동작을 할 수 있는 환경들이 구성되어있다. 내 코드가 수동적으로 프레임 안에 들어가서 역할을 한다.

스프링 같은 경우는 프레임워크로써 이미 갖춰진 것들, 제공하고 있는 환경들이 있고 그거에 맞춰서 코드를 작성해서 끼워 넣으면 원하는 대로 동작을 하게 구조다.

📍 Spring 3대 개념

  • IoC (Inversion of Control)
  • DI (Dependency Injection)
  • AOP (Aspect Oriented Programming)

📌 ORM (Object-Relational Mapping)

객체 지향(Object-Oriented)와 관계형 DB(Relational DB) 간에 패러다임이 다르다.

객체 기반으로 코드를 짜고 데이터를 관계형 DB에 저장하려니까 이 객체 기반의 어떤 패러다임은 관계형 DB 패러다임에 들어가지 않는다. 데이터베이스는 테이블 기반의 설계고, 우리는 객체의 협력에 대한 설계를 한다. 그래서 객체 지향으로 코드를 짜놓고 데이터베이스에 넣을 때는 그 객체를 하나하나 필드별로 분리해서 맵핑을 하는 작업이 필요했다.

📌 JPA (Java Persistence API)

  • JAVA 진영의 ORM 기술 표준
  • 인터페이스이고, 여러 구현체가 있지만 보통 Hibernate를 많이 사용한다.
  • 반복적인 CRUD SQL을 생성 및 실행해주고, 여러 부가 기능들을 제공한다.
  • 편리하지만 쿼리를 직접 작성하지 않기 때문에, 어떤 식으로 쿼리가 만들어지고 실행되는지 명확하게 이해하고 있어야 한다.
  • Spring 진영에서는 JAP를 한번 더 추상화한 Spring Data JPA 제공
  • QueryDSL과 조합하여 많이 사용한다. (타입체크, 동적쿼리)

📍 JPA에서 주로 사용되는 어노테이션

  • 객체 정의 : @Entity(테이블과 객체 매핑), @Id(Entity 정의), @Column(Entity 정의)
  • 연관관계 : @ManyToOne(다대일관계), @OneToMany(일대다관계), @OneToOne(일대일관계), @ManyToMany(다대다관계 / 일대다-다대일 관계로 풀어서 사용)

📌 테스트 어노테이션

1. @SpringBootTest
테스트를 실행할 때 Spring 서버를 띄워서 테스트를 할 수 있게 된다.

2. @DataJpaTest
JPA 관련된 빈들만 주입을 해줘서 Spring 서버를 띄우고 테스트
@SpringBootTest보다 가볍고 속도가 빠르다.

하지만 강사님은 @DataJpaTest보다 @SpringBootTest을 더 선호한다고 하신다.
@DataJpaTest에는 트렌젝션이기 때문에 실패 시 자동으로 롤백이 되기 대문이다.

📌 Persistence Layer

  • Data Access의 역할
  • 비즈니스 가공 로직이 포함되어서는 안된다.
  • Data에 대한 CRUD에만 집중한 레이어

📍 Persistence Layer 테스트 (Repository test)

단위 테스트에서 넘어와서 스프링 환경에서의 통합 테스트를 스프링 서버를 띄워서 한다. 하지만 레이어별로 끊어서 봤을 때는 persistence layer는 데이터베이스에 엑세스 하는 계층이다 보니 기능 단위로 보자면 단위 테스트 성격을 갖고 있다.

📌 Business Layer

  • 비즈니스 로직을 구현하는 역할
  • Persistence Layer와의 상호작용(Data를 읽고 쓰는 행위)을 통해 비즈니스 로직을 전개시킨다.
  • 트랜잭션을 보장해야 한다.
    (롤백에 대한 트랜잭션을 보장하는 책임을 비즈니스 레이어가 가지고 있다.)

📍 Business Layer 테스트 (Service test)

Persistence Layer와 Business Layer를 통합하여 테스트


📑 출처

profile
나는 말하는 감자다

0개의 댓글