TIL 12/2

드립이 블로그·2022년 12월 2일
0

TIL

목록 보기
23/80

테스트 코드

테스트 코드는 기능을 확인 하기 위해 반복해서 프로그램 실행 하는 것을 방지한다.

테스트 코드를 사용시 장점으로는,
개발 과정 중 문제를 조기 발견 가능하다.
작성 코드가 의도 대로 작동하는지 확인 가능하다.
코드 변경, 추가, 삭제 시 사이드 이펙트를 줄일 수 있다.
등이 존재한다.

윈도우에서는 Ctrl + Shift + T 단축키로 테스트 클래스를 생성하여 테스트를 해볼 수 있다.

Annotation

주석이다.
//와 같은 단순한 주석이 아니라, 특별한 기능을 수행하게 된다.
@를 앞에 붙여 사용한다.

@Test 테스트 메소드이다. 실행 가능하다.
@BeforEach 각 메소드 전에 실행되는 것을 알린다.
@BeforeAll 현재 클래스의 모든 메소드보다 먼저 실행되어야 하는 메소드를 표시한다.
@AfterAll 현재 클래스의 모든 메소드보다 나중에 실행되어야 하는 메소드를 표시한다.
@RepeatedTest 메소드 반복 호출을 표시한다.
@DisplayName 사용자 지정 표시 이름을 선언한다.

테스트 코드 작성시 주의 사항.

간단하게 만드는 것이 좋다.
복잡해짐에 따라 코드가 꼬일 수 있다.

엣지 케이스를 테스트 하는 것이 좋다.
자주 발생하지 않는 항목들을 테스트한다.
잘못 입력하는 등의 예외 처리가 필요한 부분을 테스트 해야한다.

한번에 하나의 요구사항을 테스트한다.
이름 선택이 용이해지고, 읽기 쉬워지며 유지관리가 쉬워진다.

CI / CD

CI

Continuous Integration 지속적 통합
빌드 / 테스트의 자동화 과정이다.
여러명이 하나의 코드에 대해 수정을 진행해도 통합 관리가 가능하다.

CD

Continuous Deployment 지속적 배포
CI를 거친 코드는 바로 배포 할 수 있다.
CD는 소프트웨어가 항상 신뢰 가능한 수준에서 배포가 가능하도록 관리하는 개념이다.
CI는 새로운 소스코드의 빌드, 테스트 병합이 성공적으로 진행 되었을 때, github와 같은 저장소에 업로드 하는 것을 의미한다.
CD는 이 내역을 사용자가 사용할 수 있는 배포 환경까지 릴리즈 하는 것이다.

TDD

Test Driven Development
테스트 주도 개발
작은 단위로 테스트 케이스를 작성한다.
테스트 통과시 코드를 추가하는 단계를 반복시킨다.

TDD 개발 주기

Write Failing Test
실패하는 테스트 코드를 먼저 작성한다.

Make Test Pass
테스트 코드를 성공 시키기 위해 실제 코드를 작성한다.

Refactor
중복 코드를 제거하고 Refactoring 한다.
ㄴ Refactoring
코드의 결과가 변하지 않는 선에서 코드의 구조를 변경하고, 재 조정하여 가독성을 높이고, 유지 보수가 편하게 한다.

일반적인 방식과의 차이점

테스트 코드를 작성한 뒤 실제 코드를 작성하는 것이다.
반복적인 단계를 거칠 수록 코드의 버그가 줄어든다.

장점

객체지향적 코드 생산의 용이
재설계 시간 단축
디버깅 시간 단축
추가 구현 용이
등의 장점이 존재한다.

단점

생산성 저하
이 단점 하나 때문에 납기일을 준수해야 하는 경우 사용하지 않는 등 사용하지 않을 때에 비해 심하면 30퍼센트 정도 까지도 시간이 벌어진다.

JUnit

TDD 도구
외부 테스트 프로그램을 작성해 Syste.out으로 디버깅 하지 않아도 된다.
하나의 jar파일로 되어있다.

Thread

프로그램 내의 실행되는 프로그램의 실행 단위이다.
여러 개의 스레드가 존재 가능하다. 이를 멀티 스레드 라고 한다.

자바에서 스레드 생성 방법
Runnable 인터페이스를 구현한다.
Thread 클래스를 상속한다.

class Runnable implement Runnable{}
class Thread extends Thread{}

와 같은 방식으로 구현한다.
Thread 클래스를 상속 받을 시 다른 클래스를 상속받을 수 없기 때문에 보통 Runnable 인터페이스를 사용한다.

call stack

프로그램이 함수 호출을 추적할 때 사용한다.
스택 구조를 가진 메모리 영역이다.
매개변수의 정보, 반환 주소의 정보, 지역변수의 정보가 담긴다.

Thread Scheduling

스레드가 코어의 수보다 많을 경우 스레드의 순서를 결정해 주는 것이다.
이로 인해 여러 스레드는 번갈아 가며 스레드의 run() 메소드를 실행한다.

방식

선점형
우선순위가 높은 스레드를 먼저 수행시키는 방식이다.
협력형
실행중인 스레드가 CPU 사용권을 다른 스레드에 넘길 때까지 기다리는 방식이다.

JVM은 선점형을 사용한다.

스레드의 우선순위

1~10까지 부여된다. 1이 가장 낮고 10이 가장 높다.
우선순위가 높은 스레드의 실행이 우선시 된다.
우선순위의 기본값은 5이다.
우선순위가 동일할 경우 cpu의 할당시간을 나눈다.

스레드의 상태

sleep()
주어진 시간동안 일시정지 상태로 만든다.
() 안에 밀리초를 기입하면 그 시간동안 일시정지 상태가 된다.

yield()
실행중에 우선순위가 높거나 같은 스레드에 실행을 양보하고 실행 대기 상태가 된다.

join()
메소드를 호출한 스레드가 일시정지 상태가 되고, 실행 대기상태가 되려면 join() 메소드를 멤버로 가지는 스레드가 종료되거나 매가값으로 주어진 시간이 지나야 한다.

종료는 두가지가 존재한다.
stop
스레드를 즉시 종료 시킨다.
interrupt
일시 정지 상태의 스레드에서 interruptedException 예외를 발생시켜, 예외 처리 코드에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.

동시성과 병렬성

동시성

싱글 코어에서 멀티 스레드를 사용한다.
여러 작업이 동시에 진행되는 것 처럼 보이게 빠른 시간에 하나씩 많은 것을 처리한다.

병렬성

멀티 코어에서 멀티 스레드를 사용한다.
여러 작업이 실제로 동시에 진행 되는 것이다.
한번에 많은 것을 처리한다.


요즘들어 드는 생각이 있다.
외워야 할 것이 너무나도 많다.
이 전 것도 아직 다 못외웠는데, 외워야 할 것들이 산더미 처럼 쏟아져 들어오는 느낌이다.
저걸 다 외울수나 있을까? 싶은 생각이 들면서도 오기로 라도 외워야지 하는 생각이 같이 든다.

오늘 문제를 풀었는데, 역시 잘 안되었다.
문제 풀 때마다 드는 생각이 있다.
이 문제 조금만 더 하면 풀 수 있을 것 같은데 하는 생각이 들면서도, 막상 풀어보면 잘 안된다.
언젠간 풀 수 있겠지 하는 희망을 가져본다.

0개의 댓글