Node.js 개발자의 코-프링 적응기(1) | 인프런 워밍업 클럽 2기 - 백엔드
인프런 워밍업 클럽 2기
입문자를 위한 Spring Boot with Kotlin(https://inf.run/bXQQQ) 강의를 듣고 작성하였습니다.
소개
📌 Node.js (NestJS)를 주로 사용하는 2년차 백엔드 개발자입니다.
📌 스타트업을 다니던 중 회사가 폐업하여 다시 취업 준비를 하고 있습니다.
📌 스프링을 시작한 이유는 크게 2가지입니다.
1. 프레임워크의 제한을 받지 않는 백엔드 개발자가 되고 싶습니다.
2. 대한민국에서 개발자로 큰 회사로 가려면 Node.js는 약간 한계가 있다고 느꼈습니다.
📌 적당히 게으르고 적당히 노력하는 평범한 사람이지만 최선을 다해 완주하겠습니다.
NestJS 가 약간 스프링의 구조를 따라한?? 느낌이라서 비슷한 부분이 아주 많습니다.. 강의 내용을 전부 요약하기보단 생각에 남았던 부분만 정리했습니다.
웹 프레임워크
웹 프레임워크는 개발을 하면서 공통되고 반복되는 작업들에 대해 좀 더 편리하게 사용할 수 있게 만들어주는 도구입니다.
지금 제가 사용하는 NestJS 같은 경우에도 Node.js 를 이용한 웹 서버 개발을 편하게 만들어주는 웹 프레임워크라고 할 수 있습니다. 마찬가지로 Java나 Kotlin을 이용해 웹 서버를 개발하는 경우 Spring 이나 Spring Boot 라는 프레임 워크를 사용합니다.
Spring
MVC 패턴을 사용합니다.
레이어드 아키텍쳐를 사용합니다.
레이어드 아키텍쳐
소스코드의 역할과 관심사에 따라 계층으로 분리한 아키텍처 입니다.
출처 | https://www.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch01.html
여기서 Persistence layer 를 Data Access layer라고 하기도 합니다.
controller(presentation) -> service(business) -> repository(Persistence/data access)
컨트롤러는 말 그대로 컨트롤러로서의 역할
서비스는 레포지토리로부터 DB에 대한 메서드를 가져와서 사용
리포지토리는 DB를 조작하는 매서드를 정의
NestJS 에서도 일반적으로 이런 계층형 아키텍처를 사용하였고, 컨트롤러에 서비스 로직이 어디까지 보여지는지에 대한 논의를 했던 것이 기억에 납니다.
이런 세세한 컨벤션은 아마 개발자마다 기준이 다를 수 밖에 없는 것 같습니다.
의존성 주입(DI)
https://docs.spring.io/spring-framework/reference/core/beans/introduction.html
https://docs.nestjs.com/fundamentals/custom-providers#di-fundamentals
의존성 주입은 한 객체가 사용하는 다른 객체를 직접 만들지 않고, 외부에서 주입받아 사용하는 방식으로, 제어 역전(IoC)기술 중 하나입니다.
제어 역전(IoC)은 개발자가 컨트롤해야하는 부분을 프레임워크에 위임하여, 개발자가 신경써줄 부분을 줄여주는 기술입니다.
(로 저는 이해하고 있습니다.)
출처 | https://project-eclise.fandom.com/wiki/Spring_Bean_(Alpha)
스프링에서는 Bean
이라는 것을 통해서 프레임워크에 권한을 위임할 대상을 지정합니다.
bean은 Spring IoC 컨테이너에서 관리하는 객체입니다. IoC 컨테이너가 Bean 을 생성할 때 종속성을 주입합니다.
의존성 주입 방식은 생성자, 수정자, 필드 방식 3가지가 있습니다만 생성자만 사용하면 된다는 친구의 말을 들었던 기억이 납니다..(ㅎㅎ..)
NestJS에서는 default(provider), request, transient 이렇게 세가지 스코프로 DI를 지원하는데, 마찬가지로 여기도 provider 방식만 사용했었습니다.
이유는 둘 다 provider 방식이 안전하기 때문이라고 요약할 수 있겠습니다.
JPA
자바 ORM 기술의 표준 인터페이스입니다. ORM은 객체-관계 매핑으로 관계형 데이터베이스를 객체와 매핑해주는 기술을 말합니다.
ORM은 만능인가? 에 대해 생각해보는 아티클
https://yceffort.kr/2021/07/dont-use-nodjs-orm
저수준: 순수JDBC, 중간수준: Querydsl, 고수준 JPA 로 대체해서 생각하면 됩니다
영속성 컨텍스트
개인적인 이해에 도움이 되었지만 차마 똑같이 설명할 엄두는 안나는 아티클
https://msolo021015.medium.com/jpa-persistence-context-deep-dive-2f36f9bd6214
DB 작업이 실제로 DB에 반영되기 전에 모여있는 장소입니다. 트랜잭션이 시작되면 영속성 컨텍스트에 의해 조회/수정될 엔티티를 보관하고 관리합니다.
(1차캐시) 캐시되기 때문에 성능에 도움이 됩니다
(더티체킹) 스냅샷을 이용해 데이터 일관성을 향상시킵니다.
(쓰기지연) 영속성 컨택스트 내에 모아놨다가 트랜잭션 종료될 때 한번에 수행합니다.
(개인공부1) JVM이란
JVM (Java Virtual Machine)은 Java 애플리케이션을 실행하기 위한 가상 머신입니다.
Java와 Kotlin 같은 언어는 소스 코드를 작성한 후, 컴파일되면 바이트코드(bytecode)라는 중간 언어로 변환됩니다. 이 바이트코드는 운영 체제에 종속되지 않고, 다양한 플랫폼에서 실행될 수 있습니다. 운영 체제에 종속되지 않고, 다양한 플랫폼에서 실행되는 이 특징을 WORA(Write Once, Run Anywhere)라고 합니다.
(개인공부2) Kotlin과 TypeScript의 차이
출처 | https://itnext.io/typescript-or-kotlin-for-a-backend-268191b56525
typescript
JavaScript에 정적 타입 시스템을 추가한 언어
JavaScript로 컴파일되어 브라우저와 서버(Node.js)에서 실행됩니다.
정적 타입이지만 any 사용 가능
OOP, FP, 일급객체, 람다식 지원
비동기: Promise, async/await
kotlin
Java 의 대안으로 나온 언어
JVM을 통해 바이트코드로 컴파일되며, Java와 상호 운용이 가능합니다.
엄격한 정적 타입 시스템
OOP, FP, 고차함수, 람다식 지원, 함수형 프로그래밍 더 좋다 함
비동기: Coroutines, suspend
(개인공부3) Spring과 Spring Boot의 차이
출처 | https://codestates.com/blog/content/스프링-스프링부트
스프링
엔터프라이즈 애플리케이션 개발을 위한 프레임워크
외부 서버 필요
XML 등을 이용해 환경 설정 작업 필요
한땀한땀 짜야 해서 복잡도가 높다
스프링부트
스프링 프레임워크를 더 편하게 쓰기 위한 프레임워크 (프레임워크의 프레임워크)
내장 서버 제공(Tomcat, Jetty)
application.properties나 application.yml 을 사용하여 간단하게 환경 설정 가능
Spring Initializr와 같은 프로젝트 시작 도구
많은 설정 자동화되어 있음
미니프로젝트
https://github.com/yujiniii/toy-box/tree/main/sky-kongkong 여기서 업데이트됩니다!
마무리
JVM과 spring 생태계가 생각보다 깊어서, 차곡차곡 개념을 추가해야할 거 같습니다.
스레드 관련해서도 정리하고 싶었는데 결국 못했네요 ᵕ_ᵕ̥̥
코드 작업에서는 NestJS 와 비교되는 부분(데코레이터-어노테이션, 인터셉터 등) 을 위주로 작성하고, 프로젝트도 얼른얼른 작업 해야할 거 같습니다..
다음 주차는 면접준비랑 겹쳐서 걱정이지만.... ( っ °、。)っ 그래두 화이티이잉...!!
댓글을 작성해보세요.