
스프링 프레임워크의 확장인 오픈소스 프레임워크이다.
스프링은 XML 환경 구성과 종속성 설정이 필요했으나, 스프링 부트는 자동 설정 기능을 제공하여 쉽고 빠르게 개발할 수 있다.
① 환경 설정 자동화
- 실행에 필요한 환경을 자동으로 설정한다.
② 종속성 관리 자동화
- 스타터(Starter) 종속성을 이용하여 라이브러리 의존성을 간단히 처리한다.
③ 설정 파일 외부화
- 설정 XML 파일을 외부화할 수 있어 다양한 환경에서 작동할 수 있다.
④ 라이브러리 버전 관리 자동화
- 스프링 라이브러리 버전을 자동으로 관리한다. build.gradle에 스프링 부트 버전을 설정하면 의존 관계 라이브러리도 관리한다.
⑤ 독립형 애플리케이션 생성
- 내장된 톰캣이 포함된 실행 가능한 JAR로 애플리케이션을 패키징하여 단독으로 실행이 가능한 스프링 애플리케이션을 생성할 수 있다.
⑥ 프로덕션 지원
- 애플리케이션 모니터링을 위한 통계, 상태점검을 제공한다.

① 스프링
- 자바를 기반으로 웹 애플리케이션을 개발하기 위한 오픈 소스 프레임워크이다.
- 성능이 뛰어나고 테스트가 쉬우며 재사용 가능하다.
② 스프링 MVC
- MVC 패턴을 적용할 수 있도록 스프링에서 제공하는 프레임워크이다.
☞ MVC는 Model, View, Controller 이다.
- 스프링을 기반으로 한다.
③ 스프링 부트
- 스프링 위에 구축되어서 스프링의 모든 기능은 제공하면서 설정은 자동화한 프레임워크이다.
- 스프링을 기반으로 한다.
개발 환경을 구성하기 위해서 3가지를 설치해야 한다.
① 자바 개발 환경 (JDK)
JDK 17 이상을 권장한다. 오라클 사이트에서 다운 후, 환경 변수를 설정한다.
Oracle 한국 | 클라우드 애플리케이션 및 클라우드 플랫폼
Oracle은 포괄적인 통합 클라우드 애플리케이션 및 플랫폼 서비스 스택을 제공합니다.
www.oracle.com
② 통합 개발 환경 (Eclipse, IntelliJ 등)
본문에서는 이클립스를 사용한다. 이클립스 사이트에서 다운받을 수 있다.
Eclipse Foundation | Powering Open Innovation
The Eclipse Foundation empowers our global community with a mature, scalable, and business-friendly environment that drives open source collaboration and …
www.eclipse.org
③ 스프링 개발 도구 (STS - Spring Tool Suite)
이클립스 기반의 플러그인 도구이다. 스프링 프로젝트 템플릿이 제공되어 프로젝트 디렉터리 구조를 신속히 만들 수 있다.
이클립스의 마켓플레이스에서 다운받을 수 있다.

① Src/main/java
- 자바 파일을 관리하는 폴더이다.
- 메인 파일(프로젝트 이름+Application.java)이 있다.
- BookMarket 프로젝트에서는 BookMarket Application.java가 메인 파일이다.
② Src/main/resources
- 웹 파일을 관리하는 폴더이다.
- 동적 파일(templates), 정적 파일(static), 환경설정 파일(application.properties)을 관리하는 파일이 내부에 존재한다.
③ Build.gradle
- 빌드 정보를 정의하는 파일이다.
- Gradle이 사용하는 환경 파일(프로젝트 기본 설정, 라이브러리 의존성, 플러그인, 라이브러리 저장소 등)을 설정한다.
유연성, 확장성, 재사용성을 위해 계층적 구조를 적용한다.
스프링 부트의 계층적 구조는 퍼시스턴스 계층, 비지니스 계층, 프레젠테이션 계층으로 이루어져있다.

도서 쇼핑몰 예제를 통해 각 계층의 개념과 구현 방식을 알아보겠다.

