본문 바로가기

스프링

[스프링 입문] 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

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. 스프링 웹 개발 기초