day81 🌕

장미·2022년 9월 3일
0

오늘의 성과

목록 보기
81/129

스프링 DB 2편 - 데이터 접근 활용 기술 섹션 3 수강

섹션 3. 데이터 접근 기술 - 테스트 수강 완료!!

@SpringBootTest
@SpringBootTest@SpringBootApplication을 찾아서 설정으로 사용한다.

테스트를 두 번 실행할 때, 처음 테스트를 실행할 때 저장한 데이터가 계속 남아있기 때문에 두 번째 테스트에 영향을 준다. 이 문제를 해결하려면 각 테스트가 끝날 때마다 해당 테스트에서 추가한 데이터를 삭제해야 한다. 그래야 다른 테스트에 영향을 주지 않는다.

테스트에서 중요한 원칙은 다음과 같다.

  • 테스트는 다른 테스트와 격리해야 한다.
  • 테스트는 반복해서 실행할 수 있어야 한다.

트랜잭션과 롤백 전략

테스트가 끝난 뒤 트랜잭션을 강제로 롤백하면 데이터가 깔끔하게 지워진다. 중간에 테스트가 실패해서 롤백을 호출하지 못해도 괜찮다. 트랜잭션을 커밋하지 않았기 때문에 데이터베이스에 해당 데이터가 반영되지 않는다.

다음 순서와 같이 각각의 테스트 실행 직전에 트랜잭션을 시작하고, 각 테스트 실행 직후에 트랜잭션을 롤백해야 한다. 그래야 다음 테스트에 데이터로 인한 영향을 주지 않는다.

  1. 트랜잭션 시작
  2. 테스트 A 실행
  3. 트랜잭션 롤백
  1. 트랜잭션 시작
  2. 테스트 B 실행
  3. 트랜잭션 롤백

@BeforEach
각각의 테스트 케이스를 실행하기 전에 호출된다. 여기서 트랜잭션을 시작하면 된다. 그러면 각 테스트를 트랜잭션 범위 안에서 실행할 수 있다.
transactionManager.getTransaction(new DefaultTransactionDefinition())로 트랜잭션을 시작한다.

@AfterEach
각각의 테스트 케이스가 완료된 후에 호출된다. 여기서 트랜잭션을 롤백하면 된다. 그러면 데이터를 트랜잭션 실행 전 상태로 복구할 수 있다.
transactionManager.rollback(status)로 트랜잭션을 롤백한다.

@Transactional

스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 애노테이션 하나로 깔끔하게 해결해 준다.

스프링이 제공하는 @Transactional 애노테이션은 로직이 성공적으로 수행되면 커밋하도록 동작한다.
@Transactional 애노테이션을 테스트에 적용하면 스프링은 테스트를 트랜잭션 안에서 실행하고, 테스트가 끝나면 트랜잭션을 자동으로 롤백시켜 준다.

@Transactional이 적용된 테스트 동작 방식

⬆️ @Transactional이 적용된 테스트 동작 방식

정리
✔️ 테스트가 끝난 후 개발자가 직접 데이터를 삭제하지 않아도 되는 편리함을 제공한다.
✔️ 트랜잭션 범위 안에서 테스트를 진행하기 때문에 동시에 다른 테스트가 진행되어도 서로 영향을 주지 않는다.

참고

데이터베이스에 데이터가 잘 들어갔는지 확인하고 싶다면 @Commit 애노테이션을 클래스 또는 메서드에 붙이면 된다. 그럼 테스트 종료 후 롤백 대신 커밋이 호출된다.

임베디드 모드

H2 데이터베이스는 자바로 개발되어 있고, JVM 안에서 메모리 모드로 동작하는 특별한 기능을 제공한다.
DB를 애플리케이션에 내장해서 함께 실행하기 때문에 임베디드 모드(Embedded mode)라 한다. 애플리케이션이 종료되면 임베디드 모드로 동작하는 H2 데이터베이스도 함께 종료되고 데이터도 모두 사라진다.

스프링 부트는 임베디드 데이터베이스에 대한 설정도 기본으로 제공한다. 스프링 부트는 데이터베이스에 대한 별다른 설정이 없으면 임베디드 데이터베이스를 사용한다.


카멜, 파스칼, 케밥, 스네이크 케이스

프로그래밍 표기법

프로그래밍 표기법이란 프로그래밍을 할 때 일반적으로 사용되는 명명 표기법으로, 공백을 제거하며 글자를 나열시키는 방법이다.
프로그래밍 언어 또는 데이터베이스 명명 규칙마다 각 차이점이 있으며, 그에 맞춰 사용하는 것이 좋다.

카멜 케이스(Camel Case)

낙타의 봉우리같이 생겨서 붙여진 이름.
첫 문자를 제외하고 이후 단어에 첫 글자마다 대문자로 표현한다.

원본 문자: Newbie Jangmi JJANG
케이스 적용 문자: newbieJangmiJjang

파스칼 케이스(Pascal Case)

카멜 케이스와 비슷한 방식이지만, 첫 번째 글자도 첫 번째 문자를 대문자로 변경해 준다는 것이 차이점이다.
자바 클래스의 이름을 정할 때 사용한다.

원본 문자: Newbie Jangmi JJANG
케이스 적용 문자: NewbieJangmiJjang

케밥 케이스(Kebab Case)

카멜 케이스와 달리 모두 소문자로 표현하고, 단어와 단어 사이에 대시(-)를 사용하여 이어준다.
yml 파일이나 url 명명 규칙에서 사용한다.

원본 문자: Newbie Jangmi JJANG
케이스 적용 문자: newbie-jangmi-jjang

스네이크 케이스(Snake Case)

케밥 케이스에서 대시(-) 대신 언더바(_)를 사용한다.
전체 문자를 소문자로 표현하거나 대문자로 표현한다. 대문자로 표현하는 경우는 주로 상수의 변수 이름을 결정할 때 사용한다.

원본 문자: Newbie Jangmi JJANG
케이스 적용 문자: newbie_jangmi_jjang (or) NEWBIE_JANGMI_JJANG


참고 자료

  • 어라운드허브 스튜디오 - AroundHub Studio, “프로그래밍 표기법에 대해 간단히 알려드립니다 | 카멜 케이스 | 파스칼 케이스 | 케밥 케이스 | 스네이크 케이스”, https://youtu.be/keQTSBAzIIg

내일 발표 준비!! (스프링 트랜잭션)

profile
김뉴비

0개의 댓글

관련 채용 정보