https://start.spring.io 에서 스프링 부트 기반 스프링 관련 프로젝트 만들기
*스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 만들기
└ https://start.spring.io → 스프링 부트 기반으로 스프링 관련 프로젝트를 만들어주는 사이트
project metadata 항목에서 group에는 기업의 도메인명을 작성하고,
artifact 빌드된 결과물, 즉 프로젝트명을 작성한다.
스프링 부트 기반으로 스프링 관련 프로젝트가 생성되면
압축을 풀고, 해당 폴더를 인텔리제이에서 불러온다.
구조를 살펴보자면
src
└ main
└ java ------------------- 자바 언어를 사용해서 코드를 작성하는 곳
└ resources ----------- 자바 코드 파일을 제외한 xml, html 파일, 어플리케이션 설정파일(application.properties) 등
└ static
└ index.html --- welcome page
└ test ----------------------- 테스트 코드와 관련된 소스코드들을 작성하는 곳
└ build.gradle ------------ 프로젝트에 사용되는 라이브러리를 땡겨오고, 해당 라이브러리?의 버전 설정
build.gradle 파일에서 하기 코드는 dependencies에 작성된 라이브러리들을 다운받는 곳이 mavenCentral이라는 것을 설정한 것
repositories {
mavenCentral()
}
라이브러리
프로젝트 구조에서 외부 라이브러리(External Libraries) 폴더를 살펴보면 프로젝트에 사용되는 라이브러리들을 확인할 수 있다.
빌드 도구인 gradle은 의존관계가 있는 라이브러리들을 함께 다운로드 한다.
view 환경설정 --- welcome page(도메인으로만 접속했을 때 클라이언트에게 보여지는 화면) 만들기
스프링부트가 제공하는 welcome page 기능
스프링부트는 정적과 템플릿 웰컴 페이지를 지원한다.
static welcome page 는 src > main > resources > static 폴더에 위치한 index.html 파일을 의미한다 → 정적 웰컴 페이지
처음에 index.html 파일을 찾고, 만약 찾지 못했다면 *** 스프링 부트는 템플릿 엔진을 사용하여 index.html 템플릿을 찾는다.
템플릿 엔진을 사용하면 서버측에서 동적으로 데이터를 처리하여 index.html 페이지를 생성할 수 있고,
템플릿 파일을 일반적으로 src > main > resources > templates 폴더에 위치한다 ***
*** 템플릿 엔진을 사용하는 경우 해당 템플릿 엔진을 사용할 수 있게 의존성에 추가해야 한다 ***
src > main > resources > templates 폴더에 위치한 index 템플릿을 찾는다 → 템플릿 웰컴 페이지
만약 index.html 파일 또는 index 템플릿을 찾았다면 자동적으로 어플리케이션의 welcome page로 사용된다.
*** http 요청에 기반하여 작동하는 handlerMapping 구현체 순서 ***
handlerMapping은 http 요청을 어떤 핸들러와(컨트롤러 메서드) 매핑할지 결정하는 인터페이스다.
클라이언트의 요청 url이 들어오면 해당 url을 처리할 적절한 핸들러를 찾아서 그 핸들러를 실행한다.
스프링 부트는 여러 가지 HandlerMapping 구현체를 제공하며,
각 HandlerMapping은 서로 다른 종류의 요청을 처리한다.
우선순위에 따른 HandlerMapping 순서
RouterFunctionMapping? → RequestMappingHandlerMapping → WelcomePageHandlerMapping
│ └ 애플리케이션의 welcome page를 처리하는데 사용된다.
└ @Controller 애노테이션이 붙은 클래스를 사용하여 요청을 처리하는 전통적인 Spring MVC 방식,
이 핸들러는 메서드 단위로 매핑을 처리
localhost:8080 으로 클라이언트로부터 요청이 들어왔을 때
/ 경로를 처리할 함수가 정의되지 않았거나 메서드가 정의되어 있지 않는다면 대비책으로(fallback)
WelcomePageHandlerMapping 이 처리 단계로 작동하게 된다.
*** 템플릿 엔진 작동 순서 ***
RequestMappingHandlerMapping 이 클라이언트로부터 요청온 url을 처리할 핸들러를 찾은 후
해당 핸들러에서 요청을 처리한 메서드가 작동한 후 반환된 문자열 타입 결과 값이 어떻게 작동되는가?
예를 들어 Thymeleaf 템플릿 엔진이 처리한다면 반환 값이 문자열 타입 hello인 경우
hello 앞에 template/ 을 붙이고, hello 뒤에 html 확장자를 붙여 src > main > resources > templates 폴더 안에
hello.html 파일이 있는지를 확인하고, 해당 파일을 클라이언트에게 반환한다.
스프링 웹 개발 기초
정적 컨텐츠(static content)
기본적으로 스프링부트는 애플리케이션의 서블릿 컨텍스트 루트로부터 또는
classpath에서 다음과 같은 폴더에서 정적 리소스들을 찾는다
└ /static ( 또는 /public 또는 /resources 또는 /META-INF/resources)
*** 먼저 클라이언트의 요청에 기반하여 처리할 컨트롤러가 있는지를 찾아보고 없다면
정적 컨텐츠 여부를 확인한 후 있다면 해당 파일을 클라이언트에게 반환한다.
*** 웹 개발에서 신경써야할 부분은 클라이언트에게 렌더링한 html 파일을 전달할 것인지,
api 방식을 사용하여 데이터를 바로 전달할 것인지
MVC와 템플릿 엔진: view를 찾아서 템플릿 엔진을 통해 렌더링해서 html 파일을 웹 브라우저에 넘겨주는 방법
MVC: Model, View, Controller
API
컨트롤러 클래스에서 메서드 위에 작성한 @ResponseBody 애노테이션은
html 파일의 구조에서 <body> 태그를 의미하는 것이 아니라 http에서 body 부분에 데이터를 직접 넣어주겠다는 것
예를 들어 주소창에 다음과 같은 url을 작성한다면 ---> localhost:8080/hello-string?name=spring!!!
하기와 같은 메서드가 작동하게 되고, key가 name인 value의 값 spring!!! 이 문자열 타입 변수인 name에 대입되어
메서드 내부에서 사용되고, "hello spring!!!"이 반환된다 ---> view가 아닌 데이터가 반환된다, 문자가 아닌 객체도 반환할 수 있다.
객체로 반환시 key와 value로 값이 구성된 JSON 형식으로 반환된다(단, 스프링부트에서 객체를 반환하고,
@ResponseBody 애노테이션이 붙었을 경우)
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello "+name; // "hello spring"
}
*** @ResponseBody 사용원리 ***
@ResponseBody 애노테이션이 작성된 메서드 작동시 viewResolver가 아닌 HttpMessageConverter가 작동한다.
단순 문자라면 StringConverter가 작동하고, 객체라면 JsonConverter가 작동한다.
객체를 Json 양식으로 바꾸어서 요청한 서버 또는 웹 브라우저에게 Json 형식으로 데이터를 반환한다.
참고
[인프런, 김영한]_[스프링 입문] 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
1. 프로젝트 환경설정
2. 스프링 웹 개발 기초
'스프링' 카테고리의 다른 글
[스프링] 스프링부트 개념정리(이론)_8~14강 정리(완강) (2) | 2024.12.29 |
---|---|
[스프링] 스프링부트 개념정리(이론)_1~7강 정리 (2) | 2024.12.20 |