Easy Understanding

[생각 정리] 공부해보니 개발 언어들은 결국 크게 다르지 않았다. 본문

Dev

[생각 정리] 공부해보니 개발 언어들은 결국 크게 다르지 않았다.

appleg1226 2021. 1. 12. 17:48

최근에 개발 취업을 준비하던 중,

새로운 프로젝트를 진행하기에는 조금 의욕도 생기지 않고 해서,

아예 새로운 언어를 공부해보자는 생각으로 NodeJS와 NestJS를 한 번 공부해보자는 결심을 하게 되었습니다.

 

NestJS를 이용해서 간단한 API를 만들고, 관련 지식들을 찾아보고 공부했는데

그 과정에서 느끼게 된 점들이 있어서 그것을 정리하려고 합니다.


저는 예전에는 언어들의 특성이 다르고, 새로운 것을 배우는 데에는 리스크가 크다고 생각했습니다.

 

개발을 입문할 때는 그런 생각을 많이 합니다. 그리고 그런 질문이 많습니다.

 

'요새는 NodeJS가 핫하다더라.'

'아니다 Python이 핫하다.'

'우리나라는 Java 공화국이다. 취업을 하려면 Java를 공부하는 것이 맞다.'

 

그 때는 이런 글들을 정말 많이 찾아봤던 것 같습니다.

언어 하나를 잘못 고르면 왠지 나의 앞길이 크게 달라질 것만 같았습니다.

 

그러나 요새 들어서 그렇지만은 아닌 것 같다는 생각이 듭니다.

 


반 년 넘게 자바로만 개발을 하다가 코틀린을 접하게 되었습니다.

 

코틀린은 애초에 JVM 위에서 동작하는 완전히 호환되는 언어기 때문에, 자바에서 공부를 통해 넘어가기가 쉬웠습니다.

코틀린으로는 자바로 작성하던 Spring 어플리케이션을 그대로 만들어보기로 했습니다.

 

일단은 코틀린 책을 한 권을 다 읽었습니다. 기초 지식은 중요하니까...

대부분의 책들은 재미있게도 자바 개발자들을 대상으로 하는 설명들이 많았습니다.

'이러이러한 것은 자바에 없지만, 코틀린에는 있다.'

'이러이러한 것은 자바에 있지만, 코틀린에는 없다.'

 

의외로 코틀린의 도입 과정은 길지 않았는데, 그 이유에는 같은 프레임워크를 썼다는 데에 있다고 생각합니다.

 

스프링 구조 그대로 코드를 개발하다보니 문법적으로 어떠한 것이 필요한 지 검색하는 것은 쉬웠습니다.

언어적 특성 때문에 Lombok을 적용하지는 못했지만, 그에 따른 Data Class 등의 정보는 금방 찾을 수 있었고,

적용도 쉽게 할 수 있었습니다.

 

코틀린의 문법이 물론 자바와 다르게 여러 특징이 있고, 그 언어적 특성을 이해하려면 더욱 공부를 해야했지만, 

실질적으로 써야하는 기능들에 있어서 코틀린의 기능은 생각보다 익히기가 어렵지가 않았습니다.

 


저는 아무래도 그 이유를 다음과 같이 생각합니다.

'하나의 언어를 원리까지 이해하고 익숙해지면 다른 언어를 이해하는 데에도 도움이 된다.'

 

자바를 이용해서 웹서비스를 만들면서 생긴 인사이트가 많이 있습니다.

- 자바의 멀티스레드

- JVM과 메모리 관리

- 람다와 함수형 프로그래밍

- 모듈, 패키지 관리

- 로깅

- 테스팅

- http 통신

- 직렬화

- 리플렉션과 어노테이션

- 웹 프레임워크(spring)와 각종 모듈(인증, ORM 등)

 

자바를 사용하면서 많은 라이브러리들을 사용하고, 많은 패턴들을 사용하곤 했습니다.

 

