포스트

스프링 초급 (0) - Introduction

스프링을 처음 보는 사람을 위한 초급 시리즈의 소개와 진행 순서, 실습 환경과 예제 도메인을 다룹니다.

스프링 초급 (0) - Introduction

스프링을 오늘 처음 열어보는 사람을 위한 시리즈의 0편입니다. 시리즈 소개와 진행 순서를 다루며, 실습은 1편부터 시작합니다.

무엇을 다루나

스프링 프로젝트를 하나 만들고, 브라우저에 글자 하나를 띄우는 것부터 시작해서 데이터베이스에 저장하는 API까지 한 줄씩 쌓아 올립니다.

처음 스프링을 볼 때 가장 막막한 건 애노테이션입니다. @RestController, @GetMapping, @Service, @Autowired가 튜토리얼에 갑자기 등장하는데, 왜 붙이는지는 알려주지 않고 “이렇게 쓰면 됩니다”로 넘어갑니다. 그래서 따라 치면 동작은 하는데, 조금만 다른 걸 만들려고 하면 손이 멈춥니다.

이 시리즈는 반대로 갑니다. 애노테이션을 붙이기 전에 그게 없으면 무엇이 불편한지를 먼저 봅니다.

  • 컨트롤러 하나에 코드를 다 넣어보고 → 불편해지는 지점을 확인하고 → 계층을 나눕니다
  • 객체를 new로 직접 만들어 보고 → 데이터가 갈라지는 걸 확인하고 → 스프링에게 넘깁니다

순서가 이렇게 되어 있으면 애노테이션이 “외워야 할 것”이 아니라 “방금 겪은 문제의 해결책”이 됩니다.

그리고 각 편에는 직접 돌려서 확인하는 실험을 넣습니다. 코드를 일부러 망가뜨려 보고, 그때 나오는 에러 메시지를 같이 읽습니다. 나중에 똑같은 에러를 만났을 때 당황하지 않는 게 목적입니다.

누구를 위한 시리즈인가

  • 스프링이라는 이름은 들어봤지만 프로젝트를 만들어본 적이 없는 사람
  • 튜토리얼을 따라 쳐서 동작은 시켰는데 무슨 일이 일어난 건지 모르겠는 사람
  • 자바는 배웠는데 웹 서버를 어떻게 띄우는지 모르는 사람

자바 문법만 알면 됩니다. 클래스와 메서드를 만들 줄 알고, 인터페이스가 뭔지 대충 알면 충분합니다. 웹이나 HTTP를 몰라도 필요한 만큼은 그때그때 설명합니다.

이 시리즈에서 다루지 않는 것

초급이라는 이름값을 하려면 덜어내는 게 더 중요합니다. 아래는 일부러 빼놓았습니다.

주제 이유
영속성 컨텍스트, 1차 캐시, 더티 체킹 JPA가 뒤에서 하는 일. 저장·조회를 먼저 해보고 나서 봐야 이해가 됩니다
프록시, AOP, @Transactional의 동작 원리 스프링이 몰래 객체를 감싸는 이야기. 원리를 모르고도 붙여 쓸 수 있습니다
DispatcherServlet 내부 구조 요청이 어떻게 컨트롤러까지 오는지의 내부 경로
빈 스코프, 빈 생명주기 콜백 초급 단계에서 쓸 일이 거의 없습니다
순환 참조, 동일 타입 빈이 여러 개일 때 설계가 복잡해진 뒤에 만나는 문제입니다

위 주제들은 별도의 중급 시리즈에서 다룹니다. 여기서는 “그런 게 있다” 정도만 언급하고 넘어갑니다. 지금 단계에서는 원리보다 완성된 API를 하나 만들어보는 경험이 먼저입니다.

이해가 안 되는 문장이 나와도 일단 넘어가세요. 초급 단계에서는 코드가 돌아가는 걸 보는 게 이해보다 먼저입니다. 원리는 두 번째 프로젝트를 만들 때 훨씬 잘 들어옵니다.

실습 환경

시리즈 내내 아래 환경을 씁니다. 버전이 조금 달라도 내용은 거의 같습니다.

항목 버전
Java 21
Spring Boot 3.x
빌드 도구 Gradle
DB H2 (인메모리)
패키지 com.example.demo

