📖
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. 인턴 스터디

테스크 코드 분할

PreviousSpringBoot ManagementNext동아리 스터디

Last updated 2 years ago

Was this helpful?

이번에 회사에서 이슈사항이 있었다 현재 배달 쪽 프로젝트에는 800개가 넘는 테스트코드가 존재한다 (물론 내가 짠것 보다 레거시로 있는 코드가 훨----씬 많음) 근데 이슈사항은 이러했다 \

우리는 개발을 진행할 때 개발 > 테스트코드 작성 > 풀테스트(자코코에서 제공해주는 프로젝트 내의 모든 테스트를 한꺼번데에 돌려주는 풀테스트 - 아래참고) 이렇게까지 진행하고 나서 배포를 진행하고 있다 그래서 맨날 풀테스트를 돌리면 오래걸리는 이슈가 있었다 물론 리얼디비에 붙어서 진행하는 테스트도 있고 그냥 h2를 사용하는 테스트도 있다 이렇게 다양한 테스트를 한꺼번에 돌려보니까 여러개의 스프링부트가 한꺼번에 떴다가 꺼지면서 우리회사의 필수 요소인 Graceful Shutdown이 적용되지 않으며 셧다운이 안먹히는 순간부터 그 이후까지의 모든 테스트가 실패해 버리는 이슈가 있었다! 그래서 이미 수가 엄청나게 많아진 테스트를 일단 레거시 테스트코드로 남겨두고 개발이 끝나고 배포하기 전에만 슬쩍 돌려보는 용도로 사용하자는 방법이 나왔다 \

이렇게 추가는 완료되었는데... 앞으로의 문제는 이거다.. 이게 지금 gradle에 어떻게 들어가있는지..? 지금 기존 테스트 / main src / 신규 테스트 이렇게 구성되어있는 상황에서 기존의 gradle에 등록되어있는 jacoco의 fullTest나 test task는 기존 테스트만을 실행해 주고 있는 상황이라서 앞으로 해야할 것은 이러하다 - (신규 테스트를 돌리는 task + 기존 테스트를 돌리는 task) 이러한 테스크를 생성

뭐 찾아도 안나오고... 테스트에 있는 소스를 묶어서 돌려볼려고해도 안나오고.. 총체적 난국이네.. 내일하자.. 꼭 성공시킨다 요거!!

일단 그렇다고 해서 테스트코드를 접을 수는 없으니 이제 다른 신규 환경에서 신규세팅들과 함께 원하는 언어로 테스트 코드를 작성해보자는 방안이 나왔다 지금의 테스트 코드 구성은 그루비 언어로 spock 테스트 프레임워크를 사용해서 짜고 있으며 구조는 bdd를 기반으로 시나리오로 테스트코드를 작성 하고 있다 그런데 현재 테스트 코드 자체는 뭔가 구성도 뒤죽박죽인 감이 없지 않게 있으며 추가로 테스트 환경에 세팅해둔 몇 가지의 고정된 값으로만 확인이 가능한 상황이다 \

앞으로의 테스트 코드는 코틀린을 사용해서 작성하고, JUnit5을 사용하는 것을 베이스로 두고 다양한 미리 있는 세팅 값들을 항상 랜덤 값으로 박혀서 나올 수 있도록 수정하고 최대한 클래스 파일을 나누지 않는선에서 intellij에 있는 해당 클래스파일의 구조를 한눈으로 볼 수 있는 Class Structure 로 확인하며 한줄로 긴--테스트 코드를 만들자 요구사항은 위와 같았다 \

그래서 일단 해야할 것은 테스트코드를 분리하는 작업이였다 원래 프로젝트를 만들게 되면 기본적으로 생성되는 구조는 main module, test moudle 이다 그런데 어떻게 새로운 모듈을 만드느냐... 에 대해서 고민을 해보고 첫 시도는 이미 만들어져 있는 (테스트 800개가 들어있는) 테스트 패키지에 코틀린 패키지를 만들고 그 내부에 구현을 하려고 했었다 근데 그렇게 해보리면 결국은 풀테스트가 같이 돌아버리는? 그러한 이슈가 있더라.. 그래서 결국은 빌드툴인 gradle 단에서부터 분리되는 그러한 테스트 모듈이 필요하단 것을 알게되었다 \

