IntelliJ IDEA
IntelliJ IDEA – the Leading Java and Kotlin IDE, by JetBrains
IntelliJ IDEA의 코드 작성 준비 시간 단축
IntelliJ IDEA의 강력함과 다양한 기능에는 종종 리소스가 많이 필요합니다. 작업 중인 프로젝트에 따라 IDE가 느려져서 짜증을 유발할 수도 있습니다.
개발자가 대기해야 하는 가장 일반적인 경우는 프로젝트를 열 때입니다. IntelliJ IDEA는 프로젝트를 열고 동기화하고, 색인화와 더불어 다른 수많은 세부 작업을 실행해야 유용한 여러 기능을 활성화할 수 있습니다.
이 글에서는 새로운 IntelliJ IDEA 버전에서 가동 순간부터 코드 작성 준비까지 걸리는 시간을 줄이고 IDE의 반응 속도를 높여 성능을 개선하기 위해 어떠한 조치를 취했는지 살펴보겠습니다.
IntelliJ IDEA 팀의 임무: 코드 작성 준비에 걸리는 시간 개선
2023.2 이전의 IntelliJ IDEA 버전을 살펴보면 IDE가 색인화를 시작하려면 프로젝트의 Maven이나 Gradle 프로젝트 모델이 완전히 동기화될 때까지 기다려야 했습니다. 그리고 색인이 완료될 때까지 기다리는 동안에는 코드 강조 표시나 탐색과 같이 IDE의 스마트한 기능이 모두 비활성화되어, 색인이 완료된 후에야 기능을 사용할 수 있었습니다.
아래는 이와 관련된 구성 요소의 도식입니다.
프로젝트를 동기화하고 색인화하는 데 걸리는 시간은 프로젝트가 클수록 길었습니다. 큰 프로젝트의 경우 IDE가 처리하기에 더 복잡하기 때문에 작업을 시작하기 전에 수분씩 기다려야 했고, 이는 느릴 거라고 예상했어도 답답한 일이었습니다.
안타깝게도 프로젝트를 로드하는 동안 수행되어야 하는 절차가 너무 많아 작은 프로젝트에서도 꽤 많은 시간이 소요될 수 있었고 이로 인해 IntelliJ IDEA는 느리다는 인식이 생겼습니다.
곧 시작해야 하는 업무를 생각하고 있을 때 기다리는 것을 좋아할 사람은 없습니다. 그래서 저희는 이 상황을 개선하는 작업을 최우선 과제로 삼았습니다.
작업 성과를 측정하기 위해 애플리케이션이 시작되거나 프로젝트가 열리는 순간부터 사용자가 IDE에서 편안하게 코드를 작성할 수 있게 될 때까지의 시간인 코드 작성 준비 시간을 추적했습니다. 저희의 목표는 코드 작성 준비에 걸리는 시간을 최대한 줄이는 것이었습니다.
프로젝트를 여는 흐름과 경험 개선
IntelliJ IDEA 가동 및 프로젝트 열기 속도를 높이는 것은 여러 구성 요소와 이러한 요소의 상호 연결에 의존하기 때문에 복잡한 문제입니다. 그러나 이러한 복잡성 덕분에 문제를 다양한 각도에서 바라볼 수 있기 때문에 장점도 있습니다. 기술적으로 개선하기 위한 장기적인 노력이 결실을 맺을 때까지 기다리는 동안 IntelliJ IDEA의 색인화 방식을 조정하여 이미 체감할 수 있을 정도로 코드 작성 준비 시간을 크게 줄였습니다.
기술 개선 사항
코드 작성 준비 시간을 줄이는 가장 명확한 방법은 코드와 아키텍처를 최적화하고, 더 나은 하드웨어나 병렬화를 사용하는 등의 기술적 업데이트를 수행하여 IDE의 성능을 개선하는 것입니다. IntelliJ IDEA는 20년이 넘었으며 제품 초기에 아키텍처나 알고리즘과 관련하여 내린 결정이 아직도 일부 존재하고 있습니다.
작업은 바로 그러한 부분에서 이루어지고 있습니다. 성능 병목 지점을 모니터링하고, 조사하고 최적화하는 데 많은 노력을 기울였으며, 이를 통해 이미 눈에 띄는 결과를 낼 수 있었습니다. 애플리케이션의 시작될 때의 애플리케이션 성능 지표(Apdex)가 0.94로 카테고리 상위권까지 개선되었고, 멀티스레드 색인화 속도는 25% 향상되었으며, 병렬 색인화 중에 불필요한 걸림돌도 제거하여 이러한 걸림돌로 인해 다른 스레드가 대기해야 하는 시간을 줄였습니다. 하지만 리팩터링은 IDE 내의 하위 시스템에도 영향을 줄 수 있으므로 장기간에 걸쳐 면밀히 평가되어야 하기에 긴 여정이 될 것입니다. 기술적 성능 개선에 관한 자세한 정보는 Yuri Artamonov의 발표 내용을 참조하고 앞으로 더 많은 글을 기대해 주세요.
기술적 부분을 작업하는 동안 사용자가 인식하는 IDE 성능을 해결하기 위해 다른 방식도 취했습니다.
단계별 동기 색인화
빨라진 속도의 체감이 기술적 개선으로만 가능한 것은 아닙니다. 사용자가 더 빠르게 작업을 시작할 수만 있다면, 이를 성능 개선으로 인식할 것입니다. 저희의 연구에 따르면 프로젝트 구조가 표시되고 코드 강조 표시가 올바르게 보일 때 IDE가 준비되었다고 생각하는 사용자가 많았습니다. 그래서 그 지점에 집중적으로 노력을 기울였습니다.
강조 표시와 탐색 기능이 제대로 동작하려면 IDE가 몇 가지의 중요 절차를 수행해야 합니다. 하지만 이러한 단계가 반드시 순차적으로 실행되어야만 하는지 의문이 들었습니다.
2023.3 버전에서 진행된 일부 유망한 실험에서는 동기화와 색인화 프로세스를 여러 단계로 나눠서 비동기식으로 실행하면 사용자가 코드를 더욱 빠르게 불러올 수 있다는 사실이 확인되었습니다.
그래서 첫 번째 단계로 IntelliJ IDEA가 Gradle이나 Maven과 같은 기본 빌드 도구에서 프로젝트 모델을 가져오기 전에 프로젝트 디렉터리에서 파일 색인화를 시작하도록 만들었습니다. 이 방법의 단점은 불필요한 파일이 색인화될 수 있다는 것이었으며, 빌드 도구와 동기화한 다음 재색인화가 필요했습니다. 그럼에도 불구하고 전체적인 코드 작성 준비 시간(동기화와 전체 색인화 포함)은 유의미하게 줄어들었으며, 저희의 여러 테스트에 따르면 대규모 프로젝트에서는 최대 1.5배까지 빨라졌습니다.
하지만 프로젝트 모델이 로드되지 않은 상태에서는 프로젝트에 포함된 요소 간의 관계를 적절히 빌드하고, 올바른 프로젝트 트리를 표시하거나, 강조 표시 혹은 탐색을 제공하는 것이 불가능했습니다.
이 문제를 해결하기 위해 단계별 동기화를 구현했습니다. 즉, IDE가 빌드 도구의 전체 프로젝트 모델을 한 번에 요청하는 것이 아니라 단계별로 가져오도록 만들었습니다. 현재는 두 단계가 있습니다.
1단계: 종속성 해결 건너뛰기
프로젝트 로드 프로세스가 가장 빨리 시작되는 첫 번째 단계에서는 IntelliJ IDEA가 종속성을 해결하거나 인터넷에 연결하지 않습니다. 이 단계에서는 프로젝트 트리를 표시하고, 프로젝트에서 필수적인 요소를 색인화하고 꼭 필요한 스마트 기능을 실행하기에 충분한 정확도를 제공하는 모델이 활용됩니다.
물론 이 단계 후에도 일부 종속성이 누락될 수도 있고, 이로 인해 문제가 발생하거나 올바른 코드가 빨간색으로 표시될 수도 있습니다. IDE는 실제로는 이러한 위양성 오류를 인식하고 있으며, 누락된 종속성으로 인해 발생한 오류를 억제하여 개별 언어 수준에서 이러한 오류를 처리합니다. 또한, 해당 메시지로 이동하려는 시도도 적절히 처리할 수 있습니다. 2024.2 버전 이후 이 오류 억제는 Java에 적용되었으며, 2024.3에서는 지원이 Kotlin까지 확장되었습니다.
첫 단계는 Maven에서 특히 빠른데, 이는 Maven의 정적인 pom.xml 구성 파일이 Maven을 실행하지 않고도 IDE가 분석하고 굉장히 정확한 모델을 빌드하기에 충분한 정보를 제공할 수 있기 때문입니다.
태생적으로 동적이고 스크립트가 매우 유연한 Gradle의 경우 IntelliJ IDEA가 현재 독자적으로 스크립트를 분석할 수가 없어 Gradle 데몬을 실행해야 합니다. 이에 Gradle로부터 sourceSets, 필요한 언어 수준 및 다른 기본적인 정보만 요청하여 이 프로세스의 속도를 높였습니다. 추후에는 선언형 Gradle 이니셔티브를 통해 이 과정이 크게 개선될 수 있습니다.
2단계: 종속성 다운로드 및 해결
2단계에서는 IntelliJ IDEA가 모든 플러그인과 종속성을 다운로드하고, 모든 구성을 적절히 해결하며, 사용할 정확하고 완전한 모델을 제공합니다. 그리고 이 완전한 모델을 기반으로 색인이 업데이트됩니다.
이러한 2단계 접근 방식을 통해, 종속성이 다운로드되고 해결되는 동안 거의 모든 기능이 작동하는 IntelliJ IDEA 버전이 훨씬 빠르게 구동됩니다.
추가적인 개선 사항으로 색인화가 아직 준비가 되지 않은 상태에서도 여러 기능이 동작하도록 만들어 코드 작성 준비 시간을 더욱 줄였습니다. 가장 중요한 기능은 개별 파일의 코드 강조 표시, 부분적인 코드 해결 및 실행 구성입니다. 물론 기본 색인이 준비되면 이러한 작업이 훨씬 더 빨라지지만 일부 색인만 있어도 안정적으로 동작합니다.
결과
전체적인 프로세스는 이제 다음과 같습니다.
이러한 노력이 효과가 있다는 것은 어떻게 알 수 있을까요?
여러 테스트에서 프로젝트에 따라 코드 작성 준비 시간(정확히는 위의 스키마에서 강조 표시가 완전히 활성화되기까지 걸린 시간)이 프로젝트를 처음 열었을 때보다 몇 배 빨라졌습니다.
아래는 프로젝트 트리나 강조 표시가 표시되고 활성화되는 데까지 수십 초 걸리던 프로젝트에서 얼마나 빠르게 이러한 기능에 액세스할 수 있는지 보여주는 예시입니다.
설문조사에 따르면 IntelliJ IDEA 2024.2 사용자의 30% 정도가 코드 작성을 이전보다 더욱 빠르게 시작할 수 있게 되었다고 생각합니다.
다음 단계
프로젝트를 색인화하는 중에 IntelliJ IDEA의 모든 기능을 사용할 수 있는 것은 아니지만, 2단계 동기화 방식은 확실히 초기 가동 성능을 높였고 더욱 빠르게 코드 작성을 시작할 수 있게 만들었습니다. 추가적으로 색인이 없거나 부분적으로만 있어도 사용할 수 있는 여러 액션을 만들었습니다. 그리고 2024.2 버전에서는 10% 정도의 사용자가 실제로 전체 동기화와 색인화 프로세스가 끝나기 전에 코드 작성을 시작하는 것으로 나타났습니다. 그러나 여기서 끝이 아닙니다.
저희의 목표는 특히 Gradle을 포함하여 단계별 동기화 방식을 개선하여 코드 준비 시간을 더욱 개선하는 것입니다. 또한, 종속성이 아직 해결되지 않은 상태에서 프로젝트 작업을 할 때의 UX도 업데이트 중입니다.
업데이트가 진행되는 동안에는 저희가 들인 노력의 결실로 빨라진 코드 작성 준비 속도를 즐겨주세요. 최신 버전의 IntelliJ IDEA를 다운로드하고 의견을 공유해 주세요!
게시물 원문 작성자