📖
Kyu9's Repo
  • Library of mameil
  • 이슈 경험
    • 20230220_트랜잭션
    • 20230306_캐싱이슈
    • 20230722_테스트코드에서 @Transactional
    • 20230807_deadlock
  • 인턴 스터디
    • Gradle
    • Stream, Optional, 람다식
    • JVM의 메모리 구조, Garbage Collector
    • RESTful API
    • Microservice Architecture
    • HTTP
    • 웹서버란 무엇인가
    • Git Branch
    • TDD
    • Redis을 이용한 캐시
    • Thymeleaf
    • 정리가 필요한 자료들
    • SpringBoot Management
    • 테스크 코드 분할
  • 동아리 스터디
    • 기본 SQL 공부
      • SQL의 기본 개념
      • SELECT 문장을 이용하여 원하는 데이터 출력하기
        • 집합 연산자 사용하기
        • where절에 비교 연산자를 사용해보기
        • SELECT_EX
        • 산술 연산자 사용해보기
      • 단일 행 함수 사용
        • lower/upper 함수 사용하기
        • length함수 사용하기
        • concat함수 사용
        • substr/mid/substring 함수 사용
        • instr함수 사용하기
        • lpad/rpad 함수 사용하기
        • trim/ltrim/rtrim 함수 사용하기
        • replace 함수 사용하기
        • round 함수 사용하기
        • truncate 함수 사용하기
        • mod함수 사용하기
        • ceil함수 사용하기
        • floor함수 사용하기
        • power 함수 사용하기
        • Date fn(날짜 함수)
        • 형 변환 함수
        • 일반함수란
    • a-ha 실습
    • 혼자서 만들어본 게시판
    • AWS 강의
  • 학교 나머지 공부 자료
    • 웹프레임워크(Spring)
      • Spring이란?
      • Webframework1-1
      • Webframework1-2
      • SpringBoot의 특징
      • SpringBoot 생성 방법
      • Spring Data JPA
      • SpringBoot Security
      • SpringBoot HATEOAS
  • 공부 자료들
  • WS 온라인 자바 스터디
    • Week1(JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가.)
    • Week2(자바 데이터 타입, 변수 그리고 배열)
    • Week3(연산자)
    • Week4(제어문)
    • Week5(클래스)
    • Week6(상속)
    • Week7(패키지)
    • Week8(인터페이스)
    • Week9(예외처리)
    • Week10(멀티쓰레드 프로그래밍)
    • Week11(Enum)
    • Week12(Annotation)
    • Week13(I/O)
    • Week14(Generic)
    • Week15(람다식)
  • 백준문제
    • 입출력과 사칙연산
      • We love kriii(10718)
      • 고양이(10171)
      • 개(10172)
      • A+B(1000)
      • A-B(1001)
      • AxB(10998)
      • A/B(1008)
      • 사칙연산(10869)
      • 나머지(10430)
      • 곱셈(2588)
    • for문
      • 구구단(2739)
      • A+B - 3(10950)
      • 합(8393)
      • 빠른 A+B(15552)
      • N 찍기(2741)
      • 기찍 N(2742)
      • A+B - 7(11021)
      • A+B - 8(11022)
      • 별 찍기 - 1(2438)
      • 별 찍기 - 2(2439)
      • X보다 작은 수(10871)
    • if문
      • 두 수 비교하기(1330)
      • 시험 성적(9498)
      • 윤년(2753)
      • 사분면 고르기(14681)
      • 알람 시계(2884)
      • 오븐 시계(2525)
      • 주사위 세개(2480)
      • 영수증(25304)
    • While문
      • A+B - 5(10952)
      • A+B - 4(10951)
      • 더하기 사이클(1110)
    • 1차원 배열
      • 최소, 최대(10818)
      • 최댓값(2562)
      • 숫자의 개수(2577)
      • 나머지(3052)
      • 평균(1546)
      • OX퀴즈(8958)
      • 평균은 넘겠지(4344)
    • 함수
      • 정수N개의 합(15596)
      • 셀프 넘버(4673)
      • 한수(1065)
    • 문자열
      • 아스키코드(11654)
      • 숫자의 합(11720)
      • 알파벳 찾기(10809)
      • 문자열 반복(2675)
      • 단어 공부(1157)
      • 단어의 개수(1152)
      • 상수(2908)
      • 다이얼(5622)
      • 크로아티아 알파벳(2941)
      • 그룹 단어 체커(1316)
    • 기본수학-1
      • 손익분기점(1712)
      • 벌집(2292)
      • 분수찾기(1193)
      • 달팽이는 올라가고 싶다(2869)
      • ACM 호텔(10250)
      • 부녀회장이 될테야(2775)
      • 설탕 배달(2839)
      • 큰 수 A+B(10757)
      • Fly me to the Alpha Centauri(1011)
    • 기본수학-2
      • 소수 찾기(1978)
      • 소수(2581)
      • 소인수분해(11653)
      • 소수 구하기(1929)
      • 베르트와 공존(4948)
    • 재귀
      • 하노이 탑 이동 순서(11729)
      • 피보나치 수 5(10870)
      • 별 찍기(2447)
    • 브루트 포스
      • 블랙잭(2798)
      • 분해합(2231)
      • 덩치(7568)
      • 체스판 다시 칠하기(1018)
      • 영화감독 슘(1436)
    • 집합과 맵
      • 숫자 카드(10815)
      • 문자열 집합(14425)
      • 숫자 카드2(10816)
      • 듣보잡(1764)
      • 대칭 차집합(1269)
      • 서로 다른 부분 문자열 갯수(11478)
    • 정렬
      • 수 정렬하기(2750)
      • 수 정렬하기 2(2751)
      • 수 정렬하기 3(10989)
      • 통계학(2108)
      • 소트인사이드(1427)
      • 좌표 정렬하기(11650)
      • 좌표 정렬하기2(11651)
      • 단어 정렬(1181)
      • 나이순 정렬(10814)
      • 커트라인(25305)
      • 좌표압축(18870)
    • 백트래킹
      • N과 M - 1(15649)
      • N과 M - 2(15650)
      • N과 M - 3(15651)
      • N과 M - 4(15652)
      • N-Queen(9663)
      • 스도쿠(2580)
      • 연산자 끼워넣기(14888)
      • 스타트와 링크(14889)
    • 이분 탐색
      • 수 찾기(1920)
    • 동적계획법
      • 피보나치 함수(1003)
      • 신나는 함수 실행(9184)
      • 01타일(1904)
      • 파도반 수열(9461)
      • RGB거리(1149)
      • 정수 삼각형(1932)
      • 계단 오르기(2579)
      • 1로 만들기(1463)
      • 쉬운 계단 수(10844)
      • 포도주 시식(2156)
      • 가장 긴 증가하는 부분 수열(11053)
      • 가장 긴 바이토닉 부분 수열(11504)
      • 전깃줄(2565)
      • LCS(9251)
      • 연속합(1912)
      • 평범한 배낭(12865)
      • 더하기(9095)
    • DFS와 BFS
      • 미로탐색(2178)
      • 바이러스(2606)
      • DFS와 BFS(1260)
      • 단지번호붙이기(2667)
      • 전쟁 - 전투(1303)
      • 숨바꼭질(1697)
      • 데스 나이트(16948)
      • 나이트의 이동(7562)
      • 녹색 옷 입은 애가 젤다지?(4485)
      • 음식물 피하기(1743)
      • A->B (16953)
      • 숨바꼭질 3(13549)
      • 숨바꼭질 2(12851)
    • 구현
      • 치즈(2636)
  • 프로그래머스 문제
    • SQL
      • Animal Table - Oracle
      • Animal Table - MySQL
      • Animal Table2 - Oracle
      • Animal Table 3,4 - Oracle
    • Lv1
      • 두 개 뽑아서 더하기
      • 제일 작은 수 제거하기
      • 문자열 내 p와 y의 개수
      • 예산
      • 자릿수 더하기
      • 두 정수 사이의 합
      • 같은 숫자는 싫어
      • 가운데 글자 가져오기
      • 수박수박수박수박수박수?
      • 나누어 떨어지는 숫자 배열
      • 2016년
      • 폰캣몬
      • 서울에서 김서방 찾기
      • 문자열을 정수로 바꾸기
      • 소수 만들기
      • 문자열 다루기 기본
      • 소수 찾기(에라토스테네스의 체)
      • 숫자 문자열과 영단어
      • 이상한 문자 만들기
      • 없는 숫자 더하기
      • 문자열 내림차순으로 배치하기
      • 문자열 내 마음대로 정렬하기
      • 약수의 개수와 덧셈
      • 콜라츠 추측
      • 자연수 뒤집어 배열로 만들기
      • 신규 아이디 추천
      • 비밀지도
      • 크레인 인형뽑기 게임
      • 실패율
      • 로또의 최고 순위와 최저 순위
      • 키패드 누르기
      • 정수 내림차순으로 배치하기
    • Lv2
      • 행렬의 곱셈
      • 영어 끝말잇기
      • 영어 끝말잇기
      • N개의 최소 공배수
      • 피보나치 수
      • 124 나라의 숫자
      • 짝지어 제거하기
      • 프린터
      • 다음 큰 숫자
      • 최댓값과 최솟값
      • 최소값 만들기
      • 숫자의 표현
      • JadenCase 문자열 만들기
      • 오픈채팅방
      • 영어 끝말잇기
      • 멀쩡한 사각형
      • 올바른 괄호
      • 위장
      • 기능개발
      • 더 맵게
      • 스킬트리
    • 완전탐색
      • 모의고사(Lv1)
      • 카펫(Lv2)
      • 소수 찾기(Lv2)
    • 정렬(Sorting)
      • K번째 수(Lv1)
      • 가장 큰 수(Lv2)
      • H-Index(Lv2)
    • 해시(Hash)
      • 완주하지 못한 선수(Lv1)
      • 전화번호 목록(Lv2)
    • 탐욕법(Greedy)
      • 체육복(Lv1)
      • 큰 수 만들기(Lv2)
      • 구명보트(Lv2)
    • 동적계획법(DP)
      • 정수 삼각형(Lv3)
    • 깊이/너비 우선 탐색(DFS/BFS)
      • 타겟 넘버(Lv2)
      • 네트워크(Lv3)
      • 단어 변환(Lv3)
  • 스프링부트 책
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
  • JPA 책
    • 프로젝트 세팅 및 기본설정
    • 영속성 관리 개념
    • 엔티티 매핑
      • 실습 예제
    • 연관관계 매핑 기초
      • 실습 예제
    • 다양한 연관관계 매핑
      • 다대일, 일대다 관계
      • 일대일, 다대다 관계
      • 실습 예제
    • 고급 매핑
      • 상속 관계 매핑
      • @MappedSuperclass
      • 복합 키와 식별 관계 매핑
      • 조인 테이블
    • 프록시와 연관관계 관리
      • 프록시
      • 즉시 로딩과 지연 로딩
      • 영속성 전이, 고아 객체
    • 값 타입
      • 임베디드 타입
      • 값 타입과 불변 객체
      • 값 타입의 비교, 컬렉션
    • 객체지향 쿼리 언어
      • JPQL part1
      • JPQL part2
      • JPQL part3
      • QueryDSL
      • NativeSQL
      • 객체지향 쿼리 심화
    • 응용 애플리케이션
      • 엔티티 설정
    • 스프링 데이터 JPA
      • 공통 인터페이스
  • Kotlin In Action
    • 코틀린의 특징
    • 코틀린의 기초
    • 함수 정의와 호출
    • 클래스, 객체, 인터페이스
    • 람다 방식
    • 코틀린 타입 시스템
    • 연산자 오버로딩과 기타 관례
    • 고차함수
    • 제네릭스
    • 애노테이션과 리플렉션
    • 코루틴
  • Oracle
    • Oracle 기본
    • Oracle 심화
  • SQL_연습
    • Revising the Select Query
    • Basic Select
    • Advanced Select
    • Basic Select 2
  • SQL 첫걸음(책)
    • Day 1
    • Day 2
    • Day 3
    • Day 4
    • Day 5
    • Day 6
    • Day 7
    • Day 8
    • Day 9
    • Day 10
    • Day 11
    • Day 12
    • Day 13
    • Day 14
    • Day 15
    • Day 16
    • Day 17
    • Day 18
    • Day 19
    • Day 20
    • Day 21
    • Day 22
    • Day 23
    • Day 24
    • Day 25
    • Day 26
    • Day 27
    • Day 28
    • Day 29
    • Day 30
  • 더 자바 코드를 조작하는 다양한 방법
    • JVM 이해하기
    • 바이트코드 조작
    • 리플렉션
    • 다이나믹 프록시
    • 애노테이션 프로세서
  • 더 자바, 애플리케이션을 테스트하는 다양한 방법
    • JUnit5
    • Mockito
    • 도커와 테스트
    • 성능, 운영이슈, 아키텍처 테스트
  • 이펙티브 자바
    • item1 - 생성자 대신 정적 팩토리 메소드를 고려하라
    • item2 - 생성자에 매개변수가 많다면 빌더를 고려하라
    • item3 - 생성자나 열거타입으로 싱글턴임을 보증하라
    • item4 - 인스턴스화를 막기 위해선 private 생성자를 사용하라
    • item5 - 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
    • item6 - 불필요한 객체 생성을 피하라
    • item7 - 다 쓴 객체 참조를 해제하라
    • item8 - finalizer와 cleaner 사용을 피하라
    • item9 - try-finally 보다 try-with-resources을 사용하라
    • item10 - equals는 일반 규약을 지켜 재정의하라
    • item11 - equals을 재정의하려면 hashCode도 재정의하라
    • item12 - toString을 항상 재정의하라
    • item13 - clone 재정의는 주의해서 진행하라
    • item14 - Comparable을 구현할지 고민하라
  • Elastic Search
    • 강의 Summary
    • Elastic Summary 개념 정리
    • Elastic Summary 적용 정리
  • 토비의 스프링 강의
    • 스프링부트 살펴보기
    • 독립 실행형 서블릿 애플리케이션
  • k8s
    • minikube 설치
    • jenkins 추가
  • Article
    • Choosing the Right MessageBroker
