개발 공부/백엔드

스프링 부트 입문: 첫 프로젝트 시작하기 (김영한님 강의 정리)

baby-t 2025. 9. 13. 08:54

https://www.inflearn.com/

 

인프런 - 라이프타임 커리어 플랫폼

프로그래밍, 인공지능, 데이터, 마케팅, 디자인등 입문부터 실전까지 업계 최고 선배들에게 배울 수 있는 곳.

www.inflearn.com

인프런 사이트의 김영한님의 강의를 보면서 작성한 글입니다.

 

### 1. 개발 환경 준비

본격적으로 시작하기에 앞서, 개발에 필요한 세 가지 핵심 도구를 설치해야 합니다.

  • Java: Spring을 위한 프로그래밍 언어 (강의에서는 Java 17 버전을 권장합니다)
  • IntelliJ: Java 개발을 위한 강력한 통합 개발 환경(IDE)
  • H2 데이터베이스: 개발 및 테스트용으로 사용되는 가볍고 빠른 인메모리 데이터베이스

### 2. Spring Initializr로 프로젝트 생성

개발 환경이 준비되었다면, 이제 프로젝트의 뼈대를 만들어 보겠습니다. https://start.spring.io/ 사이트는 클릭 몇 번으로 Spring 프로젝트의 기본 구조와 필요한 라이브러리를 설정해주는 아주 편리한 도구입니다.

여기서 가장 중요한 부분은 **Dependencies(의존성)**를 추가하는 것입니다. 이번 프로젝트에서는 두 가지 핵심 라이브러리를 추가합니다.

  • Spring Web: 내장 톰캣(Tomcat) 웹 서버를 사용하여 웹 애플리케이션을 만들 수 있게 해주는 핵심 라이브러리입니다.
  • Thymeleaf: 서버에서 만든 데이터를 HTML에 동적으로 표현해주는 템플릿 엔진입니다.

설정을 완료하고 GENERATE 버튼을 누르면, 프로젝트 템플릿이 압축 파일(.zip) 형태로 다운로드됩니다.

### 3. 프로젝트 실행 및 확인

  1. 다운로드한 압축 파일을 원하는 위치에 풉니다.
  2. IntelliJ를 실행하고, 압축 해제한 폴더 안에 있는 build.gradle.kts (또는 build.gradle) 파일을 열어 프로젝트를 로드합니다.
  3. 프로젝트 구조에서 src/main/java 폴더 안의 메인 애플리케이션 파일(...Application.java)을 찾아 실행(Run)합니다.

잠시 후 콘솔 창에 다음과 같은 로그가 나타나면 성공입니다.

Bash
 
Tomcat started on port 8080 (http) with context path '/'

이제 웹 브라우저를 열고 주소창에 localhost:8080을 입력해 보세요. Whitelabel Error Page라는 흰 화면이 나타날 겁니다. 이는 오류가 아니라, **"서버는 성공적으로 실행되었지만, 루트 경로(/)에 연결된 화면이 아직 없을 뿐"**이라는 의미의 정상적인 페이지입니다.

### 4. 라이브러리 돌아보기: 의존성의 마법

프로젝트의 'External Libraries'를 살펴보면 우리가 직접 추가한 web, thymeleaf 외에도 수많은 라이브러리가 설치된 것을 볼 수 있습니다. 이것이 바로 Gradle이나 Maven 같은 빌드 도구가 제공하는 의존성 관리 기능입니다.

spring-boot-starter-web 하나를 추가하면, 웹 애플리케이션을 구동하는 데 필요한 tomcat, spring-webmvc 등 관련된 라이브러리들을 알아서 모두 가져와 주는 것입니다.

#### 핵심 스프링 부트 라이브러리

  • spring-boot-starter-web
    • spring-boot-starter-tomcat: 톰캣(Tomcat) 웹 서버를 내장하고 있습니다.
    • spring-webmvc: Spring MVC 프레임워크의 핵심 기능이 포함됩니다.
  • spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(View)
  • spring-boot-starter (모든 starter의 공통)
    • spring-boot: 스프링 부트의 핵심 기능
      • spring-core
    • spring-boot-starter-logging
      • logback, slf4j

#### 테스트 라이브러리

  • spring-boot-starter-test: 테스트에 필요한 모든 도구를 모아놓은 라이브러리입니다.
    • junit: 자바의 표준 단위 테스트 프레임워크
    • mockito: 테스트를 위한 가짜(Mock) 객체를 만들어주는 라이브러리
    • assertj: 검증문을 더 편리하게 작성하게 도와주는 라이브러리
    • spring-test: 스프링 통합 테스트 지원

### 5. 개발자가 알아야 할 핵심 개념

#### 웹 서버(Apache)와 WAS(Tomcat)의 역할

흔히 아파치와 톰캣을 함께 사용하는데, 이 둘은 역할이 다릅니다.

  • 아파치 (Web Server): 정적 콘텐츠(HTML, CSS, 이미지 등 변하지 않는 파일)를 처리하는 '웨이터'.
  • 톰캣 (WAS): 동적 콘텐츠(DB 조회 등 로직 처리가 필요한 결과)를 생성하는 '주방과 셰프'.

대규모 서비스에서는 모든 요청을 **아파치(웨이터)**가 먼저 받아 정적 요청은 바로 처리하고, 동적 요청만 **톰캣(주방)**에 넘겨 효율을 높입니다. 하지만 Spring Boot는 톰캣을 내장하고 있어, 개발 단계에서는 아파치 없이도 자체적으로 웹 서버와 WAS의 역할을 모두 수행할 수 있습니다.

#### System.out.println 대신 Log를 사용하는 이유

