어노테이션이란 코드를 실행하기 위해 필요한 메타 정보를 제공하는 기술입니다.
어노테이션 자체는 아무런 기능도 하지 않습니다. 컴파일 시점에 컴파일러가 메타 정보를 참고하여 필요한 작업을 처리한다던가, 런타임에 리플렉션을 거쳐 처리될 수 있습니다. 어노테이션 프로세서가 어노테이션 메타 정보를 참고해 작업을 수행합니다.
어노테이션을 사용하면 장점은 비즈니스 로직에 상관 없는 코드를 제거할 수 있고 코드를 문서화할 수도 있습니다. 대표적으로 롬복 라이브러리가 있습니다.
그러나 어노테이션만으로 내부적으로 어떻게 처리가 되는지 알 수 없어 의도대로 사용하지 않았을 경우 버그가 발생할 수 있습니다.
보일러플레이트 코드 제거하는 원리는 어노테이션 프로세서가 어노테이션이 달린 요소를 발견하면
바이트코드 주입을 하는데, 이것은 자바 어셈블리 라이브러리를 통해 수행됩니다.
프로세스란 파일에 있던 프로그램이 운영체제에게 자원을 할당받아 메모리에 적재됨으로써 작동중인 프로그램을 뜻합니다.
프로세스는 최소 하나의 스레드를 갖는데요, 스레드는 하나의 프로그램에서 독립적으로 실행되는 단위를 말합니다.
하드웨어 측면에서 스레드는 하나의 CPU코어가 동시에 처리하는 명령어 단위를 의미합니다.
스레드와 CPU 코어의 상관관계는 CPU 코어가 많을수록 동시에 처리할 수 있는 스레드 수도 높아집니다.
CPU 코어는 CPU 를 이루는 물리적 장치를 말하는데 이 장치가 여러개 있는 것을 뜻합니다. 그러므로 동시에 4개의 CPU가 여러 스레드를 처리할 수 있다는 의미이기도 합니다.
스레드가 많이 생성되면 컨텍스트 스위칭 오버헤드가 발생하여 오히려 성능 저하가 발생합니다.
컨텍스트 스위칭이란 문맥교환이라고 하는데요, CPU는 한 번에 하나의 작업만 처리할 수 있어 만일 다른 스레드의 작업을 처리하려면 현재 진행하고 있던 작업 정보를 TCB 라고 하는 영역에 백업해둡니다.
백업하는 정보는 현재 명령어의 위치, 스택의 포인터, 레지스터 값 등을 저장합니다.
작업이 끝나면 다시 TCB에 있던 정보를 로딩해와서 나머지 작업을 처리합니다.
컨텍스트 스위칭이 발생하려면 운영체제 모드가 커널로 넘어갔다 다시 유저 모드로 복귀되고
TCB 정보를 메모리에 I/O 하는 오버헤드가 발생하기 떄문에 스레드가 많다는 것은 이 작업들이 더 빈번하게 발생함을 말합니다.
컨텍스트 스위칭이라는 오버헤드 발생에도 불구하고 Thread 를 많이 생성하는 이유는 현대의 컴퓨터는 멀티 코어로 이루어져있어 동시에 여러 스레드를 처리할 수 있습니다.
또한 하나의 코어 내에서도 하나의 스레드가 입출력 장치 결과를 대기하는 동안 CPU는 다른 스레드를 처리할 수 있습니다. 이렇게 CPU가 쉴새없이 여러 스레드를 처리할 수 있도록 운영체제가 시분할 기법을 통해 스레드 스케줄링을 해줍니다.
그러므로 문맥교환으로 인한 성능 저하가 발생하지 않을 정도로 적절하게 스레드 수를 늘리면 유리합니다.