Powered by GitBook
On this page

Was this helpful?

  1. 이슈 경험

20230722_테스트코드에서 @Transactional

토비의 스프링 인프런 강의에서 질문으로 올라온 사항인데 토비님이 직접 유튜브 라이브에서 해당 내용에 대한 답변을 남겨주셨다 https://www.inflearn.com/questions/792383/테스트에서의-transactional-사용에-대해-질문이-있습니다 추가로 해당 건에 대해서 회사에서도 테스트 코드에서 @Transactional 을 붙히는 케이스를 본 적 있기 때문에 궁금증에 해당 내용을 정리해보고자 한다

실제 메인 소스에서의 @Transactional 애노테이션의 의미는 해당 애노테이션이 붙어있는 부분을 메소드의 단위를 하나의 트랜잭션으로 묶겠다는 의미이다 하지만 반대로 테스트코드에서는 @Transactional 은 어떤 무엇일까? 우선 해당 애노테이션의 의미는 이러하다 테스트 코드에서 인 메모리든 리얼 디비든 어떠한 데이터베이스를 사용해서 테스트가 진행되는 테스트 코드인 경우, 해당 애노테이션을 통해서 미리 트랜잭션을 시작해두는 것이다 그렇게 되면 실제 메인 소스에서의 코드에서의 트랜잭션이 @Transactional 의 default 전이 레벨인 REQUIRED 으로 되어있기 떄문에 소스 기준으로 봤을 때 상위인 테스트 코드에서 선언해둔 @Transactional 에 붙게 된다는 것이다 그렇게 붙고 나서는 해당 애노테이션이 붙은 테스트가 종료되는 시점에 실제로 디비에 커밋할 것인가 / 롤백한 것인가 에 대한 것을 정해줄 수 있다는 것이다

