기록방

[1일차] 1장 : 스프링 부트 시작하기 본문

FrameWork/스프링

[1일차] 1장 : 스프링 부트 시작하기

Soom_1n 2024. 3. 6. 15:48
길벗 IT도서에서 주관하는 코딩 자율학습단 8기 : Spring Boot 파트에 참여한 기록입니다 [ 목록 ] 

 

스프링 부트는 자바 기반 웹 서비스를 더욱 쉽고 편리하게 만들기 위해 개발된 도구. 스프링 부트란 무엇인지 알아보고 스프링 부트 개발 환경을 설정 후 “헬로 월드!”를 출력해 보자. 그리고 그 과정에서 웹 서비스의 동작 원리도 함께 알아보자.

 

1.1 스프링 부트란

  • **스프링 부트(Spring Boot)**는 자바 웹 프로그램을 더욱 쉽고 빠르게 만들기 위한 도구
    • 자바 웹 프로그램을 만들기 위한 기능과 도구가 모여있음
💡 스프링과 스프링 부트는 사실 새로운 기술이라기 보단 스프링 프레임워크(Spring Framework)를 개선한 것.

1. 개발 환경 설정 간소화 : 스프링은 버전에 따라 동작하는 외부 라이브러리를 일일이 찾아 연동. 스프링 부트는 미리 설정된 스타터 프로젝트로 외부 라이브러리를 최적화해 제공
2.
웹 애플리케이션 서버를 내장 : 스프링 부트는 내부에 웹 애플리케이션 서버(WAS, Web Application Server)인 톰캣을 가지고 있음. 따라서 웹 서비스를 jar파일로 간편하게 배포 가능

1.2 스프링 부트 개발 환경 설정하기

스프링 부트의 개발 환경 설정은 3단계를 걸친다

 

  1. JDK(Java Development Kit, 자바 개발 도구) 설치
    • 자바 코드의 번역과 실행을 담당하는 자바 개발 도구
  2. IDE(Integrated Development Environment, 통합 개발 환경) 준비
    • 인텔리제이, 이클립스 등
  3. 스프링 프로젝트 만들어서 “헬로 월드!” 띄우기

 

1.2.1 JDK 설치하기

  • window나 mac에 OpenJDK 17을 설치하는 과정이지만, 이미 설치되어 있으므로 생략한다.
  • 인텔리제이 내부에서 JDK를 인스톨하는 것도 편리하다.

 

1.2.2 IDE 설치하기

  • 인텔리제이 설치 과정으로 Community Edition 설치
    • 난 학생 계정으로 Ultimate 버전을 사용한다.
  • JetBrains Toolbox를 먼저 설치하면, 설치와 버전 관리가 더 쉬운 것 같다.

 

1.2.3 스프링 부트 프로젝트 만들기

  • 스프링 부트는 Spring Initializer를 사용해 쉽게 프로젝트를 생성할 수 있다.
    • https://start.spring.io 에 접속해 만들 수 있다.
    • 난 IntelliJ 새 프로젝트 제네레이터에 있는 Spring Initializer 사용했다.

  • ‘아티팩트’를 firstproject로 바꾼다. (프로젝트 이름)
  • ‘이름’과 ‘패키지 이름’이 변경되는데, 패키지 이름은 그룹과 아티팩트를 조합한 값이다.

 

  • SpringBoot는 교재에선 3.1.0을 사용했지만, 없어진 버전이라 기본 값인 3.2.3 사용
  • 종속성(Dependencies)으로 H2 Database, Mustache, Spring Data JPA 추가
  • 나중에 보니 Spring Web 도 필요해서 종속성에서 추가해 주었다.
  •  
💡 스프링 부트 버전 접미사
스프링 부트 뒤에 표기된 접미사는 소프트웨어 생명 주기를 의미하고, 일반적으로 GA 또는 아무런 접미사가 없는 버전을 선택하면 된다.