Spring Boot 3.x는 Java 17 이상을 요구합니다. 이 시리즈는 Java 21로 진행하는데, 21이 LTS(장기 지원) 버전이라 새로 시작한다면 21을 고르는 게 낫습니다. 17로 따라 해도 내용은 같습니다.

DB는 5편부터 씁니다. H2 인메모리를 고른 이유는 설치가 필요 없어서입니다. 애플리케이션을 켜면 메모리 안에 DB가 생기고, 끄면 사라집니다. 데이터가 날아가는 게 단점처럼 보이지만, 배우는 동안에는 오히려 매번 깨끗한 상태에서 시작할 수 있어서 편합니다.

예제 도메인

시리즈 내내 회원과 주문만 다룹니다. 도메인이 단순해야 스프링 쪽에 집중할 수 있어서입니다.

1
2
Member  — id, name, email
Order   — id, member, itemName, price

회원이 주문을 하는, 그것뿐입니다. 1편부터 4편까지는 Member만 쓰고, Order는 4편에서 등장합니다.

어떻게 진행하는가

아홉 편으로 진행합니다. 앞 편이 뒷 편의 전제가 되므로 순서대로 읽어야 합니다. 각 편은 앞 편에서 만든 코드를 이어받아 고쳐 나갑니다.

주제 직접 확인하는 것
0 Introduction 시리즈 소개와 실습 환경
1 First API: 브라우저에 응답 띄우기 컨트롤러를 다른 패키지에 두면 안 잡히는 것
2 Request: 요청에서 값 꺼내기 요청 본문을 받을 때 나는 400 에러 읽기
3 Layer: 컨트롤러에서 서비스를 떼어내기 분리하면 테스트에서 바로 부를 수 있는 것
4 DI: 객체를 직접 만들지 않기 new를 두 번 하면 데이터가 갈라지는 것
5 Database: JPA로 저장하고 조회하기 애플리케이션을 껐다 켜면 데이터가 사라지는 것
6 DTO: 엔티티를 그대로 내보내지 않는 이유 필드를 추가하면 응답에 자동으로 새는 것
7 Validation & Exception: 실패를 한곳에서 처리하기 처리 전후의 에러 응답 형태 비교
8 Config: 설정을 코드 밖으로 빼기 프로필을 바꾸면 다른 설정이 뜨는 것

1편이 이 시리즈에서 가장 중요합니다. 프로젝트를 만들고 브라우저에 응답이 뜨는 걸 보는 순간까지가 제일 많이 포기하는 구간이라서입니다. 1편만 끝내면 나머지는 그 위에 얹는 일입니다.

각 편의 구성

모든 편이 같은 순서로 흘러갑니다.

  1. 문제 상황 — 지금 코드에서 뭐가 불편한지
  2. 코드 — 어떻게 고치는지
  3. 실행 결과 — 진짜 그렇게 되는지 (로그, JSON, curl 출력)
  4. 왜 그런가 — 스프링이 무슨 일을 한 건지

그리고 편마다 ### 확인: 으로 시작하는 섹션이 있습니다. 여기가 손으로 직접 돌려봐야 하는 부분입니다. 읽고 지나가면 안 남습니다.

시작하기 전에

준비물은 두 가지입니다.

준비물 확인 방법
JDK 21 (17 이상이면 가능) 터미널에서 java -version
IDE IntelliJ IDEA Community 또는 VS Code

java -version을 쳤을 때 이렇게 나오면 됩니다.

1
2
3
openjdk version "21.0.11" 2026-04-21
OpenJDK Runtime Environment Homebrew (build 21.0.11)
OpenJDK 64-Bit Server VM Homebrew (build 21.0.11, mixed mode, sharing)

command not found: java가 나오거나 버전이 17보다 낮으면 JDK부터 설치합니다. 새로 설치한다면 21을 권합니다. IDE는 IntelliJ IDEA Community 버전을 권합니다. 무료이고, 스프링 프로젝트를 열면 Gradle 설정을 알아서 읽어옵니다.

프로젝트 생성은 1편에서 처음부터 같이 합니다. 미리 만들어 둘 필요 없습니다.

준비가 됐으면 1편으로 갑니다. 빈 폴더에서 시작해서, 브라우저에 응답이 뜨는 것까지 갑니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.