그래서 이걸 테스트 코드에서 사용하는 이유가 뭔가? > 테스트코드의 롤백을 위해서 이다 테스트를 하는데 있어서 롤백을 하는 이유는 단순하다 많은 테스트 코드를 진행하면서 그 모든 테스트 코드가 하나의 디비(인메모리든 실제 디비든)를 바라보고 테스트가 돌아갈텐데 테스트를 돌리게 되었을 때 테스트 데이터들이 들어가 있으면 내가 원하는 대로 테스트가 진행되지 않을 것이기 떄문이다 그래서 테스트가 끝나면 해당 테스트 코드가 돌면서 진행되었던 데이터들을 다시 원래대로 되돌리는, 즉 롤백하는 방법들이 있고 뭐 각각의 데이터를 테스트가 종료되는 시점에 직접 하나하나 되돌리는 방법도 있고, 해당 테스트 코드에 @Transactional 을 통해서 전체 롤백을 진행하는 방법도 있다

테스트 코드에서 @Transactional 을 사용하는 방식 자체는 뭔가 구글링을 막 해보면 사용하지 말라 라는 결론으로 항상 나아가곤 한다 그래서 왜 사용하지 말라는걸까?? 바야흐로 스프링 버전 1 시절, 이때는 스프링에서 사용하라고 권장하고 그랬다고 한다 질문을 올려주신 분을 기준으로해서 봤을 때 실제 메인 단에서 @Transactional 을 통해서 트랜잭션 범위를 잘 만들어두었는데 테스트 코드에 달아둔 @Transactional 때문에 코드 전체로 묶이게 되면서 원하는대로 동작하지 않는 이슈로 보인다 > 이렇게 하게되면 확실하게 내가 원하는 대로 코드를 테스트할 수 없다고 생각한다

