수달이네 기술 블로그

0. SpringBoot 본문

웹/Spring

0. SpringBoot

슬픈 수달이 2025. 12. 4. 22:01

스프링(Spring)

  • 설정이 복잡함(xml, 환경설정 파일, 서버 배포 등)
  • 스프링부트에서는 설정의 복잡함을 최소화 시키고 자동설정(Auto Configuration)과내장서버(Embedded Server)로 단순화 시킴

스프링부트(Spring Boot)

  • 비즈니스 로직에 집중할 수 있다는 장점을 가지고 있다
  • 스프링 프레임워크를 더 쉽게 사용하도록 만들어진 도구

주요 특징

  • 내장 서버 지원 : tomcat, jetty, undertow 가 내장되어있어 war 배포없이 main()메소드로 실행가능
  • 자동 설정(Auto Configuration) : spring-boot-starter 종속성만 추가하면 DB, 웹, 보안 등 자동으로 기본설정
  • 스타터(Starter) 의존성 : 필요한 기능별로 미리 조합된 의존성 묶음 제공
  • 간단한 설정 파일 : 복잡한 xml 대신 application.yml 또는 application.properties로 설정
  • 운영 편의 기능(Actuator) : 어플리케이션의 상태 모니터링 가능(운영환경 모니터링/로그 수집에 강점)

구조

src/ └ main/ └ java/com/example/app └ ProjectApplication.java #메인 실행 클래스(@SpringBootApplication) └ controller/ #웹 요청 처리 └ service/ #비즈니스 로직 └ repository/ #db연동(Mybatis / JPA) └ domain/ #엔티티, DTO └ resources/ └ application.properties #설정파일(application.yml) └ static/ #정적리소스(css, js) └ templates/ #Thymeleaf HTML 뷰

개발도구

  1. 이클립스 STS와 인텔리제이

이클립스 STS(Spring Tools Suites) 인텔리제이 IDEA

  이클립스 STS(Spring Tools Suites) 인텔리제이 IDEA
라이선스/가격 무료(Open Source 기반) Coummunity무료(기본 java만)
Ultimate(유료)
Spring 통합 스프링 관련 마법
부트 대시보드
라이브템플릿 제공
spring인식, 자동 구성
빈 탐색
네비게이션 등 우수
성능/인덱싱 대형프로젝트에서 무거움 인덱싱, 코드분석이 빠르고 똑똑함
디버깅/리펙토링 기본 리펙토링/코드 인스펙션이 풍부함

관련 용어

디버깅 : 프로그래밍 과정 중 발생하는 오류나 비정상적으로 버그를 찾고 수정하는 것 중단점(BreakPoint) : 라인클릭 Step 흐름 : Step Over(현재 라인 실행), Step Into(메소드 내부로), Step Out(호출자 복귀), Resume(다음 중단점까지) HotSwap : 디버그 중 코드 바뀐 바이트코드 교체

리팩토링(Refactoring) : 코드의 동작은 그대로 유지하면서 내부 구조를 더 깔끔하고 이해하기 쉽게 다듬는 과정 바뀌는 부분 : 코드의 구조, 이름, 중복, 위치 등 정리 바뀌지지 않는 부분 : 프로그램의 기능/동작 결과는 그대로 유지함

빌드도구(Build Tool) : 소스코드에서 실행가능한 프로그램(앱, jar, war 등)을 자동으로 만들어주는 도구 개발자가 일일이 javac로 컴파일, 라이브러리 다운로드, jar 패키징을 하지 않아도 빌드도구가 알아서 처리해준다

대표적인 빌드 도구

Maven

  • xml 기반(pom.xml)
  • 전통적으로 가장 많이 사용됨
  • 구조와 규칙이 표준화되어있어 예측 가능
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependecy>

Gradle

  • DSL(Groovy/Kotlin) 스크립트 기반(build.gradle)
  • 캐시, 병렬 빌드하므로 속도 빠름
  • 복잡한 프로젝트에서 유연성이 강점
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
}

