독도갈매기의 개발 블로그
[Spring] Spring은 왜 많이 쓰일까? -2- 본문
정적 타입 언어로서의 장점
Spring Framework 외에도 node.js의 Express, Python의 Django, Flask가 있는데 왜 굳이 복잡하게 느껴지는 Spring을 사용해야 할까요? 그리고 왜 Java는 복잡하다고 느껴질까요?
대표적인 이유를 뽑자면 JS는 동적 타입 언어이기 때문입니다.
const arr1 = [1, 2, 3];
const arr2 = ['1', '2', '3', '4'];
const reduceArr = arr => arr.reduce((l, r) => l + r);
reduceArr(arr1); // 6
reduceArr(arr2); // '123'
우리는 숫자를 모두 더 한 값을 return 받기 위한 함수를 생각했지만 위처럼 문자열이 들어갔을 때 문자열끼리 병합하는 경우까지 볼 수 있습니다.
Java는 정적 타이핑을 사용하므로 어느 정도는 커버가 가능합니다.
public int reduceArr(int[] arr) {
int res = 0;
for (int e : arr) {
res += e;
}
return e;
}
final int[] arr1 = new int[4] { 1, 2, 3 };
final String[] arr2 = new String[4] { "1", "2", "3" };
System.out.println(reduceArr(arr1)); // 6
System.out.println(reduceArr(arrr2)); // int 배열을 받는 메서드에 String 배열을 넣어 빨간줄로 에러 명시와 함께 실행이 안됨.
Java는 JS와 달리 변수의 타입, 메서드의 입력과 출력이 어떤 타입을 가져야 하는지를 강제합니다.
그러므로 JS의 사례같은 잘못된 호출을 최대한 막을 수 있습니다.
이런 장점은 다른 사람들과 협업할 때, 혹은 오랜 시간 동안 작업할 때 부각이 된다고 합니다.
10명이서 동시에 작업하는 프로젝트에서, 다른 사람이 작성한 모든 코드를 숙지하며 올바르게 사용할 수 있을까요? 혹은, 반년 전의 내가 작성한 코드를 현재의 내가 100% 기억한다는 보장이 있을까요? 저는 몇달 전의 작성한 코드 또한 기억 하지 못하는 경우가 많습니다. 이런 이유 때문에 규모 있는 서비스 개발에는 정적 타입 언어가 선호됩니다.
그러나, 이는 'Spring을 꼭 써야 하는 장점이다!'라고는 하지 못하는 장점입니다. 왜냐하면, js 또한 TS( TypeScript )라는 언어를 내놓고 동적 타이핑에 대한 약점을 충분히 커버 하고도 남기 때문입니다.
"정적 타입 언어 JS도 지원합니다."
컴파일된 언어로서의 장점
Java, JS, Python이 가진 공통점은 VM ( Virtual Machine : 가상 머신 ) 기반으로 작동하는 점이고, 이 중 Java에게만 있는 가장 큰 차이점은 Java는 컴파일이 된다는 점입니다.
그럼 컴파일 된다는 점이 어떤 점에서 장점으로서 작용할까요? 가장 큰 특징은 JS, Python 같은 인터프리터 언어에 비하여 연산 속도 등의 성능이 월등히 뛰어나기 때문입니다.
그 이유는 인터프리터와 컴파일 언어의 동작 원리 차이점에서 나오는데, 컴파일러는 코드를 미리 기계어로 번역해 컴퓨터에게 명령하는 식으로 진행된다면 인터프리터는 한 줄 한 줄씩 기계어로 번역해 명령하기 때문에 여기에서 성능이 떨어지게 됩니다.
그러나 Java 역시 완전한 컴파일 언어라고 칭하지는 않습니다. 그 이유는 컴파일과 인터프리팅 모두 수행하기에 완전한 컴파일 언어인 C, C++에 준하는 성능은 절대 나오지 않지만, 인터프리터 언어인 JS, Python 보다는 확실한 성능 차이를 볼 수 있습니다.
또 한번 그러나, 이 또한 'Java 성능 차이도 있으니까 역시 Spring이 최고다!'라고 하지 못합니다. 왜냐하면, Python, Node.js 같은 인터프리팅 언어들도 JIT Compile을 지원하기에 실행 전에 컴파일이 수행되게 할 수 있습니다. 결론은 자바와 같은 방식을 사용하여 성능차이에서도 크게 차이나지 않는 수준까지 왔다는 것 입니다.
"이러면 Node로 서버 구성해도 되는건가?"
Spring이 제공하는 걸출한 도구들
위와 같은 1, 2번은 왜 Java를 사용하면서까지 Spring을 사용해야 하는가에 대한 설명이었습니다.
'Spring은 왜 많이 쓰일까? -1-'을 봤다면 알 수 있듯이 Spring Framework는 Java EE를 개선하기 위해 나온 Framework라는 것인데요, 그런 배경이 있는 만큼 기업이 애플리케이션을 만들 때 필요한 도구는 거의 다 갖추고 있다고 봐도 무방하다고 합니다.
Spring Security
- 인증에 관한 라이브러리, 로그인과 회원 가입, 적정 유저의 접근 권한 등을 관리하며, 소셜로그인이라 불리는 OAuth도 지원함.
- Node.js일 경우, passport라고 불리는 서드 파티를 받아 사용해야 함.
→ 서드 파티란? : 해당 분야에 관련된 상품을 출시하거나 다른 기업의 주 기술을 이용한 파생 상품 따위를 생산하는 회사를 가리킨다.
Spring JDBC
- DB 접속에 관한 라이브러리. DB 커넥터를 바꿔가면서 사용할 수 있습니다. 즉, MySql을 쓰다가 Oracle DB로 변경할 일 있더라도, 인터페이스는 변하지 않으므로 코드 변경점이 크지 않음.
- Node.js일 경우, MySql을 사용하고 싶다면 MySql2 라는 서드 파티 패키지를 사용해야 합니다. 물론 DB를 바꾸려 한다면 아예 다른 패키지를 받아야 함.
Spring Actuator
- 해당 웹 서버의 헬스 체크( Health Check ), 모니터링 등을 도와주는 라이브러리.
- Node.js일 경우, PM2라고 불리는 서드 파티 프로세스 관리자를 사용해야 함.
그 외에도 Spring 생태계에서는 필요에 따라 쓸 수 있는 다양한 라이브러리가 있으며, 기업 차원에서 이 라이브러리에 기여하기도 합니다. Spring Cloud Netflix가 대표적 예입니다.
"NPM 수많은 라이브러리들이 있는데 결국 Node.js도 지원하는거 아닌가?"
위처럼 생각할 수 있지만 우리는 기업, 대규모 서비스를 개발한다는 상기할 필요가 있습니다. "단 1초라도, 단 한명이라도 장애를 겪어서는 안 된다."는 입장을 가져야 하는 대규모 서비스에서는 검증 되지 않은 서드 파티 라이브러리, 패키지 등을 사용하는 모험을 감수하는 것보다 이미 검증된 라이브러리를 사용하는 것이 보다 합리적인 선택이 되기 때문입니다.
"그렇게 따지면 페이스북은 PHP를 개량해서 쓰고 있고, 드롭박스는 Python으로 트위치는 루비 온 레일즈(Runy On Rails)로 서버를 구성하고 있는데 이 회사들은 잘못된 건가요?"
위와 같은 논리대로라면 위처럼 세계 손가락안에 들만큼 많은 트래픽을 감당중인 회사는 Spring을 써야 정상이지만 아닌 것 처럼 꼭 사용해야하는 Framework는 아니라는 것이죠 하지만 마지막 장점으로 앞의 장점들이 좀 더 부각 될 것 같네요
개발자 구인의 용이성
어느 트래픽에 어느 언어를 써야만 한다는 정답은 없습니다. 회사 입장에서는 JS 잘하는 개발자 10명이 있고 Java를 잘하는 개발자가 1명 있다고 했을 때 '서버를 Java로 구성하자'라고 하는 회사는 거의 없을 것 입니다. 왜나하면, JS가 능숙한 개발자 10명이 Java에 적응하는데 비용이 더 크기 때문입니다. 이렇듯 실력 있는 개발자만 있다면 어느 프레임워크, 언어, 라이브러리, SQL를 사용해도 매우 잘 돌아갑니다. 하지만, 국내 시장에서 Spring이 많이 보이는 것은 경력자 구하기가 용이하기 때문입니다.
심지어 전자정부프레임워크 역시 Java Spring 기반으로 짜여진 코드이기에 직간접적으로 공공기관과 관련된 일을 해야하는 회사들은 Java를 사용하지 않을 수 없었고 이런 흐름 덕에 국내 IT 시장에서는 Java 개발자 수가 급증하면서 Spring이 많이 쓰이게 된 것입니다.
'Java' 카테고리의 다른 글
[Spring] Spring은 왜 많이 쓰일까? -1- (3) | 2021.10.04 |
---|---|
[Spring] 인터셉터 ( Interceptor ) (0) | 2021.10.01 |
[Spring] IoC ( Inversion of Control : 제어권 역전 ) (0) | 2021.09.30 |
[Spring] DI ( Dependency Injection : 의존성 주입 ) (0) | 2021.09.29 |
[Java] 자바 문자열(String)을 비교하는 방법 (0) | 2020.09.14 |