1) 도메인 객체
- 데이터 모델로 객체 정보(고객 정보, 배송 주소, 주문 항목 등)를 저장한다.
- 속성(필드)를 정의하고 Setter(), Getter() 메서드를 추가해야 한다.
// Book.java
public class Book {
// 1. 멤버 변수 선언
private String bookId;
private String name;
private BigDecimal unitPrice;
private String author;
private String publisher;
private String category;
private long unitsInStock;
private String releaseDate;
private String condition;
// 2. 기본 생성자
public Book() {
super();
}
// 3. Setter(), Getter() 메서드 추가
public String getBookId() {
return bookId;
}
public void setBookId(String bookId) {
this.bookId = bookId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(BigDecimal unitPrice) {
this.unitPrice = unitPrice;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public long getUnitsInStock() {
return unitsInStock;
}
public void setUnitsInStock(long unitsInStock) {
this.unitsInStock = unitsInStock;
}
public String getReleaseDate() {
return releaseDate;
}
public void setReleaseDate(String releaseDate) {
this.releaseDate = releaseDate;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
}
2) 퍼시스턴스 계층
- 데이터 액세스 계층으로 데이터 베이스나 파일에 접근한다.
- @Repository 을 사용하여 저장소 객체임을 나타낸다.
// BookRepository.java
// interface만 선언
public interface BookRepository {
// 모든 도서 목록을 가져오는 기능
List<Book> getAllBookList();
}
// BookRepositoryImpl.java
@Repository // 저장소 객체로 인식
public class BookRepositoryImpl implements BookRepository {
// 도서 목록을 저장하는 ArrayList -> 이 예시에서는 임시 DB처럼 사용
private List<Book> listOfBooks = new ArrayList<Book>();
public BookRepositoryImpl() {
Book book1 = new Book();
book1.setBookId("ISBN1234");
book1.setName ("자바스크립트");
book1.setUnitPrice(new BigDecimal(30000));
book1.setAuthor("조현영");
book1.setDescription("자바스크립트의 기초부터 심화까지 핵심 문법을 학습한 후 12가지 프로그램을 만들며 학습한 내용을 확인할 수 있습니다. 문법 학습과 실습이 적절히 섞여 있어 프로그램을 만드는 방법을 재미있게 익힐 수 있습니다.");
book1.setPublisher("길벗");
book1.setCategory("IT전문서");
book1.setUnitsInStock(1000);
book1.setReleaseDate("2024/02/20");
Book book2 = new Book();
book2.setBookId("ISBN1235");
book2.setName ("파이썬의 정석");
book2.setUnitPrice(new BigDecimal(29800));
book2.setAuthor("조용주,임좌상");
book2.setDescription("4차 산업혁명의 핵심인 머신러닝, 사물 인터넷(IoT), 데이터 분석 등 다양한 분야에 활용되는 직관적이고 간결한 문법의 파이썬 프로그래밍 언어를 최신 트렌드에 맞게 예제 중심으로 학습할 수 있습니다.");
book2.setPublisher("길벗");
book2.setPublisher("길벗");
book2.setCategory("IT교육교재");
book2.setUnitsInStock(1000);
book2.setReleaseDate("2023/01/10");
Book book3 = new Book();
book3.setBookId("ISBN1236");
book3.setName ("안드로이드 프로그래밍");
book3.setUnitPrice(new BigDecimal(36000));
book3.setAuthor("송미영");
book3.setDescription("안드로이드의 기본 개념을 체계적으로 익히고, 이를 실습 예제를 통해 익힙니다. 기본 개념과 사용법을 스스로 실전에 적용하는 방법을 학습한 다음 실습 예제와 응용 예제를 통해 실전 프로젝트 응용력을 키웁니다.");
book3.setPublisher("길벗");
book3.setCategory("IT교육교재");
book3.setUnitsInStock(1000);
book3.setReleaseDate("2023/06/30");
listOfBooks.add(book1);
listOfBooks.add(book2);
listOfBooks.add(book3);
}
// listOfBooks에 있는 모든 도서 목록 가져오기
public List<Book> getAllBookList() {
return listOfBooks;
}
}
3) 비지니스 계층 (서비스 계층)
- 포괄적인 서비스를 표현하는 계층으로 프레젠테이션 계층과 퍼시스턴스 계층을 연결한다.
- @Service 를 사용하여 서비스 객체임을 나타낸다.
// BookService.java
// interface만 선언
public interface BookService {
List<Book> getAllBookList();
}
// BookServiceImpl.java
@Service // 서비스 객체로 인식
public class BookServiceImpl implements BookService {
// BookRepository(퍼시스턴스 계층)을 주입받아 사용
@Autowired
private BookRepository bookRepository;
// BookRepository 인스페이스에 저장된 모든 도서목록 가져옴
public List<Book> getAllBookList() {
return bookRepository.getAllBookList();
}
}
☞ 참고) @Autowired 추가 설명
- DI(의존성 주입)을 하는 어노테이션이다.
- 스프링 컨테이너에 빈(Bean)을 모두 등록한 후, 빈들 사이에 필요한 의존 관계를 자동으로 연결한다.
※ 빈(Bean) : new 키워드로 생성한 객체가 아닌, 스프링 컨테이너가 관리하는 객체 (@Component 어노테이션이 있는 객체)
- 생성자, 수정자(setter), 필드를 통해 구현할 수 있다.
- 예시에서는 필드 주입을 사용했으나, 보통 생성자 주입을 사용한다.
// 생성자 주입 예시
@Service
public class BookServiceImpl implements BookService {
private final BookRepository bookRepository; // final 필드로 선언 -> 불변 보장
// 생성자 주입 방식
@Autowired // 생성자가 하나면 @Autowired 생략 가능
public BookServiceImpl(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@Override
public List<Book> getAllBookList() {
return bookRepository.getAllBookList();
}
}
4) 프레젠테이션 계층
- MVC를 담당하는 계층이다.
☞ MVC는 Model, View, Controller 이다.
- @Controller 를 사용하여 Controller임을 나타내고, Thymeleaf 템플릿 엔진을 사용하여 View임을 나타낸다.
① Controller
// BookController.java
@Controller // controller로 인식
public class BookController {
// BookService(비지니스 계층)을 주입받아 사용
@Autowired
private BookService bookService;
// "/books" 주소로 GET 요청을 보내면 실행
@RequestMapping(value = "/books", method = RequestMethod.GET)
public String requestBookList(Model model) {
List<Book> list = bookService.getAllBookList(); // BookService(비지니스 계층)에서 모든 도서 목록을 가져옴
model.addAttribute("bookList", list); // 가져온 데이터를 booklist라는 이름으로 view에 전달
return "books"; // books.html로 이동
}
}
② View
// books.html
<html>
<head>
<meta charset="UTF-8">
<title>도서 목록</title>
// 부트스트랩에서 제공하는 스타일시트 적용
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<div class="container py-4">
<header class="pb-3 mb-4 border-bottom">
<a href="/welcome.html" class="d-flex align-items-center text-body-emphasis text-decoration-none">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="currentColor" class="bi bi-book-half me-2" viewBox="0 0 16 16">
<path d="M8.5 2.687c.654-.689 1.782-.886 3.112-.752 1.234.124 2.503.523 3.388.893v9.923c-.918-.35-2.107-.692-3.287-.81-1.094-.111-2.278-.039-3.213.492zM8 1.783C7.015.936 5.587.81 4.287.94c-1.514.153-3.042.672-3.994 1.105A.5.5 0 0 0 0 2.5v11a.5.5 0 0 0 .707.455c.882-.4 2.303-.881 3.68-1.02 1.409-.142 2.59.087 3.223.877a.5.5 0 0 0 .78 0c.633-.79 1.814-1.019 3.222-.877 1.378.139 2.8.62 3.681 1.02A.5.5 0 0 0 16 13.5v-11a.5.5 0 0 0-.293-.455c-.952-.433-2.48-.952-3.994-1.105C10.413.809 8.985.936 8 1.783"/>
</svg>
<span class="fs-4">BookMarket</span>
</a>
</header>
<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">도서 목록</h1>
<p class="col-md-8 fs-4">BookMarket</p>
</div>
</div>
<div class="row align-items-md-stretch text-center">
// Controller에서 전달받은 bookList를 돌면서 도서 정보를 화면에 출력
<div class="col-md-4" th:each="book:${bookList}">
<h3 th:text ="${book.name}"></h3>
<p th:text = "${book.author}">
<p th:text = "${book.publisher} + '|'+ ${book.releaseDate}">
<p align="left" th:text = "${book.description}">
<p th:text = "${book.unitPrice}">원
</div>
</div>
<footer class="pt-3 mt-4 text-body-secondary border-top">
<span class="text-body-secondary"> © BookMarket</span>
</footer>
</div>
</body>
</html>
☞ 참고) 부트스트랩(Bootstrap) 추가 설명
- 웹 프론트엔드 오픈 소스 프레임워크이다. UI 컴포넌트(HTML, CSS, JS)가 모여있어 깔끔한 형태의 UI/UX를 구성할 수 있다.
- 아래의 코드로 부트스트랩 CSS를 불러올 수 있다.
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
☞ 참고) 결과 실행
- http://localhost:8080/books 접속하면 결과 확인 가능
1. ( )는 기존의 스프링 프레임워크를 기반으로 스프링의 모든 기능을 제공하면서 스프링 설정은 자동화한 프레임워크다.
2. Src/main/resources/static 폴더에 hello.html 파일을 생성했다면, 결과를 확인하기 위해서 접속해야 하는 url은?
3. 도메인 객체는 ( )와 ( ) 메서드를 추가해야 한다.
4. 데이터베이스나 파일에 접근하여 데이터를 처리하는 곳으로 데이터 액세스 계층인 곳은?
5. 애플리케이션이 제공하는 포괄적인 서비스를 표현하는 계층은?
답:
1. 스프링 부트
2. http://localhost:8080/hello.html
3. Setting / Getting
4. 퍼시스턴스 계층
5. 비즈니스 계층
1.
답: private BookRepository bookRepository;
@Service
public class BookServiceImpl implements BookService {
@Autowired
// 여기에 코드 입력
@Override
public List<Book> getAllBookList() {
return bookRepository.getAllBookList();
}
}
2.
답: List<Book> list = bookService.getAllBookList();
@Controller
public class BookController {
@Autowired
private BookService bookService;
@RequestMapping(value = "/books", method = RequestMethod.GET)
public String requestBookList(Model model) {
// 여기에 코드 입력
model.addAttribute("bookList", list);
return "books";
}
}
출처: 송미영,『 스프링 부트 완전 정복 』, 길벗(2024), p9-83.
Coner Spring1
Editor: soyee
| [Spring 1팀] 8장. 다국어 처리 (0) | 2025.11.21 |
|---|---|
| [Spring 1팀] 7장. 파일 업로드 처리 (0) | 2025.11.14 |
| [Spring 1팀] 6장. 폼 태그 (1) | 2025.11.07 |
| [Spring 1팀] 5장. 요청 처리 메서드의 파라미터 유형 (0) | 2025.10.31 |
| [Spring 1팀] 4장. 컨트롤러 구현 (0) | 2025.10.10 |