많은 라이브러리들을 사용해보고 프레임워크에서 제공하는 다양한 모듈들을 사용하면서

'개발을 하는 데에 있어서 어떤 것이 필요한가' 에 대한 인사이트들이 생기게 된 것 같습니다.

 

그러다보니 코틀린을 공부할 때도 생각보다 어렵지 않게 도입할 수 있게 된 것 같습니다.

 

솔직히 반복문이나 조건문, 데이터 타입 등 기초적인 문법은 하루면 금방 배울 수 있는 쉬운 문법입니다.

그리고 다르면 얼마나 다를까, 새로운 것을 배운다기 보다는 습관적으로 교체해야할 것들이 대부분이었습니다.

 

예를 들어 자바와 코틀린에서 특정 입력을 받아서 반환하는 아래의 메서드는 다음과 같습니다. 

// java
public String getSampleString(String input){
    return "sample string: " + input;
}

// kotlin
fun getSampleString(input: String): String{
    return "sample string: " + input
}

 

코틀린은 굉장히 빠르게 프로젝트에 도입할 수 있었습니다.

만약에 잘 모르는 것이 생기더라도 금방 책을 찾아보면 그만이었습니다.

 

물론 코틀린을 공부하면서 처음 보는 코루틴 같은 생소한 개념도 몇 가지 있었지만,

그런 것은 시간을 들여서 공부를 하면 충분히 따라갈만한 정도였습니다.

(본 블로그에 정리해 보기도 했습니다)


그리고 예전에 공부를 하다가 자바랑 너무 달라서 포기했던 NodeJS를 다시 한 번 건드려보기로 했습니다.

 

저는 Node JS를 한 번 공부를 했지만 자바스크립트는 자바와는 너무 다른 언어라서 공부를 조금 하고 접었던 기억이 있습니다.

아마도 npm 설치하고, 예제를 따라하면서 공부를 했었지만, 

함수를 변수에 대입하는 것도 그렇고, Javascript의 문법이 버전별로 다른 Reference들이 많아서 포기했었습니다.

 

과연 이번에는 어떨까하고 공부를 시작했습니다.

이번에도 어차피 공부하는 김에, 웹 프레임워크 하나를 중점적으로 잡고 그것을 중심으로 공부해보고자 했습니다.

 

그리고 결국은 조금 알아보다가 TypeScript를 기반으로 하는 NestJS를 공부해보기로 했습니다.

NestJS는 조금 더 구조화된 웹 서비스를 만들 수 있게 해주는 장점이 있다고 해서 한 번 강의를 들어 봤습니다.

 


그런데 어디서 본 패턴과 문법들이 발견되어 좀 놀랐습니다.

- TypeScript

타입스크립트는 자바스크립트의 동적인 언어라는 단점을 해결하고자 나온 언어라고 합니다.

기존에 사용하던 언어인 자바는 이미 타입을 지정하여 개발을 하기 때문에 이런 것은 익숙했죠.

코틀린도 타입을 지정을 해줘야 했기 때문에, 타입에 대한 개념은 익숙한 개념이었습니다.

 

게다가 문법이 너무나도 코틀린의 함수 선언과 비슷해서 이것도 너무 금방 익혔습니다.

솔직히 언어별로 함수 선언이 다르면 얼마나 다를까하는 생각이 이젠 들기도 합니다.

// kotlin
fun getSampleString(input: String): String{
    return "sample string: " + input
}

// typescript
function getSampleString(input: string): string{
    return "sample string: " + input;
}

 

타입스크립트는 이미 타입 체크 언어를 사용하던 저에게는 그렇게 어려운 벽은 아니었습니다.

- NestJS

NestJS에 대해서 예제 파일 몇 개를 확인하니 정말 이렇게 날로 먹을 수가 있나 싶은 생각이 들었습니다.

간단하게 말하자면, 그냥 스프링이었습니다.

 