여기서 해주신 질문은 이러하다 > 테스트 코드에서 @Transactional 말고 내가 원하는대로 디비의 모든 롤백를 일어나게 하는 그러한 애노테이션은 있는가? 아니면 각 테스트가 끝날 때마다 cleanup 하는 방법은 또 뭐가 있는가?

이에 대한 토비님의 답변은 이러하다 토비님 같은 경우에는 옛날에는 dbunit 이라는 도구를 사용해서 테스트 전후로 데이터를 관리하는 그러한 도구를 사용해서 진행하다가 @Transactional 이 나오고 난 이후에는 해당 애노테이션을 사용해서 테스트코드의 관리를 했다고 한다 근데 문제는 하나의 테스트 내에서 2개의 트랜잭션이 만들어져야 하는 경우에 해당 방법을 사용하게 되면 결국은 단 하나의 트랜잭션만 생성되기 떄문에 원하는대로 테스트할 수 없는 경우가 생긴다 옛날에 orm 을 사용할 때에는 직접 트랜잭션을 실행시키고 했어야 하는데 jpa 같은 경우에는 알아서 트랜잭션을 열어준다 jpa 에서 데이터를 밀어넣는 테스트를 할 때 데이터를 등록만 하고 그것을 조회하는 방법을 하지 않는 상황에서는 무조건적으로 flush 작업을 해주어야 한다

