25. 스프링 부트 사용하기

25. 스프링 부트 사용하기

스프링 부트의 개념과 특징, 타임리프, 그레이들, 마이바티스 연동 방법을 다룬다.


1. 스프링 부트란?

스프링 프레임워크로 개발하려면 톰캣 설치부터 XML 설정까지 복잡한 과정을 거쳐야 한다. **스프링 부트(Spring Boot)**는 이런 설정을 자동화하여 일반 자바 애플리케이션처럼 웹 애플리케이션을 개발할 수 있게 해준다.

스프링 프레임워크 vs 스프링 부트

항목스프링 프레임워크스프링 부트
서버외부 톰캣 별도 설치톰캣 내장 (별도 설치 불필요)
설정 방식XML 기반 수동 설정자동 설정 (@SpringBootApplication)
의존성 관리pom.xml에 직접 명시스타터(starter)로 자동 관리
실행 방식WAR 배포 → 톰캣 실행main() 메서드로 단독 실행
빌드 도구주로 메이븐메이븐 또는 그레이들

스프링 부트의 특징

  • 일반 응용 프로그램을 단독 실행하는 수준으로 웹 애플리케이션을 구현할 수 있다
  • 톰캣, Jetty, Undertow 같은 서버가 내장되어 별도 설치가 필요 없다
  • XML 기반 설정 없이 환경 설정을 자동화할 수 있다
  • 의존성 관리를 쉽고 자동으로 할 수 있다

스프링 부트 프로젝트 구조

프로젝트/
├── src/main/java/
│   └── com.example.demo/
│       ├── Application.java
│       └── ServletInitializer
│             .java
├── src/main/resources/
│   ├── application
│   │     .properties
│   ├── static/
│   └── templates/
└── pom.xml (또는 build.gradle)

Application.java

스프링 부트 프로젝트는 main() 메서드를 시작점으로 실행한다.

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(
            Application.class, args);
    }
}

@SpringBootApplication은 다음 세 가지를 합친 것이다.

애너테이션역할
@SpringBootConfiguration스프링 부트 설정 클래스
@EnableAutoConfiguration클래스패스 기반 자동 설정
@ComponentScan컴포넌트 자동 탐색

실행 흐름

  main() 호출
       │
       ▼
┌────────────────┐
│ SpringBoot 시작 │
│ 자동 설정 로드   │
└───────┬────────┘
        │
        ▼
┌────────────────┐
│ 내장 톰캣 시작   │
│ (포트 8080)     │
└───────┬────────┘
        │
        ▼
  웹 요청 수신 대기

ServletInitializer

ServletInitializer 클래스는 SpringBootServletInitializer를 상속받아 web.xml 없이 톰캣에서 실행할 수 있게 해준다.

public class ServletInitializer
    extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder
        configure(
            SpringApplicationBuilder app) {
        return app.sources(
            Application.class);
    }
}
내장 톰캣으로 실행할 때는 Application.main()이 진입점이고, 외부 톰캣(WAR 배포)으로 실행할 때는 ServletInitializer가 진입점이 된다.

2. 타임리프(Thymeleaf)

JSP는 화면 기능이 복잡해지면서 문법이 난해해졌고, 스프링과의 연동도 불편해졌다. 스프링 부트에서는 **타임리프(Thymeleaf)**를 표준 템플릿 엔진으로 지정하였다.

JSP vs 타임리프

항목JSP타임리프
위치webapp/WEB-INF/views/resources/templates/
확장자.jsp.html
브라우저 직접 열기불가 (서버 필수)가능 (Natural Template)
서버 의존성서블릿 컨테이너 필요독립 실행 가능
문법<%= %>, JSTLth:* 속성

타임리프 기본 문법

<!DOCTYPE html>
<html xmlns:th=
    "http://www.thymeleaf.org">
<head>
    <title th:text="${title}">
        기본 제목
    </title>
</head>
<body>
    <!-- 텍스트 출력 -->
    <p th:text="${message}">
        기본 메시지
    </p>

    <!-- 반복문 -->
    <tr th:each="member : ${members}">
        <td th:text="${member.name}">
            이름
        </td>
    </tr>

    <!-- 조건문 -->
    <p th:if="${user != null}">
        환영합니다!
    </p>
</body>
</html>

주요 th 속성