Controller, Service, Injectable 이라는 익숙한 단어들,

그리고 어딘가 익숙한 어노테이션을 이용한 DI 까지...

 

애초에 NestJS는 스프링과 비슷한 철학으로 나온 개발 프레임워크라고 공식문서에서 밝히고 있었습니다.

Node JS의 다른 백엔드 시스템에는 없는 '아키텍처'의 측면을 염두하여 개발했다고 합니다.

 

Spring의 MVC 패턴과 정형화된 개발 구조는 누군가에겐 틀에 박히고 생산성에 있어서 많은 코드가 필요하겠지만,

누군가에겐 별다른 고민 없이 빠르게 어플리케이션 아키텍처를 구성할 수 있어서 편리할 수 있습니다.

 

그러한 Spring의 특징을 저는 좋아했는데, 비슷한 구조를 가진 프레임워크를 만나니 반갑기도 하고 그랬습니다.

 


그리고 이번엔 자바에서 웹 서비스를 개발할 때 사용했던 구성 요소들을 확인하기 시작했습니다.

1. DB / ORM

보통 TypeORM이라는 것과 Sequelize 두 가지로 ORM이 나뉘는 것 같습니다.

대략적인 방법은 JPA Hibernate와 크게 다르지 않아 쉽게 적용할 수 있었습니다.

2. 비동기 처리

NodeJS의 비동기 처리는 '싱글스레드'와 '이벤트루프' 라는 두 가지 용어로 요약이 가능한 것 같습니다.

자바 같은 언어와는 다르게 스레드를 생성하지 않고 다른 방식으로 동시성을 처리하는데요, 

그 방법이 바로 이벤트루프를 이용하는 방법이라고 합니다.

 

그러나 이미 Webflux에서 Netty와 이벤트루프를 이용하여 적은 스레드로 요청을 처리하는 것을 보았고,

코틀린의 Coroutine에서 비동기 코드를 동기처럼 구성하는 방법을 공부했기 때문에,

생각보다 비동기 문법들이 어렵지가 않았습니다.

 

정말 신기했습니다. 이미 여러 가지 비동기 방식을 공부하고 이해하고 나니, 

다른 언어에서 지원하는 문법이나 방식이 글 몇 개만 읽으니 대략적으로 정리가 되었습니다.

3. Logging

로깅은 Nest에서 자체적으로 제공해주는 모듈을 이용했습니다.

4. Testing

Java의 Junit처럼 Javascript에는 Jest라는 테스팅 프레임워크가 있었습니다.

이것도 NestJS 차원에서 지원이 되기에 어렵지 않게 테스팅을 작성할 수가 있었습니다.

5. 각종 미들웨어들을 위한 라이브러리들 & 배포

솔직히 여기까지는 나가지 않고 글로만 공부를 했습니다.

이미 nodeJS 환경에는 각종 미들웨어들을 연결하고 운영할 수 있는 라이브러리들이 존재함을 확인했습니다.

나중에 사용할 일이 있다면 해당 레퍼런스들을 참고해서 공부하기만 하면 되는 일이라고 생각하고 넘겼습니다.

 


결론적으로 NestJs에 대한 것뿐 아니라, 개발 언어 자체에 대해서 몇 가지 생각이 들었습니다.

1. 결국 어떤 언어들을 사용하든지 무엇을 해야하는지는 크게 다르지 않다.

자바를 사용하든, 자바스크립트를 사용하든, 코틀린, 파이썬이든 필요한 것은 항상 비슷합니다.

http 관련 라이브러리, 데이터베이스 연결, 보안 관리, 로깅, 테스팅 등

 

어떤 언어를 사용하든 이전 시스템에서 사용하던 시스템이

다른 언어에서 어떻게 쓰이고 있는가를 알아보고 도입해야한다는 것은 똑같다고 생각합니다.

 

