우선적으로 java JDK를 다운받아야 한다.
강의에서는 11 version으로 다운받았다.

start.spring.io
스프링 프로젝트를 만들어주는 사이트
Maven과 Gradle
개발에 필요한 라이브러리들을 가져오고
빌드하는 라이프사이클까지 관리해주는 Tool이다.
요즘에는 Gradle을 많이 쓴다.
사이트에서 생성한 파일의 압축을 풀고
인텔리제이에서 Open을 눌러 build.gradle 파일을 클릭하여
Open as Project로 연다.
처음에 열면, 외부에서 라이브러리를 다운받느라 시간이 걸린다.

프로젝트 내부를 보면


main메서드를 실행하면
SpringApplication.run()에 HelloSpringApplication 클래스를 넣고,
이 클래스가 실행되어 @SpringBootApplication 어노테이션에 따라
SpringBootApplication이 실행된다.
이것이 실행되면서 Tomcat 웹서버를 내장하고 있어서 편하게 실행 가능하다.

File - Settings > Build, Execution, Deployment > Build Tools > Gradle 에서
run 설정이 Gradle로 되어있으면 IntelliJ IDEA로 바꿔서
Gradle을 통하지 않고 실행시켜 속도를 높일 수 있다.


External Libraries에 가져온 라이브러리들이 나온다.
근데 bulid.gradle에서 확인했던 라이브러리는 3개밖에 없는데,
여기서 라이브러리들을 확인해보면 엄청 많다.

그 이유는 Maven이나 Gradle같은 라이브러리를 관리해주는 Tool에서
의존관계 라이브러리들을 관리해주기 때문인데,
예를들어 spring-boot-starter-web 라이브러리를 가져오면,
이와 연관(의존)된 라이브러리들도 같이 가져온다.
사진에서 보듯이 Tomcat 웹서버도 라이브러리로 포함되어있다.
그래서 Tomcat 서버를 따로 다운받을 필요가 없다.
logback, junit, assertj, spring-test 등도 있다.
resources/static에 index.html을 넣어두면 이것을 기본 페이지로 삼는다.
package hello.hellospring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
// Controller 패키지와 클래스를 만들었다.
// Controller면 기본적으로 @Controller 어노테이션을 달아줘야 한다.
@Controller
public class HelloController {
// " /hello 로 URL이(Get방식) 들어오면 이 메소드를 호출한다."
@GetMapping("hello")
public String hello(Model model){
model.addAttribute("data", "hello!!");
// 이 hello!! 라는 값은 변수를 넣어 DB에서 가져오도록 할 수도 있다.
return "hello";
// 여기서 hello를 문자로 반환하는데 텍스트가 아니다.
// viewResolver가 resources/templates 안에 있는 hello.html을 찾아서 렌더링한다.
// 렌더링이란 서버로부터 html파일을 받아 브라우저에 뿌려주는 과정이다.
// 스프링 부트 템플릿엔진 기본 viewName 매핑이
// resources:templates/ + {viewName} + .html 로 되어있다
}
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<!-- thymeleaf 템플릿이 선언되어 있다. -->
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
<!-- 여기서 th는 thymeleaf를 의미한다. -->
<!-- ${data}는 Controller에서 model.addAttribute에서 Key값으로 넣었던 data와 연결된다. -->
<!-- 그래서 web을 실행하면 안녕하세요 hello!! 가 출력된다. -->
</body>
</html>


정적 컨텐츠
스프링부트 정적컨텐츠 기능:
스프링에서는 정적컨텐츠를 /static 폴더에 위치시켜, 실행시킨다.
URL에 localhost:8080/hello-static.html을 입력하여 get방식으로 웹 페이지를 띄우려 할 때
hello-static 관련 controller가 없으면(우선순위) 스프링부트가 static폴더에서 .html 파일을 찾아 직접 띄운다.

MVC와 템플릿엔진
Model과 Contoller는 비즈니스로직(소스)에 집중을, View는 화면구현에 집중을 시킨 것이다.


API - 문자


@ResponseBody 어노테이션을 통해
html파일 없이 문자만 나온다.
API - 객체


JSON방식으로 출력된다.
스프링에서 @ResponseBody를 사용하면 JSON형식으로 반환하는 것이 기본 설정값이다.