이클립스 STS 설치, 프로젝트 실행

JDK 17버전 이상 설치 확인: cmd > javac --version

1. STS다운로드

공식 사이트: https://spring.io/tools

아래 이클립스 버전 설치

2. 압축풀기

압축을 푼 해당 파일에서

해당 파일이 스프링 실행 파일이다.

해당 파일을 실행

3. create new spring starter project로 스프링 파일 생성

이후 스프링 부트 버전을 설정(너무 높으면 불안정)

웹 개발을 할것이므로 spring web선택후 실행

4. 위같이 스프링부트 어노테이션이 붙은 위 파일들이 생성된것을 확인 가능하다.

5. 파일탭의 Properties설정에서 위 설정들을 체크하고 apply한다.

6. windows탭의 installed jres를 검색한 후 자신이 사용할 jdk파일을 선택해준다.

아래 warning이 떴으면 우클릭 > quickfix를 누르면 알아서 수정된다.

Dependency

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencies블록: 스프링 부트 프로젝트에 필요한 라이브러리(의존성)을 선언하는 부분

  • gradle이 이 블록 안에 있는 선은을 보고 필요한 JAR파일들을 자동으로 다운로드 하여 프로젝트에 포함시킨다.

implementation: 어플리케이션 실행 시 필요한 라이브러리

  • spring-boot-starter-web:웹 어플리케이션을 만들 때 필수 패키지들을 포함한 starter 패키지
    • spring MVC, 내장 톰캣 서버, JSON 처리 jackson, 기타 Spring Web 기본 설정들

