백엔드 + 자바 + 스프링
그 길에 도움이 되고자 15년 동안 업계에 있으면서 보고 들은 경험을 바탕으로 나만의 기술 로드맵을 작성해 봤습니다. 혹시 미래의 백엔드 개발자를 꿈꾸는 분들이 있다면 작은 도움이 되기를 바랍니다.
기본기
Spring -> Hibernate -> TDD -> REST -> Docker -> Kubernetes
유지 보수하기 좋은 코드
Clean Code -> SOLID
유연한 설계
DDD -> MSA -> EDA
넥스트 레벨
RDBMS -> NoSQL -> Kotlin
위 로드맵에 표시된 대부분의 기술은 공식 사이트가 있습니다.
- Spring: https://spring.io/
- Hibernate: https://hibernate.org/
- Docker: https://www.docker.com/
- Kubernetes: https://kubernetes.io/
- Kotlin: https://kotlinlang.org/
책 스터디, 온라인 강의, 부트 캠프를 하면서도 공식 문서는 같이 보는 것이 좋습니다. 공식 문서만큼 정확한 자료는 없으니까요.
위 기술들은 모두 서점에 많은 책들이 나와 있습니다. 약간의 비용을 들여서 책을 사서 봐야 합니다. 단, 혼자서 읽는 것은 그리 좋은 방법이 아닐 것 같습니다. 저는 반드시 그룹 스터디를 진행합니다. 사람마다 이해하고 해석하는 방식이 다를 수 있기 때문입니다. 그래서 서로 다르게 이해한 부분을 토론해야 합니다.
그리고 가능하면 경험치가 다양한 사람들과 같이 스터디하는 것이 좋습니다. 경험에 따라 해석이 달라질 수 있습니다. 그렇다고 연차가 많은 사람이 다 옳지는 않습니다. 그들은 틀에 박혀 있을 수 있습니다. 연차가 적은 사람이 창의적으로 해석할 수 있습니다. 그렇기 때문에 연령대와 성별이 골고루 분포되어 있는 스터디가 좋습니다.
일정 비용을 지불하면 온라인으로 강의를 수강할 수 있는 사이트가 많습니다. 저는 인프런(https://www.inflearn.com/)과 패스트 캠퍼스(https://fastcampus.co.kr/)를 선호하는 편입니다.
다소 높은 비용을 지불하더라도, 단기간에 여러 가지 기술을 습득할 수 있는 부트 캠프가 많이 있습니다. 코드 스테이츠, 위 코드, 바닐라 코딩, 네이버 부스트 캠프, 우아한 테크 코스/캠프 등 수많은 과정이 있습니다. 각 사이트에 과정과 비용을 잘 문의해 보고 선택하시기를 바랍니다.
저는 Spring 2.5부터 사용했습니다. 당시에는 책이 많이 없어서 스프링 공식 문서를 보고 혼자 공부했는데 낯선 용어들이 많이 어려웠습니다.
스프링의 기술들의 종류가 워낙 많고, 내용이 방대해서 어떤 것부터 봐야 할지 막막하신 분은 Spring Boot를 먼저 보세요. Spring Boot는 Spring 기반의 애플리케이션을 쉽게 만들어 주는 종합 선물세트입니다. 자료는 공식 문서 (https://docs.spring.io/spring-boot/docs/current/reference/html/)가 최고예요!!
Hibernate를 이해하려면 ORM, JPA의 개념부터 알아야 합니다. ORM(Object Relational Mapping)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법입니다. JPA(Java Persistence API)는 Java 진영의 ORM 표준 명세입니다. JPA 구현체가 여러 개 있는데 그중에 하나가 Hibernate입니다.
국내에서는 Mybatis와 함께 쌍벽을 이루고 있죠. 아직 둘 다 접하지 않으셨다면 Hibernate를 익히시길 추천드립니다. 개인적으로 대세라는 생각이 들기 때문입니다.
제가 Hibernate를 공부한 방법은 자바 ORM 표준 JPA 프로그래밍 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=62681446) 그룹 스터디였습니다. 이 책은 우리나라 업계에 Hibernate 저변을 넓힌 1등 공신이라고 감히 말할 수 있을 것 같습니다.
이 책을 다 읽고, 단방향 vs 양방향 연관관계에 대한 토론을 하기를 바랍니다. 그리고 OneToOne 연관관계를 사용해야 하는가? 도 논의해 보세요.
TDD (Test Driven Development)는 테스트 주도 개발입니다. 테스트 케이스를 먼저 작성하고, 그에 맞게 비즈니스 코드를 만들어 가는 방법론입니다. 혹시 비즈니스 코드를 먼저 만들고, 나중에 테스트 케이스를 작성해야지 생각한다면 잘못하신 겁니다. 반드시 테스트를 먼저 작성하세요.
TDD를 하면 어떤 장점이 있을까요?
TDD는 지금 개발하고 있는 기능에 집중할 수 있습니다. 즉 오버 엔지니어링을 피할 수 있게 해 준다는 의미입니다.
저는 테스트 주도 개발(https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=37469717)로 공부했습니다. 시간이 없으시다면 1부만 읽고, 2~3부는 SKIP 해도 관계없습니다.
REST는 애플리케이션을 통합하는 경량의 유연한 방법을 제공하며, 이는 마이크로 서비스 아키텍처에서 컴포넌트 연결을 위한 가장 일반적인 방법입니다. (출처: ibm.com)
백엔드 API를 만드는 패러다임은 REST, gRPC, GraphQL 등이 있습니다. 우선 REST를 먼저 공부하기를 추천드립니다. REST가 쉽고 단순해서 아직은 현장에서 많이 쓰이기 때문입니다.
저는 처음에 마이크로소프트 기술 문서 (https://docs.microsoft.com/ko-kr/azure/architecture/best-practices/api-design)를 보고 개념을 파악했습니다.
그리고 Best Practices (https://www.freecodecamp.org/news/rest-api-best-practices-rest-endpoint-design-examples/)를 보고 실서비스에 많이 적용하려고 노력했습니다.
도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트입니다. (출처: 위키백과)
요즘은 AWS, GCP, Azure 등과 같은 퍼블릭 클라우드 시대입니다. 클라우드 시대에 Docker와 Kubernetes는 필수 기술입니다. 저는 가장 빨리 만나는 도커 Docker (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=49500589)로 공부했습니다. 이 책은 도커의 수많은 기능 중에서 주로 쓰이는 것들만 빠르게 살펴볼 수 있어서 좋았습니다.
K8s라고도 알려진 쿠버네티스는 컨테이너화 된 애플리케이션을 자동으로 배포, 스케일링 및 관리해주는 오픈소스 시스템입니다. 컨테이너는 주로 Docker를 사용하고, 선언 정의는 YAML로 작성합니다.
쿠버네티스 학습은 쿠버네티스 입문 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=224537264)으로 스터디했습니다. 책의 독자 타깃이 devops와 developer 모두여서 중간에 어려운 내용도 나옵니다. 2장 설치하기는 Skip 하고, 3장 컨테이너 실행하기 위주로 보시면 좋을 듯합니다.
왜 유지 보수하기 좋은 코드를 작성해야 할까요? 내가 익숙하고, 빠르게 할 수 있는 방식으로 작성하면 안 되는 걸까요?
통계에 따르면 개발자들은 업무 시간의 대략 80%를 내가 아닌 남이 짠 소스 코드를 분석하고, 수정하는데 시간을 사용한다고 합니다. 그렇기 때문에 유지 보수하기 좋은 코드를 짜야 개발팀/회사 전체의 생산성이 올라가고, 안정성이 좋아집니다.
로버트 C. 마틴 (일명 엉클 밥)은 2009년 저서 "Clean Code: A Handbook of Agile Software Craftsmanship"에서 처음으로 클린 코드라는 용어를 사용했습니다.
좋은 코드란 무엇인가에 대한 엉클 밥의 여러 경험들을 기술했는데, 책이 베스트셀러가 되면서 개발자들 사이에서 고유명사처럼 '클린 코드'라는 말을 쓰곤 합니다. 즉 현장에서 "클린 코드 하자" = "책에 나온 좋은 기법을 적용하자."라고 이해하시면 될 것 같네요.
SOLID는 로버트 C. 마틴이 주장한 객체 지향 설계를 도와주는 5가지 원칙의 앞 글자를 땄습니다.
- 단일 책임 원칙 (Single responsibility principle)
- 개방-폐쇄 원칙 (Open/closed principle)
- 리스코프 치환 원칙 (Liskov substitution principle)
- 인터페이스 분리 원칙 (Interface segregation principle)
- 의존관계 역전 원칙 (Dependency inversion principle)
클린 아키텍처 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=202322454) 초반부에 자세한 설명이 나오는데 예제 코드가 부족해서인지 저는 이해가 쉽지 않았습니다.
대신 실전 자바 소프트웨어 개발 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=242651862)을 통해서 쉽게 이해할 수 있었습니다. 촌스런 책 제목에 비해 내용이 훌륭해서 제 인생 개발 책이에요.
만약 kotlin에 익숙하신 분이라면 https://medium.com/the-android-caf%C3%A9/solid-principles-the-kotlin-way-ff717c0d60da 블로그에도 굉장히 좋은 예제가 있습니다.
여러분이 만든 시스템과 서비스는 곧 10배 성장할 것이고, 이윽고 100배 성장할 것이기 때문입니다. 개발자가 성장의 발목을 잡으면 안 됩니다.
그렇지만 이 원칙을 지키는 법은 여간 어려운 게 아닙니다.
왜냐하면 시스템이 최초에 만들어질 때 개발자도 적을 것이고, 이용자도 적습니다. 그렇기에 DB 1대, 애플리케이션 1대로 구성합니다. 점점 회사가 커지게 되면 개발자 수도 늘고, 이용자도 늘게 되면서 DB를 scale-up 하고, 애플리케이션을 추가합니다. 이런 구조를 모놀리식 구조라고 합니다. 일반적으로 생각할 수 있는 방법이고, 수많은 장점을 갖고 있습니다.
하지만 불행히도 모놀리식은 확장성이 부족합니다. 물론 확장할 수 있지만 비용이 많이 듭니다.
그래서 요즘 백엔드 개발자들이 가장 관심을 많이 가지는 기술이 DDD, MSA, EDA 3형제입니다.
MSA와 EDA는 작은 규모의 회사에서 도입이 어려운 개념입니다. 그렇지만 여러분은 꼭 정확하게 이해하시기 바랍니다. 곧 도입해야 할 테니까요.
DDD (Domain Driven Design)는 Eric Evans가 제시한 시스템 설계 패턴과 원칙입니다. 복잡한 비즈니스를 도메인 모델로 캡슐화하고, 이를 약하게 연결(loose coupling) 하는 것입니다.
기본 개념은 에릭 에반스의 도메인 주도 설계 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=12174216) 를 읽으시면 됩니다. 그런데 책이 너무 두껍고 많이 어렵습니다.
그래서 저는 도메인 주도 설계란 무엇인가? (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=12620317)를 통해서 기본 개념을 익혔습니다.
김범균 님의 DDD Start! 가 있습니다. 쉽고 알찬 책입니다. 그렇지만 저는 이 책을 읽을 때 주의가 필요하다고 생각합니다. 왜냐하면 이 책의 4~5장의 JPA 예제가 너무 강렬해서 주니어 개발자들이 DDD에 대하여 오해할 소지가 있습니다.
DDD Start!처럼 적용하는 방법도 있고 Hexagonal Architecture (https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)) 처럼 데이터베이스를 Core 밖으로 두는 방법도 있습니다. 저는 이 방법을 선호합니다.
MSA (Microservice Architecture)는 애플리케이션을 느슨하게 결합된 서비스의 모임으로 구조화하는 서비스 지향 아키텍처 스타일의 일종인 소프트웨어 개발 기법입니다. (출처: 위키백과)
마틴 파울러는 "마이크로 서비스 아키텍처란 단일 애플리케이션을 소규모 서비스 단위로 구분하여 개발하는 접근방식으로 각각 자체의 프로세스에서 실행되고, 경량 메커니즘과 통신합니다. 이 작은 단위의 서비스를 구분하는 것은, 비즈니스 로직을 중심으로 하며 독립적으로 배치 가능한 정말 자동화된 배포가 이루어져야 합니다."라고 정의했습니다.
대규모 서비스를 제공하려면 앞으로는 무조건 MSA를 고려해야 합니다.
저는 마이크로서비스 패턴 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=228694618)을 통해 개념을 배웠습니다. 아직도 SAGA는 잘 이해가 안 되지만 팀원들과 머리를 맞대고 실행 방안을 마련 중입니다.
EDM (Event Driven microservice Architecture)는 MSA 취약점을 보완하기 위해 Event를 접목한 개념입니다. MSA에서 주로 사용하는 REST는 서비스의 세부 정보를 알아야 하는 이슈가 있습니다. 또한 REST의 동기식 호출은 느슨한 결합(Loose coupling)과 다소 거리가 있습니다.
반면에 이벤트는 비동기 방식으로 생산/소비되어 시스템을 통합(integration)하는데 매우 적합합니다. 그중에서 Kafka라는 Event Broker가 특히 사랑받고 있습니다.
자세한 내용은 이벤트 기반 마이크로서비스 구축 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=269568979)에서 확인하시기 바랍니다.
여기까지 따라오셨다면 여러분은 이미 훌륭한 백엔드 개발자입니다. 그렇지만 저는 욕심을 더 내고 싶었습니다. 다음 단계로 올라가 보시죠.
Hibernate를 사용하는 개발자라면 SQL은 어느 정도 다룰 수 있을 것입니다. 하지만 대규모 시스템을 다루게 되면 사용하는 RDBMS에 대한 깊이 있는 지식이 필요합니다.
Lock, Index, Transaction, Isolation Level, 성능 튜닝
저는 이미 절판된 '대용량 데이터베이스 솔루션'이라는 책으로 RDBMS를 공부했습니다. 지금 생각해 보면 책이 너무 두껍고 어려웠습니다.
여러분께는 데이터베이스 첫걸음 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=94059951)을 추천합니다. 친절하고 차분하게 데이터베이스에 대해서 알려줍니다.
첫걸음을 다 떼셨다면 본인이 사용하는 RDBMS 관련해서 깊이 있는 내용을 공부하세요. 저는 MySQL을 사용해서 Real MySQL 8.0 (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=278488709)을 보고 있습니다.
NoSQL(원래 의미: non SQL 또는 non relational) 데이터베이스는 전통적인 관계형 데이터베이스보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 메커니즘을 제공합니다. (출처: 위키백과)
대량 트래픽 처리를 위해서는 RDBMS 만으로 데이터를 처리하기에는 한계가 있습니다. 그리고 RDBMS는 Scale-out이 힘들기 때문에 각광받는 기술이 NoSQL입니다. NoSQL은 Scale-out에 최적화된 데이터 저장소입니다.
NoSQL 중에서 인기가 많은 기술은 Redis, MongoDB, ElasticSearch, Cassandra, HBase 등이 있습니다. Redis는 인 메모리 키-값 스토어입니다. 속도가 빠르고 개발이 손쉽다는 장점이 있어서 캐시, 세션 저장소로 많이 쓰입니다. MongoDB는 스키마 없이 자유로운 데이터 모델을 저장할 수 있어서 인기가 많습니다. ElasticSearch는 오픈 소스 분산 검색 엔진입니다. 그래서 간단한 검색 기능을 만들기에 용이합니다.
Java가 아닌 다른 언어를 다룰 수 있다는 것은 개발자의 시야를 넓힐 수 있는 매우 좋은 선택입니다. 특히 Kotlin은 JVM에서 동작하는 프로그래밍 언어이며, 안드로이드 공식 언어입니다. 요즘 들어 백엔드에서 많이 각광을 받고 있습니다. Java를 다룰 줄 아는 개발자가 쉽게 익힐 수 있는 언어이기 때문입니다.
공부는 Kotlin in Action (https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=120267010)으로 했습니다.
내용은 참 좋았지만 과연 우리나라 개발자들 가슴에 와닿을까 하는 생각을 했습니다.
그래서 나만의 자바 개발자 로드맵을 만들어 봤습니다.
공감 못하실 수도 있지만, 그래도 여러분만의 로드맵을 만드는데 참고자료가 되기를 소망합니다.
오늘도 노버그 하시고, 또 한 단계 성장하십시오.