새소식

Spring & Java/Java

2. Java (TDD, GCC)

  • -

🏴‍☠️ TDD

  • Tip
    1. 실패하는 테스트를 만들어라 → 빨간색
    2. 꼼수를 써서 테스트를 통과하게 만들어라 → 그린
    3. 리팩토링을 하라 → 블루
    👉🏻Tip 2 ❗
    1. ctrl + 함수 클릭
    2. 수정할 곳 드래그 후 alt + shift + r 누르고 이름 변경하면 한번에 모두 변경됨.

 

 

< Refactoring >

  • 리팩터링은 동작을 변경하지 않으면서도 보다 간편하게 유지 관리하고 파악하며 확장할 수 있도록 코드를 수정하는 프로세스리팩토링의 목적은 소프트웨어를 보다 이해하기 쉽고, 수정하기 쉽도록 만드는 것이다.

 

👉🏻왜 리팩토링을 해야 하는가?

  • 코드의 구조가 망가지는 효과는 누적된다.
  • 코드의 디자인을 유지하도록 도와준다.
  • 중복을 제거함으로써 각각의 작업에 대한 코드가 오직 한 곳에만 있게 할 수 있다.
  • 소프트웨어의 디자인을 개선시킨다.
  • 소프트웨어를 더 이해하기 쉽게 만든다.
  • 버그를 찾도록 도와준다.
  • 프로그램을 빨리 작성하도록 도와준다.

👉🏻언제 리팩토링을 해야 하는가?

  • 삼진 규칙(3번의 중복 / 3번의 같은 행위를 한다면 리팩토링을 진행하자.)
  • 기능을 추가할 때 리팩토링을 하자.
  • 버그를 수정해야 할 때 리팩토링을 하라.
  • 코드 검토(Code Review)를 할 때 리팩토링을 하라.

 

🧐GC(Garbage collector)

-> Garbage Collection의 약자로 개발자가 메모리를 직접 해제해주는 작업 없이 동적으로 할당된 불필요한 메모리를 자동으로 해제해주는 메모리 관리 기법, 필요한 이유 프로그래머가 동적으로 할당된 메모리 영역의 전체를 완벽하게 관리할 필요가 없어져 불필요한 작업이나 메모리 누수를 방지할 수 있다.

 

< GC의 대상이 되는 Heap 영역 >

 힙(Heap) 영역은 다음과 같이 Young generation, Old generation 두 가지로 나뉘고, Young generation에서 일어나는 GC를 Minor GC, Old generation는 Major GC라 한다. Young generation는 새로운 객체들이 할당되는 영역, Old generation은 Young generation에서 오랫동안 살아남은 객체들이 존재하는 영역이다.

 

 Young generation은 다시 Eden, Survival0, Survival1 3가지 영역으로 나뉘는데 새로운 객체들은 Eden 영역에 할당되며 Eden 영역이 꽉 차게 되면 Minor GC 가 실행된다. 

 

 이 때 살아남은 객체들은 Survival0 영역으로 들어오게 되고 다음 Minor GC 가 또 실행되면 Survival1 영역으로 이동하게 된다.

 

 한번 GC가 실행될 때마다 살아남은 각 객체들 고유의 age 값이 증가하게 되고 age의 값이 특정 임계치를 넘어가기 전까지 GC가 실행될 때마다 Survival0과 Survival1을 반복하며 이동한다. 

 

 age 값이 임계치를 넘어가게 되면 해당 객체는 오랫동안 쓰일 객체라고 판단하고 Old generation 영역으로 이동하게 된다. 이러한 과정을 반복하여 Old generation의 영역이 가득 차게 되면 이 때 Major GC가 실행된다.

 

 이러한 과정을 반복하여 Old generation의 영역이 가득 차게 되면 이때 Major GC가 실행된다.

========================================================================================

< GC 동작 방식 >

Stop The Word

 GC를 수행하기 위해 GC를 제외한 모든 스레드는 중지된다.

 

Mark and Sweep

 스레드가 중지된 이후 특정 시점에 GC Roots로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾고 그 객체가 또 어떤 객체를 참고하는지 찾아서 마킹하는 과정을 Mark라 한다. 즉 Reachable 객체를 식별하는 과정을 뜻한다. Sweep은 이러한 과정에서 걸러진 Unreachable 객체의 메모리를 해제하는 것을 말한다.

 

 이때 GC Roots는 stack 영역의 데이터, method 영역의 static 데이터, JNI(네이티브 메서드 인터페이스)에 의해 생성된 객체들을 예시로 들 수 있다.

< GC의 단점 >

  1. 가비지 컬렉션이 일어나는 시점이나 점유 시간을 예측하기 힘들다.
  2. 일시적으로 GC를 제외한 다른 스레드들의 동작을 멈추기 때문에 오버헤드를 일으킬 수 있다.

'Spring & Java > Java' 카테고리의 다른 글

1. 핵심원리 기본편  (0) 2022.08.02
3. 개념  (0) 2022.07.18
3. 스프링 웹 개발 기초  (0) 2022.07.14
1. 객체지향 Java  (0) 2022.07.14
4. Java  (0) 2022.07.13
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.