속성설명예시
th:text텍스트 출력th:text="${name}"
th:each반복th:each="item : ${list}"
th:if조건부 표시th:if="${condition}"
th:href링크 URLth:href="@{/path}"
th:action폼 전송 경로th:action="@{/submit}"
th:value입력 값th:value="${data}"

의존성 추가

<dependency>
    <groupId>
        org.springframework.boot
    </groupId>
    <artifactId>
        spring-boot-starter-thymeleaf
    </artifactId>
</dependency>
타임리프는 HTML 파일 자체가 유효한 HTML이므로 서버 없이도 브라우저에서 디자인을 확인할 수 있다. 이를 Natural Template이라 한다.

3. 그레이들(Gradle)

그레이들은 메이븐의 단점을 보완한 최신 빌드 도구다.

메이븐 vs 그레이들

항목메이븐그레이들
설정 파일pom.xmlbuild.gradle
설정 언어XML (정적)그루비/코틀린 스크립트 (동적)
빌드 속도보통빠름 (증분 빌드, 캐시)
유연성플러그인 의존스크립트로 기능 추가 가능
가독성장황함간결함

설정 파일 비교

메이븐 (pom.xml)

<dependencies>
    <dependency>
        <groupId>
            org.springframework.boot
        </groupId>
        <artifactId>
            spring-boot-starter-web
        </artifactId>
    </dependency>
</dependencies>

그레이들 (build.gradle)

dependencies {
    implementation
        'org.springframework.boot' +
        ':spring-boot-starter-web'
}
안드로이드 스튜디오는 그레이들을 기본 빌드 도구로 사용한다. 최근 스프링 부트 프로젝트도 그레이들 기반이 표준이 되고 있다.

4. 스프링 부트에서 마이바티스 사용하기

스프링 부트에서는 DAO 인터페이스에 @Mapper를 적용해 구현 클래스 없이 매퍼 파일의 SQL문을 바로 사용할 수 있다.

기존 스프링 vs 스프링 부트 마이바티스

  기존 스프링
  ┌──────────┐
  │ Service  │
  └────┬─────┘
       │ 호출
       ▼
  ┌──────────┐
  │ DAO 구현  │
  │ SqlSession│
  └────┬─────┘
       │ SQL 실행
       ▼
  ┌──────────┐
  │ Mapper XML│
  └──────────┘
  스프링 부트
  ┌──────────┐
  │ Service  │
  └────┬─────┘
       │ 호출
       ▼
  ┌──────────┐
  │ DAO 인터페이스│
  │ @Mapper   │
  └────┬─────┘
       │ 자동 매핑
       ▼
  ┌──────────┐
  │ Mapper XML│
  └──────────┘

DAO 인터페이스 작성

@Mapper
@Repository
public interface MemberDAO {

    // 매퍼 파일의 id가
    // selectAllMemberList인
    // SQL문을 호출한다.
    public List<MemberVO>
        selectAllMemberList()
        throws DataAccessException;
}

매퍼 XML

<mapper namespace=
    "com.example.dao.MemberDAO">

    <select id="selectAllMemberList"
        resultType="memberVO">
        SELECT * FROM t_member
        ORDER BY id
    </select>
</mapper>

application.properties 설정

# 데이터소스 설정
spring.datasource.driver-class-name=
    oracle.jdbc.driver.OracleDriver
spring.datasource.url=
    jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=scott
spring.datasource.password=tiger

# 마이바티스 설정
mybatis.mapper-locations=
    classpath:mappers/**/*.xml
mybatis.type-aliases-package=
    com.example.vo
기존 스프링에서는 SqlSession을 주입받아 DAO 구현 클래스를 만들어야 했다. 스프링 부트에서는 @Mapper만 적용하면 구현 클래스 없이 인터페이스 메서드 이름과 매퍼 XML의 id를 자동 매핑한다.

요약

개념한 줄 정리
스프링 부트내장 톰캣과 자동 설정으로 독립 실행 가능한 스프링
@SpringBootApplication설정 + 자동 설정 + 컴포넌트 스캔을 합친 애너테이션
타임리프스프링 부트 표준 템플릿 엔진 (Natural Template)
그레이들그루비 스크립트 기반 빌드 도구 (메이븐보다 간결·빠름)
@MapperDAO 인터페이스를 매퍼 XML과 자동 매핑
application.properties스프링 부트 설정 파일 (XML 대체)