testImplementation: 테스트 코드에서 필요할 때만 적용되는 라이브러리

  • spring-boot-starter-test: 스프링부트에서 테스트를 쉽게 하기 위한 패키지
    • JUnit 5(테스트 프레임워크), Mockito(Mock테스트 라이브러리), AssertJ, Hamcrest(테스트용 assertion), Spring Test(스프링 컨텍스트 기반 테스트 지원

testRuntimeOnly: 테스트 실행 단계에서만 로딩되는 라이브러리

  • junit-platform-launcher: JUnit 테스트를 실제로 실행하기 위한 런처
    • 테스트코드는 JUnit 5를 사용해 작성되는데 실제 실행할 때 JUnit을 구동하는 역할을 하는 라이브러리

DevelopmentOnly

CompilerOnly

AnnotationProcessor등이 있다.

Controller

package com.example.first;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller()	
public class HelloController {
	
	@GetMapping("/hello")		
	@ResponseBody		
	public String Hello() {
		return "Hello";
	}

}

@Controller : HelloController 해당 파일이 컨트롤러의 기능을 수행하는 것을 알려준다.

@GetMapping(”/hello”): 클라이언트의 요청으로 hello메소드가 실행됨을 알려준다.

  • HTTP GET요청을 특정 메소드와 연결하기 위한 어노테이션
  • /hello같은 URL을 이 메서도와 매핑시키는 역할
  • 브라우저에서 http://localhost:8080/hello로 접속하게 되면 스프링이 hello()메소드를 찾아서 실행한다.

@ResponseBody: hello메소드의 출력값 그대로 리턴할 것임을 알려준다.(return값을 그대로 뷰 응답으로 사용)

  • 원래는 없으면 해당 뷰(jsp, Thymeleaf템플릿)를 찾는다.
  • 있기 때문에 해당 리턴값을 HTTP 응답 바디(Body)에 보내라고 스프링에게 알려주는것.

위 코드 흐름

  1. 클라이언트가 /hello로 GET요청
  2. 스프링이 hello()메서드를 실행
  3. “Hello World” 리턴
  4. 스프링이 이 문자열을 HTTP응답 바디에 담아 전송
  5. 브라우저 화면에 그냥 Hello World글자만 보이게 됨

상세 흐름

  1. 사용자가 브라우저에서 http://localhost:8888/hello 입력
  2. 스프링부트 내장 톰캣이 요청을 받고 DispatcherServlet에게 전달
  3. DispatcherServlet이 URL /hello, HTTP메소드 GET을 보고
  4. HelloController의 hello()메소드(@GetMapping(”/hello”)로 연결
  5. hello()메소드 실행 → “Hello World”리턴
  6. @ReponseBody 때문에 이 문자열이 그대로 HTTP 응답 바디로 전송
  7. 브라우저 화면에 Hello World 출력

실무에선

@controller와 @ResponseBody를 따로 썼지만, 실무에선 @RestController를 사용한다.

실행

application properties에서

spring.application.name=first
server.port = 9090

서버 포트를 만들어 저장해줌

파일 우클릭 → Run As→Spring Boot App실행

  .   ____          _            __ _ _
 /\\\\ / ___'_ __ _ _(_)_ __  __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
 \\\\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\\__, | / / / /
 =========|_|==============|___/=/_/_/_/

[32m :: Spring Boot :: [39m             [2m (v3.4.12)[0;39m

[2m2025-12-04T21:45:12.546+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mcom.example.first.FirstApplication      [0;39m [2m:[0;39m Starting FirstApplication using Java 21.0.9 with PID 2208 (C:\\0.MyLab\\SpringBoot\\workspace\\first\\bin\\main started by suche in C:\\0.MyLab\\SpringBoot\\workspace\\first)
[2m2025-12-04T21:45:12.547+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mcom.example.first.FirstApplication      [0;39m [2m:[0;39m No active profile set, falling back to 1 default profile: "default"
[2m2025-12-04T21:45:12.980+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mo.s.b.w.embedded.tomcat.TomcatWebServer [0;39m [2m:[0;39m Tomcat initialized with port 9090 (http)
[2m2025-12-04T21:45:12.989+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mo.apache.catalina.core.StandardService  [0;39m [2m:[0;39m Starting service [Tomcat]
[2m2025-12-04T21:45:12.989+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mo.apache.catalina.core.StandardEngine   [0;39m [2m:[0;39m Starting Servlet engine: [Apache Tomcat/10.1.49]
[2m2025-12-04T21:45:13.018+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mo.a.c.c.C.[Tomcat].[localhost].[/]      [0;39m [2m:[0;39m Initializing Spring embedded WebApplicationContext
[2m2025-12-04T21:45:13.018+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mw.s.c.ServletWebServerApplicationContext[0;39m [2m:[0;39m Root WebApplicationContext: initialization completed in 449 ms
[2m2025-12-04T21:45:13.220+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mo.s.b.w.embedded.tomcat.TomcatWebServer [0;39m [2m:[0;39m Tomcat started on port 9090 (http) with context path '/'
[2m2025-12-04T21:45:13.224+09:00[0;39m [32m INFO[0;39m [35m2208[0;39m [2m--- [first] [           main] [0;39m[36mcom.example.first.FirstApplication      [0;39m [2m:[0;39m Started FirstApplication in 0.917 seconds (process running for 1.323)

위와 같은 반응이 나오면 됨(started라고 로그가 나와야함)

이후 내가 만든 로컬호스트 주소

위에서 만든 것은 http://localhost:9090/hello로 설정한다.

  • 그러나 지금은 파일을 변경하더라도 서버 브라우저 환경에서 반영되지 않는다. → devtools설치해야함.

다시 해보려고 해도 이미 시작되어있기 때문에 안됨.

  • 여기서 (Re)start를 눌러주면 됨.
  • 중지는 Stop!

' > Spring' 카테고리의 다른 글

3. MVC패턴을 이용한 로그인 회원가입 구  (1) 2025.12.12
2. Spring으로 MVC패턴 구축하기1  (0) 2025.12.09
1. SpringBoot 기초  (0) 2025.12.08