SNAPSHOT : 현재 테스트 단계
Mx(Milestone) : 주요 기능 및 버그 수정 중인 단계(M1, M2, …)
RC(Release Candidate) : 전반적 기능과 버그가 모두 수정된 최종 배포 전 단계
GA(General Availability) : 최종 배포 단계(대부분 기능과 버그들이 안정화됨)

 

 

  • 빌드가 성공적으로 완료된 모습
  • 인텔리제이 각 창들에 대한 기능 설명은 생략

 

  • 교재의 Spring Boot 버전은 3.1.0이므로 build.gradle로 가서 변경하고, 다시 gradle을 실행

 

헬로 월드! 출력하기

  • 스프링 부트 실행 (3가지 중 아무거나 클릭)
    • 상단 벌레 버튼 왼쪽 실행 버튼
    • 'public class FirstprojectApplication {'  왼쪽 실행 버튼
    • 'public static void main(String [] args) {' 왼쪽 실행 버튼

 

  • localhost:8080에 들어가 보면 서버가 잘 실행 됐음을 알 수 있다.
  • 현재 에러 페이지가 나타나는데 아직 웹 페이지를 만들지 않았기 때문이다.

 

  • src > main > resources에 static 디렉터리를 만들고, 그 안에 hello.html 파일을 생성한다.
  • <h1>헬로 월드!</h1> 을 입력한다.
  • SpringBoot를 재실행한다.

 

  • localhost:8080/hello.html로 이동하면 잘 나타난다.

1.3 웹 서비스의 동작 원리 이해하기

  • ‘헬로 월드!’가 출력되기까지 서버 내부에서 무슨 일이 일어날지 알아보자.
    • 먼저 웹 서비스의 동작 원리를 살펴보자

 

1.3.1 클라이언트-서버 구조

  • 웹 서비스는 클라이언트의 요청에 따른 서버의 응답으로 동작
    • 클라이언트 : 서비스를 사용하는 프로그램 또는 컴퓨터
    • 서버 : 서비스를 제공하는 프로그램 또는 컴퓨터
    ⇒ 요청에 응답하려면 당연히 서버가 실행 중이어야 함

 

1.3.2 localhost:8080/hello.html의 의미

  • localhost
    • ‘내 컴퓨터’를 나타내는 특별한 주소
    • IP 주소로 변경하면 127.0.0.1
  • 8080
    • 포트 번호를 의미
    • localhost가 ‘우리 집’이라면 8080은 방 번호
    • 스프링 부트가 실행될 때 Tomcat started on port(s): 8080 (http) with context path '’라고 떴는데, 웹 서버인 톰캣이 8080번에서 수행된다는 것
    • 겹치지 않는 선에서 얼마든지 변경 가능
  • hello.html
    • 웹 브라우저(클라이언트)에서 요청한 hello.html 파일을 스프링 부트(서버)가 응답으로 보여 줌. 즉, 서버에 요청하는 파일
    • 이렇게 파일을 직접 지정할 경우 스프링 부트는 기본적으로 src > main > resources > static 디렉터리에서 파일을 찾아 응답

🚀 1분 퀴즈

  1. localhost:8080/hello.html과 같이 웹사이트 주소에 파일명을 직접 명시할 경우 서버는 어떤 디렉터리에서 파일을 찾을까요?
    ⇒ src > main > resources > static

✅ 셀프 체크

  • localhost:8080/hellworld.html 만들기
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hell로 월드!</h1>
</body>
</html>

 

🏓 더 알아 볼 내용

1. 자바 빌드 도구 Maven과 Gradle

  • Maven(메이븐)과 Gradle(그레이들)은 빌드 관리 도구
    • 빌드란 소스코드를 컴파일해 실행할 수 있는 가공물로 변환하는 과정
    • 우리가 작성한 자바 코드(java)를 비롯해 프로젝트에 쓰인 각각의 파일 및 자원(.xml, jpa, jpg, properties) 등을 JVM(자바 가상 머신)이나 톰캣 같은 WAS(웹 애플리케이션 서버)가 인식할 수 있도록 패키징 하는 과정
  • 빌드 관리 도구
    • 개발자가 소스 코드를 작성해 애플리케이션 생성할 때는 여러 가지 외부 라이브러리를 가져다 사용
    • 이때 사용자가 직접 외부 라이브러리를 관리할 필요 없이 필요한 라이브러리들을 자동으로 관리해주는 도구
      • 초기의 자바 빌드 도구로는 아파치 앤트(Apache Ant)를 많이 사용. 하지만 스크립트 작성이 많고 라이브러리 간 의존 관리가 되지 않아 불편
      • 최근에는 Maven과 Gradle을 많이 사용

 