실무에서는 System.out.println() 대신 반드시 로깅(Logging) 라이브러리를 사용해 기록을 남깁니다.

  • 성능: System.out.println보다 훨씬 빠르고 시스템 부하가 적습니다.
  • 관리: 로그 레벨(INFO, DEBUG, ERROR 등)에 따라 출력 여부를 제어할 수 있고, 로그를 파일로 저장하거나 네트워크로 전송하는 등 체계적인 관리가 가능합니다.

스프링 부트에는 기본적으로 SLF4J(인터페이스)와 Logback(구현체)이라는 강력한 로깅 라이브러리가 포함되어 있어 바로 사용할 수 있습니다.

#### 테스트의 중요성

spring-boot-starter-test를 통해 설치된 JUnit 같은 도구로 코드를 검증하는 '단위 테스트'는 실무에서 매우 중요한 부분입니다. 테스트 코드를 작성하면 코드의 안정성을 높이고, 기능 변경 시 발생할 수 있는 문제를 사전에 방지할 수 있습니다.

 

### 6. Spring Web 정리

## Spring Web (spring-boot-starter-web) 뼈대 🏗️

Spring Web은 한마디로 웹 애플리케이션을 만드는 데 필요한 핵심 기능 모음입니다. 이걸 추가하면 웹 서버를 띄우고, 사용자의 요청(Request)을 받아 처리하고, 응답(Response)을 보낼 수 있는 모든 기본 준비가 끝납니다.

이 '기능 모음' 안에는 크게 두 가지 중요한 요소가 들어있습니다.

  1. 내장 톰캣 (Embedded Tomcat)
    • 역할: 웹 서버(WAS)
    • 설명: 원래 웹사이트를 열려면 톰캣 같은 웹 서버 프로그램을 별도로 설치하고 설정해야 했습니다. 하지만 Spring Boot는 이 톰캣을 내장하고 있어서, 우리가 만든 프로젝트를 실행하는 것만으로 웹 서버가 바로 실행됩니다. 웹 애플리케이션을 위한 **'땅과 건물'**을 제공하는 셈이죠.
  2. Spring MVC (Model-View-Controller)
    • 역할: 웹 요청 처리 프레임워크
    • 설명: 사용자가 특정 URL(localhost:8080/hello)로 접속했을 때, 그 요청을 누가 받아서, 어떤 로직을 처리하고, 어떤 화면을 보여줄지 교통정리를 해주는 설계 방식(프레임워크)입니다. 건물의 **'안내 데스크'이자 '업무 처리 방식'**이라고 할 수 있습니다.

요약: Spring Web은 웹 서버를 띄우고(톰캣), 들어온 요청을 처리하는 규칙(MVC)을 제공하는 Spring Boot의 웹 개발 필수 뼈대입니다.


## Thymeleaf (spring-boot-starter-thymeleaf) 옷 👕

**Thymeleaf(타임리프)**는 **템플릿 엔진(Template Engine)**의 한 종류입니다. 서버에서 만든 데이터(e.g., 사용자 이름, 상품 목록)를 HTML 문서에 예쁘게 입혀서 동적인 화면으로 만들어주는 역할을 합니다.

가장 큰 특징은 **'내추럴 템플릿(Natural Templating)'**이라는 점인데, 서버 없이 순수 HTML 파일만 열어도 웹 디자이너가 의도한 화면을 그대로 볼 수 있다는 장점이 있습니다.

#### 간단한 예시

서버에서 "user_name"이라는 변수에 "홍길동"이라는 데이터를 담았다고 가정해 봅시다.

1. 순수 HTML

HTML
 
<p>안녕하세요, 손님!</p>

2. Thymeleaf를 적용한 HTML (hello.html)

HTML
 
<p th:text="|안녕하세요, ${user_name}님!|">안녕하세요, 손님!</p>
  • th:text: Thymeleaf의 문법입니다. p 태그 안의 텍스트를 오른쪽 값으로 바꾸라는 의미입니다.
  • ${user_name}: 서버에서 user_name이라는 이름으로 넘겨준 데이터를 사용하겠다는 의미입니다.

3. 최종 결과 (사용자 브라우저에 보이는 모습)

HTML
 
<p>안녕하세요, 홍길동님!</p>

이처럼 Thymeleaf는 정적인 HTML 파일에 서버의 동적인 데이터를 채워 넣어주는, 웹 페이지를 위한 **'옷' 또는 '디자인'**을 담당합니다.


## 둘의 관계: MVC 패턴으로 본 협력

Spring Web과 Thymeleaf는 MVC(Model-View-Controller) 패턴 안에서 완벽하게 협력합니다.

  1. 사용자 요청: 사용자가 웹 브라우저로 특정 페이지를 요청합니다.
  2. Controller (Spring Web): 사용자의 요청을 받아서 필요한 비즈니스 로직을 처리하고, 화면에 보여줄 데이터를 준비합니다.
  3. Model (Spring Web): Controller가 준비한 데이터를 담는 '상자'입니다.
  4. View (Thymeleaf): Controller가 'Model' 상자를 Thymeleaf 템플릿 파일에게 전달합니다. Thymeleaf는 상자 안의 데이터로 HTML을 완성하여 사용자에게 보여줄 최종 화면을 만듭니다.

요청 → Controller(처리) → Model(데이터) → View(화면 생성) → 응답

이렇게 Spring Web이 요청 처리와 데이터 준비라는 백엔드의 핵심 로직을 담당하고, Thymeleaf가 그 결과를 사용자에게 보여주는 프론트엔드 화면을 그리는 역할을 분담하여 웹 애플리케이션이 완성됩니다.