| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 티스토리챌린지
- 웹 개발
- SQL
- #AwsCloudClubs
- 유니티 안드로이드 빌드
- CSS
- 주석 단축키
- react
- 유니티 모듈
- vscode
- 데이터베이스
- HeidiSQL
- 박스 모델
- #UMC #UMC10기 #UMC 블로그챌린지 #IT동아리
- 코드트리
- javascript
- GitHub
- 유니티 에디터
- 코드트리조별과제
- 코딩테스트
- 기술심화
- html
- 오블완
- 파이썬
- route53
- 학습회고
- 유니티
- 깃허브
- 깃허브뱃지
- 프론트엔드
- Today
- Total
Hello It's good to be back ^_^
[ECC-백엔드 5팀] 7주차 스터디 - 스프링 입문, 정적 콘텐츠, MVC, API 본문
범위: 섹션 1-3
실습: https://github.com/HongYeonLee/ECC-Backend-Study
GitHub - HongYeonLee/ECC-Backend-Study: ECC 51기 SS 백엔드 5팀 스터디 내용을 기록하는 레포지토리입니다
ECC 51기 SS 백엔드 5팀 스터디 내용을 기록하는 레포지토리입니다. Contribute to HongYeonLee/ECC-Backend-Study development by creating an account on GitHub.
github.com
개념 정리
Spring이란?
: 자바 기반의 강력한 웹 애플리케이션 개발을 위한 오픈소스 프레임워크
프레임워크란?
: 소프트웨어(ex.웹 애플리케이션)을 빠르게 편리하게 개발하기 위한 일종의 뼈대, 도구들의 모음
예를 들어 집을 짓기위해 처음부터 나무를 베고 돌을 캐와서 하나하나 짓는 것보다 미리 만들어진 시멘트, 철골들을 이용해서 짓는 것이 훨씬 편하고 빠를 것이다. 마찬가지로 순수 자바로만 웹 애플리케이션을 개발하려고 하면 굉장히 복잡하고 개발자가 해야 하는 것이 많다.
Spring boot란?
: 번거로운 설정 없이 간편하게 시작할 수 있는 Spring 프로젝트 템플릿
- Spring 설정이 복잡해서 초보자에겐 진입장벽이 큼. 그래서 등장한 것이 Spring Boot!
- Spring 프레임워크를 기반으로 하지만, 복잡한 XML 설정없이 어노테이션 기반으로 더 빠르고 직관적인 개발이 가능
1. 프로젝트 환경 설정
1.1 스프링 프로젝트 만들기
스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트를 생성한다

설정은 다음과 같이 한다.
- Project: Gradle - Groovy Project
- Language: Java
- Spring Boot: 괄호가 없는 순수 숫자만 있는 버전
- Group / Artifact: 임의로 설정
- Packaging: Jar
- Dependencies: Spring web, Thymeleaf (Add를 눌러서 추가)
* Thymeleaf - html 만들어주는 템플릿 엔진
설정을 마친 뒤 하단의 generate를 누르면 스프링 프로젝트 압축파일을 다운받을 수 있다.
압축 해제하고 해당 파일을 IntelliJ로 열어준다.

build.gradle 파일에서 프로젝트 설정을 볼 수있다.
Gradle 대신에 자바로 직접 실행하기

왼쪽 위 파일 → 설정

검색창에 gradle 입력 → 빌드, 실행, 배포 → 빌드 도구 → Gradle에서
다음을 사용하여 빌드 및 설정/다음을 사용하여 테스트 설정 값을 전부 IntelliJ IDEA로 바꿔준다.
이렇게 변경하면 자바로 바로 실행해서 실행속도가 더 빠르다
스프링부트 메인 실행하기

src → main → java → 본인 폴더 → 본인 SpringApplicaiton 파일에서 메인 함수 옆의 실행 아이콘을 누른다.

...main() 실행

콘솔에 이렇게 나오면 성공이다.
이제 웹 브라우저 창에 localhost:8080 입력해서 이동한다.