1-1) Maven

  • Maven은 아파치 재단에서 만든 오픈 소스 프로젝트 매니징 도구
    • 프로젝트 빌드, 리포트, 도큐먼트 작업 등을 자동화
  • 특징
    1. 미리 정해진 빌드 순서인 Lifecycle을 기반으로 작업을 수행
    2. 필요한 라이브러리를 pom.xml에 정의하면 해당 라이브러리 실행, 설치에 필요한 다른 라이브러리까지 관리하고 네트워크를 통해서 자동으로 다운
    3. 빌드에 대한 대부분의 책임을 각 플러그인에 위임합니다.
  • Maven의 LifeCycle
    • 총 3 단계를 거쳐 소스 코드를 빌드 한 후 배포

  • clean : 빌드 시 생성되었던 산출물을 삭제
  • build : 소스 코드를 컴파일하고, 관련 파일을 패키징 한 후, 테스트를 거쳐 원격 저장소에 배포
  • site : 프로젝트 문서화 작업을 진행

 

1-2) Gradle

  • Gradle은 Maven의 뒤를 이어 나온 프로젝트 구성 관리 및 범용 빌드 도구
  • 특징
    1. 필요한 라이브러리를 Maven의 pom.xml보다 훨씬 적은 코드 수로 간결하게 정의
    2. 필요한 라이브러리를 프로젝트 설정 주입 방식(Configuration Injection)으로 정의해 Maven의 상속 구조보다 재사용에 용이
    3. 빌드 스크립트를 xml이 아닌 JVM에서 동작하는 Groovy(그루비) 기반의 DSL(Domain Specific Language)을 사용해 작성. Groovy는 자바 문법과 유사해 자바 개발자가 쉽게 익힐 수 있고, Gradle Wrapper를 이용하면 Gradle이 설치되지 않은 시스템에서도 프로젝트를 빌드 가능

 

2. 스프링 vs 스프링 부트

  • 스프링(Spring)은 프레임워크 이며, 스프링 부트(Spring boot)는 스프링을 기반으로 한 도구
  • 스프링 부트는 스프링의 장점을 모두 가지고 있으며 다음과 같은 추가적인 기능을 제공
    • Auto-configuration 및 내장형 컨테이너 제공
    • 스프링 기반의 애플리케이션을 빠르게 만들 수 있도록 하는 다양한 starter 의존성 제공
    • 톰캣 기반의 편리한 배포

 

2-1) Auto-configuration

  • 스프링의 경우, configuration을 설정할 때 매우 길고 따분한 코드 작업이 필요
  • 스프링 부트의 경우, application.yml 혹은 application.properties 파일에 명세를 적으면 손쉽게 configuration을 관리 가능

 

2-2) 다양한 Starter 제공

  • 스프링에서 Spring web 의존성을 추가하려면 다음과 같은 xml 코드가 필요
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>5.3.5</version>
</dependency>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.3.5</version>
</dependency>
  • 하지만 스프링 부트의 경우 그루비 코드 한 줄이면 설정 가능
implementation 'org.springframework.boot:spring-boot-starter-web'

 

2-3) 편리한 배포

  • 스프링의 경우 war 파일을 톰캣에 직접 올려 배포해야 했음
  • 하지만 스프링 부트는 톰갯이 내장되어 있기 때문에 아주 손쉽게 jar 파일로 배포가 가능

🥕멘토 TIP

  • Spring.io 페이지에서 생성하는 프로젝트는 ‘스프링 부트 프로젝트’입니다.
  • Maven과 Gradle을 두고 고민하고 있다면 Gradle을 선택하는 것이 실패 없는 선택입니다.

🥕참고

 

728x90