구글링을 열심히 해보니 gradle 공식 홈페이지에 요러한 부분이 있더라! 근데 영어는 힘드니까.. 다시 구글링을 해보니 테스트 코드를 분리하는 글들이 몇가지 있더라! 그래서 그 방식을 확인해보니 gradle 단에서 신규 모듈을 생성하고 그걸 sourceSet으로 잡아서 사용하는 그러한 내용의 글이였다 그 방법에 대해서는 https://docs.gradle.org/current/userguide/java_testing.html#sec:configuring_java_integration_tests https://velog.io/@mu1616/javagradle단위-테스트unit-test와-통합-테스트integration-test-환경-분리 여기에 잘 적혀있다 진짜 간단한 flow를 보면 이러하다 : gradle에서 모듈세팅을 해둠 > ide에서 디렉토리를 만듦면 알아서 그걸 모듈로 인식 > 테스트 코드 작성 후 돌리면 돌아감 https://github.com/kyu9/KDD 그리고 진----짜루 간단하게 작업해본 프로젝트가 있다 \

작업하는데 특징으로는 일단 외부 모듈에서 main 에 있는 코드를 사용하기 위해서는 패키지의 이름과 경로를 무조건 똑같게 해야 한다는 점이다 그-래-야 테스트로 인식해서 메인에 있는 코드를 기준으로 해서 스프링부트 테스트가 가능하게 된다 이제 그렇게해서 보면 진짜로 신규 패키지에서 간단하게 테스트를 작성하니까 잘만뜨더라 근데 여기까지가 내 간단한 프로젝트에서 그렇게 되는 거였고 회사에서 적용해보려고 했구만 워낙 큰 플젝이라 그런지 테스트를 진행하는데 있어서 property에서의 다양한 세팅들이 필요했었고 이 세팅들이 안먹는 이슈가 있었다 그래도 일단은 테스트코드가 돌면서 기본적으로 메인의 프로퍼티도 참조를 한다고 생각을 하고 어떤 세팅이 문제인가 들여다 봤었는데 정말 속아보자는 생각으로 그냥 진짜 스프링부트가 뜨는데 필요한 설정들을 신규 모듈에 넣어보았다 그랬더니 왈라 진짜 잘만 되더라 아무튼 일단 스프링 부트 테스트가 뜨는 것을 보고 회사에서 튀어나왔는데 차주에는 계속해서 신규 테스트 구성을 위해서 힘써보자 물론 또 많은 이슈사항이 있겠지만.. 일단 시작은 되었으니 화이팅\

또 이슈사항이 있거나 작성하고 싶은게 있으면 추가로 작성해보겠당 추가로 이번에 진행하고 있는게 테스트 모듈1, 테스트 모듈2 이렇게 한 번에 하나씩의 모듈을 진행하는 방식이 아니라 하나의 테스크를 만들어서 그 테스크를 통해서 기존의 모듈에 있는 모든 테스트와 신규로 만든 신규모듈에 있는 모든 테스트를 한꺼번에 진행할 수 있도록 하는 방법을 고안 중이였다.

gradle 에 있는 finializedBy이라는 키워드를 기준으로 해서 진행할 수 있도록 해봄

//define fullTest Task
task fullTest(type: Test){
    finalizedBy "test"
    fullTest.finalizedBy('integrationTest')
}

기존에 만들었던 IntegrationTest 이라는 테스크를 기준으로해서 fullTest 테스트가 들어가는 순간에 다 끝나고 integrationTest 을 붙혀서 실행하도록 해보니까 잘만 되어더라!! \

\

img.png
img_1.png
img_2.png