이렇게 나오면 실행 성공.
1.2 라이브러리 살펴보기
gradle은 의존관계를 가진 모든 라이브러리를 import해온다.
ex. 스프링 관련 라이브러리 (spring web)을 쓰게 되면 spring core 라이브러리까지 import 한다
스프링 부트 라이브러리
- spring-boot-starter-web
- spring-boot-starter-tomcat: 톰캣 (웹서버)
- sptring-webmvc: 스프링 웹 MVC
- spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
- spring-boot-stater(공통): 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-stater-logging
- logback, slf4j
- spring-boot
테스트 라이브러리
- spring-boot-starter-test
- junit: 테스트 프레임워크
- mockito: 목 라이브러리
- assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test: 스프링 통합 테스트 지원
1.3 View 환경 설정
웰컴 페이지 만들기 (도메인을 입력했을 때 나오는 가장 첫번째 페이지)
src/main/java/본인스프링폴더/controller 패키지 만들기
해당 패키지에 만들고자하는 파일의 controller 만들기

// HelloController 클래스
package hongyeon_spring.controller;
import org.springframework.ui.Model;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("hello") // 웹 브라우저에 /hello가 들어오면 밑의 함수를 실행
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello"; // resources/templates/hello.html 렌더링 해라. 모델을 넘기면서
}
}
- @GetMapping("도메인") - 웹 브라우저에 해당 도메인이 입력되면 바로 밑의 함수를 실행한다
- Model - 스프링부트에서 만들어주는 것으로 나중에 viewResolver에게 전달됨
- model.addAttribute("data", "hello!!") - 모델에 키 data와 값 hello!! 전달
- return hello - 위에서 만든 모델을 전달하면서 hello.html 파일 찾아서 렌더링

resources/templates 에 만들고자 하는 html파일 만들기
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
아까 전달받은 model의 키data의 값을 넣어서 렌더링한다.
1.4. 빌드하고 실행하기
cd 본인의_스프링폴더
./gradlew build
cd build
cd libs
ls -arlth후 SNAPSHOT.jar로 끝나는 파일명 복사
java -jar 복사한_파일명




2. 스프링 웹 개발 기초
2.1 정적콘텐츠
: 서버에서 별 다른 동작 없이 파일을 그대로 클라이언트(웹 브라우저)에 렌더링하는 것
resources/static에 정적 파일을 만든다.
// hello-static.html 파일
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
실행후 웹 브라우저에 localhost:8080/hello-static.html을 입력하면 화면에 바로 렌더링된다.

웹 브라우저가 url을 전달하면 스프링은 우선 해당 url에 대한 컨트롤러가 있는지 찾는다.
없을 경우 static 폴더에서 해당 파일을 찾는다.
찾으면 바로 렌더링한다.
2.2 MVC와 템플릿 엔진
: 서버에서 변형을 해서 HTML을 바꾸어 클라이언트에 렌더링하는 것
M: model
V: view
C: controller
이 세개를 전부 분리해서 개발하는 방식을 MVC라고 한다.
view는 화면을 그리는 것에만 집중하고 controller는 비즈니스 로직이나 서버와 관련된 모든 내부 처리를 한뒤 model에 그 내용을 담아 화면에 넘겨준다.
package hongyeon_spring.controller;
import org.springframework.ui.Model;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("hello") // 웹 브라우저에 /hello가 들어오면 밑의 함수를 실행
public String hello(Model model) {
model.addAttribute("data", "hello!!"); //키 data, 값 hello!!
return "hello"; // resources/templates/hello.html 렌더링 해라. 모델을 넘기면서
}
@GetMapping("hello-mvc") // 웹 브라우저에 /hello-mvc가 들어오면 밑의 함수를 실행
//외부로부터 입력값 name을 받음 (@RequestParam 이용)
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name); //키 name, 값 name
return "hello-template"; // resources/templates/hello-template.html에 모델 넘기면서 렌더링
}
}
- @RequestParam("값") - 외부로부터 입력값을 받아서 함수에 전달
이렇게 한 후 서버를 열면

이렇게 에러가 뜨는데 이유는
Required request parameter 'name' for method parameter type String is not present]
name값이 없다고 나온다. helloMvc함수에서 매개변수로 name을 받는데 전달해준 값이 없기 때문이다. 이는 @RequestParam("값") 어노테이션의 인자로 required가 있는데 디폴트값이 true이기 때문에 항상 값을 넘겨줘야 한다.
그래서 웹 브라우저에 url을 http://localhost:8080/hello-mvc?name=홍연 이런식으로 넘겨주게 되면