아키텍쳐에서도 마찬가지입니다.

 

자바와 Spring에서 사용하는 객체의 주입이나, 어노테이션을 이용한 프로그래밍 등은 자바의 것만이 아닙니다.

 

어떤 언어에서든 그 구조는 동일하게 사용할 수 있는 건데,

저는 왜 이런 것을 생각해보지 않았을까요.

 

어떤 언어를 사용하든 디자인패턴은 동일하게 적용할 수 있고, 

코드를 구성하는 방식은 결국은 다 비슷한 과정이 아닐까라는 생각을 이번 기회에 또 하게 되었습니다.

 

2. 하나에 갇히지 않고, 넓게 공부하다보면 인사이트는 계속 쌓인다.

저는 자바를 중심으로 웹 공부를 해 왔기 때문에 자바의 문법에 완전히 익숙해져 있었습니다.

그에 따라서 다른 언어의 문법들을 근거없이 어렵다, 복잡하다고 판단을 하고는 했었습니다.

 

그렇지만 코틀린을 만나고 유연한 언어를 경험하면서, 조금씩 코딩이 유연해지기 시작했습니다.

그리고나서 그 지식으로 NodeJS를 다시 보니, 예전엔 분명히 이해가 되지 않았던 것들이 이해됐습니다.

 

아마 다시 Python을 이용해서 웹 서비스를 만든다면 또 다른 인사이트를 가지고 볼 수 있지 않을까요?

 

비동기도 마찬가지입니다.  

 

Webflux의 Event loop와 Reactive Streams API, Kotlin의 Coroutine을 공부하고 나니

NodeJS의 싱글스레드와 비동기 처리 지식이 쉽게 이해가 되었습니다.

 

언어들끼리 각자의 특성이 있지만, 결국 다들 비슷비슷한 것이 아닐까요.

 

3. 그렇지만 새로운 것을 공부하는 것은 항상 시작이 어렵다.

솔직히 NestJS에서 제공하는 아키텍처를 Spring으로 이미 쉽게 만들 수가 있는데 굳이 공부할 필요가 있을까?

라는 생각이 들기도 했습니다.

 

새로운 공부를 시작하는 것은 쉬운 과정이 아니더군요.

 

ORM만 해도, TypeORM을 간단하게 적용하기는 쉽지만 세부적인 설정을 공식 문서를 통해서 배우는 시간은 결코 적지 않습니다.

 

Security나 각종 기능들을 구현하기에는 원리를 이해했다고 하더라도,

코드 작성 방식이라든지 세부적인 구현 방식을 따라하고 그에 맞춰 가는 데에는 시간이 걸립니다.

 

그것을 알기에 부담이 되었던 것 같습니다.

 

하지만 훗날 해당 기술을 사용해야할 때,

어떤 방식으로 공부해야하는지를 알고 어떤 것을 찾아야할지 알고 있다면 그 과정은 굉장히 짧지 않을까 생각합니다.

 

그래서 전 NestJS를 간단하게만 공부하고 마무리하기로 했습니다.  

 


지금까지 정말 많은 언어들을 접했습니다.

C, C++, Java, Python, Matlab, Kotlin, Javascript, Go 등의 언어들을 공부해보기는 했지만,

막상 제대로 언어를 이해할 수 있는 시점은 이제서야 온 것 같습니다.

 

이전에는 문법을 수동적으로 배우고, 아 이 언어는 이런 특성이 있구나라고 받아먹기만 한 정도에서

이제는 '아, 이 언어는 이런 점을 주의해서 공부해야하는구나'라는 정도까지는 왔다고 생각합니다.'

 

여전히 새로운 언어들이 나타나고 개발 기술 주류는 언제든 바뀔 수 있기 때문에,

앞으로도 새로운 언어들에 대해서 공부해보고,

작게나마 프로젝트들을 만들어보는 노력은 계속 해봐야 할 것 같습니다.