기록방
1장 : 스프링 부트 시작하기 본문
길벗 IT도서에서 주관하는 코딩 자율학습단 8기 : Spring Boot 파트에 참여한 기록입니다 [ 목록 ]
스프링 부트는 자바 기반 웹 서비스를 더욱 쉽고 편리하게 만들기 위해 개발된 도구. 스프링 부트란 무엇인지 알아보고 스프링 부트 개발 환경을 설정 후 “헬로 월드!”를 출력해 보자. 그리고 그 과정에서 웹 서비스의 동작 원리도 함께 알아보자.
1.1 스프링 부트란
- **스프링 부트(Spring Boot)**는 자바 웹 프로그램을 더욱 쉽고 빠르게 만들기 위한 도구
- 자바 웹 프로그램을 만들기 위한 기능과 도구가 모여있음
💡 스프링과 스프링 부트는 사실 새로운 기술이라기 보단 스프링 프레임워크(Spring Framework)를 개선한 것.
1. 개발 환경 설정 간소화 : 스프링은 버전에 따라 동작하는 외부 라이브러리를 일일이 찾아 연동. 스프링 부트는 미리 설정된 스타터 프로젝트로 외부 라이브러리를 최적화해 제공
2. 웹 애플리케이션 서버를 내장 : 스프링 부트는 내부에 웹 애플리케이션 서버(WAS, Web Application Server)인 톰캣을 가지고 있음. 따라서 웹 서비스를 jar파일로 간편하게 배포 가능
1.2 스프링 부트 개발 환경 설정하기
스프링 부트의 개발 환경 설정은 3단계를 걸친다
- JDK(Java Development Kit, 자바 개발 도구) 설치
- 자바 코드의 번역과 실행을 담당하는 자바 개발 도구
- IDE(Integrated Development Environment, 통합 개발 환경) 준비
- 인텔리제이, 이클립스 등
- 스프링 프로젝트 만들어서 “헬로 월드!” 띄우기
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분 퀴즈
- 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은 아파치 재단에서 만든 오픈 소스 프로젝트 매니징 도구
- 프로젝트 빌드, 리포트, 도큐먼트 작업 등을 자동화
- 특징
- 미리 정해진 빌드 순서인 Lifecycle을 기반으로 작업을 수행
- 필요한 라이브러리를 pom.xml에 정의하면 해당 라이브러리 실행, 설치에 필요한 다른 라이브러리까지 관리하고 네트워크를 통해서 자동으로 다운
- 빌드에 대한 대부분의 책임을 각 플러그인에 위임합니다.
- Maven의 LifeCycle
- 총 3 단계를 거쳐 소스 코드를 빌드 한 후 배포
- clean : 빌드 시 생성되었던 산출물을 삭제
- build : 소스 코드를 컴파일하고, 관련 파일을 패키징 한 후, 테스트를 거쳐 원격 저장소에 배포
- site : 프로젝트 문서화 작업을 진행
1-2) Gradle
- Gradle은 Maven의 뒤를 이어 나온 프로젝트 구성 관리 및 범용 빌드 도구
- 특징
- 필요한 라이브러리를 Maven의 pom.xml보다 훨씬 적은 코드 수로 간결하게 정의
- 필요한 라이브러리를 프로젝트 설정 주입 방식(Configuration Injection)으로 정의해 Maven의 상속 구조보다 재사용에 용이
- 빌드 스크립트를 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
'FrameWork > Spring' 카테고리의 다른 글
3장 : 게시판 만들고 새 글 작성하기: Create (2) | 2024.03.17 |
---|---|
2장 : MVC 패턴 이해와 실습 (0) | 2024.03.10 |
코딩 자율학습단 8기 : 스프링 부트3 (0) | 2024.03.06 |
Bug Report : Errors 객체를 ResponseEntity body에 담아서 JSON 형태로 리턴 (0) | 2023.11.14 |
스프링 JPA? MyBatis? Hibernate? (5) | 2023.01.27 |