화면이 원하는대로 나온다
동작방식

- 웹 브라우저가 서버에 hello-mvc를 요청
- 내장 톰켓 서버는 해당 요청을 스프링에게 전달
- 스프링은 해당 요청이 helloController 클래스에 메세드가 매핑되있는 걸 보고 해당 메서드를 호출
- 모델(name 속성)과 함께 hello-template 리턴
- 뷰 리졸버가 templates에서 같은 이름의 html 파일을 찾아서 Thymleaf 템플릿 엔진에 렌더링 해달라고 넘김
- Thyleaf 템플릿 엔진은 해당 html 파일을 렌더링해서 브라우저에 넘김 (정적콘텐츠는 html 변환x)
2.3 API 방식
: json 데이터 구조 포맷으로 클라이언트에게 데이터를 전달하는 것, Vue, React, Vue.js가 사용, 서버끼리 통신할 때
@GetMapping("hello-string")
@ResponseBody //http 프로토콜에서 header부와 body부가 있을 때, body부에 리턴값을 직접 넣어주겠다는 뜻
public String helloString(@RequestParam("name") String name) {
return "hello " + name; // "hello string", 뷰가 없고 클라이언트에게 바로 해당 문자가 내려감
}
- @ResponseBody - http 프로토콜에서 hearder와 body가 있을 때 body에 해당 함수의 리턴값을 바로 넘겨준다는 의미
- helloString 함수는 템플릿을 리턴하는게 아니라 리터럴 문자열을 그대로 클라이언트(웹 브라우저)에게 바로 넘겨준다.


소스 코드를 봐도 이전까지의 MVC 방식과 다르게 그 어떤 html 태그가 없다.
객체를 전달하기
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello(); //객체 생성
hello.setName(name);
return hello; //객체를 넘겨줌
}
static class Hello { //static 쓰면 클래스 안에 또 클래스 만들 수 있음 사용은 상위클래스명.하위클래스명
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
객체를 그대로 넘겨주었기에 객체에 담긴 데이터를 키-값 방식인 json으로 변환해 나타낸다

- 키-name
- 값-"객체 넘기기"
- @ResponseBody 어노테이션을 사용하고 객체를 리턴하면 객체는 json으로 변환된다
- 예전에는 XML 방식(html 태그)을 이용했으나 무거워서 이제는 json을 대부분 사용한다
@ResponseBody의 동작 원리

- 웹 브라우저가 hello-api 페이지 요청
- 서버가 스프링에게 해당 요청을 넘김
- helloController에 매핑되어있는 함수를 찾음
- 해당 함수에 @ResponseBody 어노테이션이 있음
- 템플릿을 찾아서 렌더링해서 넘기는게 아니라, http의 body에 리턴값을 직접 전달함
- 리턴 값을 전달해주는 역할은 viewResolver 대신에 HttpMessageConverter가 동작함
- 리턴 값이 객체 → MappingJackson2HttpMessageConverter 라이브러리가 json으로 변환(디폴트)
- 리턴 값이 문자열 → StringHttpMessageConverter 라이브러리가 처리
- HttpMessageConverter는 기본으로 등록되어있고 실무에서 거의 건드리지 않음
* 특정 클라이언트의 http accept 헤더에서는 json이 아니라 xml 형식을 요청할 수도 있기에 서버의 컨트롤러의 리턴 타입과 조합해서 알아서 HttpMessageConverter가 변환해서 보내줌. 그러나 대부분 json 형식을 사용함
'Study > Spring Boot' 카테고리의 다른 글
| [ECC-백엔드 5팀] 9주차 스터디 (0) | 2026.05.16 |
|---|---|
| [ECC-백엔드 5팀] 8주차 스터디 - 도메인, 레포지토리, 컨트롤러, 서비스, 테스트, 의존성 주입, 스프링 빈, 컴포넌트 스캔 (0) | 2026.05.07 |
| [ECC-백엔드 5팀] 3주차 스터디 (0) | 2026.04.02 |
| [ECC-백엔드 5팀] 2주차 스터디 (0) | 2026.03.25 |
| [ECC-백엔드 5팀] 1주차 스터디 (0) | 2026.03.18 |