결국 결론은 이러하다 > 쓰는 것을 추천한다 이러한 위험성을 가지고 있지만 간편하게 해당 애노테이션을 통해서 테스트 코드의 롤백을 사용할 수 있기 때문, 모든 테이블에 대한 aftereach 를 구현하는 방법 자체는 그렇게 좋은 방법도 아닐뿐더러 그리고 여러 트랜잭션이 발생해야 하는 테스트 케이스에서도 강제로라도 트랜잭션을 관리해서 테스트를 진행하면 된다 대신 문제가 생길 수도 있다는 점을 인지하고 있는 상황에서 진행하면 좋다 사실 모든 테스트 코드가 100% 완벽할 수는 없기 때문에 다양한 테스트들을 통해서 100%를 위해 노력해야한다는 점이 중요하다 이 반대로 db 를 비우는 방향으로 테스트 코드를 만들게되면 굉장히 실수하는 케이스가 발생할 수 밖에 없다고 생각한다고 하신다

정말 raw 하게 노트 필기를 진행해봤는데 뭔가 내가 정리를 잘 못해서 그냥 정보를 쏟아붙는 방식으로만 정리한 것 같다 결론은 결국 이러하다 > 테스트 코드에서의 @Transactional 은 사용하기 편리하고 좋은 기능을 제공해준다 그래서 사용하면 좋긴 하지만 다양한 트랜잭션 케이스에서는 원하는대로 테스트 코드가 돌지 않는 경우가 생길 수 있다 afterEach 로 구현하지 않는 다면 해당 방식으로 사용하는 것도 좋은 방법이라고 보이긴 하지만 현재 내가 테스트 코드를 짜온 방식으로는 뭔가 그러한 위험성에 대해서 리스트를 안고가는 것에 대한 의구심이 들긴 한다 무엇보다 우리 팀 같은 경우에는 테스트 코드의 작성을 위해서 테스트 코드를 위한 MSA mocking 방식이나 afterEach 와 테스트를 위한 세팅을 정해두고 진행하기 떄문에 난 역시 아직도 afterEach 에 대한 사용방식이 좋다는 생각이 들긴 한다 앞으로 기존 방식이 아닌 테스트 코드를 구현하는 방식을 고민할 떄 한번 사용해보자

Previous20230306_캐싱이슈Next20230807_deadlock

Last updated 1 year ago

Was this helpful?