유튜브 영상시청 자료
keyword
Test | 단위테스트
TDD | 리팩터링
CI / CD
JUnit
Thread
call stack
병렬실행
체크리스트
✔ 테스트 코드 필요성과 확인 및 정리
✔ JUnit을 활용한 테스트 코드 작성 가능?
✔ Thread와 Multi Thread를 이해 및 설명 가능?
✔ 동기화(Synchronization) 문제를 설명 가능?
✔ JUnit을 활용해 테스트 코드를 작성 가능?
컴퓨터가 이해하는 코드는 어느 바보나 짤 수 있다.
좋은 프로그래머는 사람이 이해하는 코드를 짠다.
-마틴 파울러-
@Test
: 테스트 메서드임을 나타냄. 실행 가능@BeforeEach
: 각 메서드 전에 실행됨을 나타냄.@BeforeAll
: 현재 클래스의 모든 메서드보다 먼저 실행되어야하는 메서드 표시.@AfterAll
: 현재 클래스의 모든 메서드보다 나중에 실행되어야하는 메서드 표시.@RepeatedTest
: 메서드 반복 호출을 함을 표시.@DisplayName
: 사용자 지정 표시 이름을 선언.-> 테스트 메서드 및 Life Cycle을 잘 이해하고 있어야 우아하게 활용 가능
좋은 테스트 코드는 새로운 기능을 구현, 코드를 리팩터링 하는 데에 자신감과 안정감을 주지만,
의미 없는 테스트 코드를 작성하면 테스트 코드 작성에 들이는 에너지가 낭비가 되고,
테스트 코드를 수정 유지 관리하는 데에 많은 비용이 듦
CI/CD
- 애플리케이션 개발 단계를 자동화하여 애플리케이션을 더욱 짧은 주기로 고객에게 제공하는 방법
- 지속적인 통합, 지속적인 서비스 제공, 지속적인 배포
@BeforeAll
,@BeforeEach
... class PracticeTest { @BeforeAll static void setUp() { System.out.println("@BeforeAll - executes once before all test methods in this class"); } @BeforeEach void init() { System.out.println("@BeforeEach - executes before each test method in this class"); } }
@AfterEach
,@AfterAll
... @AfterEach void tearDown() { System.out.println("@AfterEach - executed after each test method."); } @AfterAll static void done() { System.out.println("@AfterAll - executed after all test methods."); } }
- Assertions → 찐 기능 검증
... @Test @DisplayName("람다 사용") void lambdaExpression() { List<Integer> numbers = Arrays.asList(1, 2, 3); assertTrue(numbers.stream() .mapToInt(Integer::intValue) .sum() > 5, () -> "Sum should be greater than 5"); } ...
- 구현 클래스
... public class Practice { public Integer sumInt(int a, int b) { return a + b; } public Double average(List<Integer> integers) { return integers.stream().mapToInt(Integer::intValue).average().getAsDouble(); } }
- 테스트
... @Test @DisplayName("sum 메소드 성공 테스트") void sumTest() { Integer sumInt = practice.sumInt(1, 2); assertNotNull(sumInt); assertEquals(sumInt, 3); } @Test @DisplayName("average 메소드 성공 테스트") void average() { Double average = practice.average(Arrays.asList(1, 2, 3, 5, 6)); assertNotNull(average); assertEquals(average, 3.4); }
참고 사이트
JVM 구조 복습
...
int main(void){
func1(); // func1() 호출
return 0;
}
void func1(){
func2(); // func2() 호출
}
void func2(){
}
...
프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장.
func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.
func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장.
func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거.
func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.
main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.
→ Stack 자료구조! Last-In, First-Out
psvm
을 실행하며 시작코드로 스레드 확인
... public class Main { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); } }
코드로 스레드 만들 수 있음
- Runnable 인터페이스를 구현하는 방법
- Thread 클래스를 상속받는 방법
두 방법 모두 쓰레드를 통해 작업하고 싶은 내용은 run() 메소드에 작성하면 됨
- Runnable 인터페이스 구현하기
... public class ImplementRunnable implements Runnable{ @Override public void run() { System.out.println("Implement Runnable : " + Thread.currentThread().getName()); try { Thread.sleep(3000); } catch (InterruptedException e) { e.getStackTrace(); } System.out.println("- Implement Runnable End -" ); } }
- Thread 클래스 확장하기
... public class ExtendThread extends Thread{ @Override public void run() { System.out.println("Extend Thread : " + getName()); // 현재 실행 중인 쓰레드의 이름을 반환. try { Thread.sleep(1000); } catch (InterruptedException e) { e.getStackTrace(); } System.out.println("- Extend Thread End -" ); } }
실행코드
... public class Main { public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); Thread implementRunnable = new Thread(new ImplementRunnable()); implementRunnable.start(); ExtendThread extendThread = new ExtendThread(); extendThread.start(); } }
run() 메소드 안에 작업 내용 넣기
호출은 start()
컴퓨터가 동시에 처리할 수 있는 최대 작업 수는 CPU 코어(core) 수와 같다
자바의 스레드 스케줄링은 우선 순위(Priority) 방식과 순환 할당(Round-Robin) 방식 사용.
기본 메커니즘은 Queue 구조를 가짐Queue : 선입선출(순서대로~~)
- 우선 순위 방식 : 우선 순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링
- 1~10까지 값을 가질 수 있으며, 기본은 5
- 순환 할당 방식
- 시간 할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행
- a, b, c 순선데, a가 끝나고 b가 너무 큰 작업이면 하다가 뒤로 줄 세움
스레드의 일반적인 상태
스레드의 일시정지 상태
상태제어
- 실행 중인 스레드의 상태 변경
- 상태 변화를 가져오는 메소드 종류
자바 코드로 스레드 컨트롤 하기
멀티스레드는 동기화 문제 때문에 중요! => 면접에서도 많이 나옴