한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.
1. 이 책을 선택한 동기
그동안 조금씩 공부해온 덕분에 백엔드에 대한 이해도가 작년에 비해서는 조금 생겼습니다. Node.js로 간단한 서버를 만들어본 적도 있고, NestJS로 사이드 프로젝트 백엔드를 구축해본 경험도 있었죠.
하지만 여전히 자바 진영은 완전히 미지의 영역이었습니다. 채용 공고를 보면 백엔드 포지션의 대다수가 "Java/Spring" 또는 "Kotlin/Spring"을 요구하더라고요. 개발 커뮤니티에서도 스프링 관련 이야기가 정말 많이 오가는데, 사실 저는 자바와 스프링의 차이가 뭔지도 명확하게 몰랐습니다. 또한 스프링이 프레임워크라는 건 알겠는데, 스프링 부트는 또 무엇인지 감을 잡을 수 없었죠.
이런 궁금증이 쌓여가던 차에 스프링 부트 개발자 온보딩 가이드를 발견했어요.
2. 어떤 책인지
스프링 부트 개발자 온보딩 가이드는 제목 그대로 '온보딩 문서'처럼 구성된 스프링 부트 실무 입문서예요. 개발 환경 구축부터 AWS 배포까지, 하나의 프로젝트를 처음부터 끝까지 만들어가는 과정을 따라가며 배우는 구조입니다.
책의 흐름은 이렇습니다. 먼저 개발 환경(WSL2, Docker, IntelliJ, JDK 21, Gradle)을 세팅하고, 가장 단순한 인메모리 To-Do API부터 시작해요. 이후 JPA와 MySQL을 연동하고, 마이크로블로그라는 좀 더 복잡한 프로젝트로 확장합니다. 여기에 JWT 인증(스프링 시큐리티), GraphQL 지원을 추가하고, 마지막에는 Docker로 패키징해서 AWS에 배포하는 것까지 다룹니다.
3. 특히 인상적이었던 점
자바/스프링 생태계만의 특징
NestJS에서는 데코레이터(@Controller, @Get 등)를 사용하는데, 스프링 부트에서도 비슷하게 애노테이션(@RestController, @GetMapping 등)을 사용하더라고요. 문법은 비슷해 보이는데, 내부 동작 방식이나 철학은 꽤 다르다는 걸 느꼈어요. 특히 스프링의 의존성 주입(DI)과 IoC 컨테이너 개념이 NestJS보다 더 명시적이고 체계적으로 다뤄진다는 인상을 받았습니다.
JPA
NestJS에서는 TypeORM이나 Prisma를 주로 사용했는데, JPA는 접근 방식이 꽤 달랐습니다. 엔티티 클래스에 @Entity, @Id, @GeneratedValue 같은 애노테이션을 붙이고, 리포지토리 인터페이스만 정의하면 기본 CRUD가 자동으로 생성되는 게 신기했어요. "인터페이스만 만들면 구현체가 알아서 생긴다고?" 하는 느낌이었죠.
스프링 시큐리티
NestJS에서 Passport.js로 인증을 구현해본 적 있는데, 스프링 시큐리티는 훨씬 더 정교하고 체계적이었어요. 필터 체인, UserDetails, GrantedAuthority 같은 개념들이 처음엔 복잡하게 느껴졌지만, 이 구조 덕분에 세밀한 권한 제어가 가능하다는 걸 이해하게 됐습니다.
고민상담소
"자바 개발자가 배워야 할 프레임워크", "스프링 부트의 데이터베이스 연동", "GraphQL 도입 시점" 같은 실무적인 고민들을 다뤄주었어요.
4. 덕분에 무엇을 배웠는가
1. 자바와 스프링, 스프링 부트의 관계에 대한 이해
자바는 언어, 스프링은 프레임워크, 스프링 부트는 스프링을 더 쉽게 사용하게 해주는 도구라는 걸 알게 됐습니다. 스프링 부트가 자동 설정(Auto Configuration)과 내장 서버를 제공해서 복잡한 XML 설정 없이 빠르게 시작할 수 있다는 것도요.
2. 자바 진영의 프로젝트 구조와 컨벤션
패키지 구조(entity, dto, repository, service, controller), build.gradle 설정, application.properties 활용법 등 자바/스프링 프로젝트에서 당연하게 여기는 것들을 배웠습니다. NestJS의 모듈 구조와 비교해보면서 이해하니까 더 와닿았어요.
3. JPA의 동작 방식을 이해
영속성 컨텍스트, 엔티티 생명주기, 연관관계 매핑 같은 개념들이 TypeORM과 어떻게 다른지 비교하며 배울 수 있었어요. 특히 DTO 패턴을 왜 사용하는지, 엔티티를 직접 노출하면 안 되는 이유를 명확하게 알게 됐습니다.
4. Gradle 빌드 시스템
Node.js의 npm/yarn에 익숙했는데, Gradle은 빌드 스크립트 자체가 코드(Groovy/Kotlin DSL)라는 점이 달랐어요. 의존성 관리 방식도 다르고, 빌드 태스크 개념도 새로웠습니다.
5. 좋았던 점
1) 점진적으로 기능을 확장하는 구조
인메모리 → JPA → 인증 → GraphQL → 배포로 하나의 프로젝트를 점진적으로 확장하는 구조가 좋았어요. 새로운 개념을 배울 때마다 이전 코드 위에 쌓아가니까, 변경점이 명확하게 보이고 이해가 쉬웠습니다. NestJS에서 비슷한 패턴을 경험해봤기 때문에, "아 스프링에서는 이렇게 하는구나" 하고 비교하며 배울 수 있었어요.
2) 실무 환경 그대로의 개발 환경 구성
WSL2, Docker, IntelliJ, JDK 21이라는 조합은 실제 자바 개발 현장에서 많이 사용하는 환경이라 합니다. 특히 Docker로 MySQL을 띄우는 방식은 Node.js 개발할 때도 비슷하게 했던 거라 익숙했고, 자바 진영에서도 동일한 방식을 사용한다는 걸 확인할 수 있었어요.
3) GraphQL까지 다루는 폭넓은 범위
REST API만 다루는 게 아니라 GraphQL까지 다뤄요. NestJS에서도 GraphQL을 사용해봤는데, 스프링에서는 어떻게 구현하는지 비교해볼 수 있었어요. 스키마 정의 방식이나 리졸버 구현 방식이 꽤 달라서 흥미로웠습니다.
6. 아쉬웠던 점
1) 자바 기초 문법에 대한 설명 부족
저처럼 자바 경험이 없는 개발자에게는 진입 장벽이 있었어요. 람다 표현식, 스트림 API, Optional 같은 문법이 당연하다는 듯이 사용되는데, 간단한 자바 문법 부록이 있었으면 좋았을 것 같아요.
2) 스프링과 스프링 부트의 차이에 대한 설명 부족
책 초반에 스프링 부트를 소개하긴 하지만, "스프링 부트가 없던 시절에는 어떻게 했는지", "스프링 부트가 정확히 무엇을 자동화해주는지"에 대한 깊이 있는 설명은 부족했어요. 자바 진영이 처음인 저로서는 이 맥락이 더 궁금했거든요.
7. 이 책을 읽은 덕분에 기대되는 변화
이 책을 읽고 나서 자바/스프링 진영에 대한 막연함이 많이 걷혔어요. 개발 커뮤니티에서 "스프링 시큐리티가...", "JPA N+1 문제가..." 하는 대화가 나와도 이제는 무슨 맥락인지 이해할 수 있게 됐습니다.
NestJS와 비교하면서 배우니까, 각 프레임워크의 장단점도 더 명확하게 보이기 시작했어요. NestJS의 모듈 시스템이 더 직관적인 부분도 있고, 스프링의 생태계와 성숙도가 더 탄탄한 부분도 있다는 걸 느꼈습니다.
결과적으로 자바 백엔드 개발자와 협업할 때 더 깊이 있는 소통이 가능해질 것 같습니다.






















