스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
본 글은 인프런 김영한 님의 스프링 강의를 기반으로 작성하였습니다.
강의 자료의 출처는 위와 같음을 알립니다.
정적 컨텐츠
개념 : 서버에서 어떤 동작을 하지 않고 파일을 그대로 웹 브라우저에 내려준다
스프링 부트는 정적 컨텐츠를 자동으로 제공한다
예제
1. 먼저 static 아래에 아무 html 파일을 생성해준다
2. 다음과 같은 html 코드를 넣는다
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
3. Run 후 문서명으로 localhost:8080으로 접속하면 다음과 같은 화면이 표시된다
원리
1. 웹 브라우저에서 위와 같은 주소를 요청한다
2. 내장 톰켓 서버가 요청받은 주소를 받는다
3. 컨트롤러가 우선순위를 가지기 때문에 먼저 컨트롤러 쪽에서 hello-static.html이 존재하는지 찾는다
-> 존재하지 않음
4. resources 내의 hello-static을 찾는다
-> 찾음
5. 웹으로 반환해준다
MVC와 템플릿 엔진
MVC의 의미 :
Model
View
Controller
Controller
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
비즈니스 로직, 내부적 처리과정에 집중해야 한다
View
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
View는 보여지는 화면에 모든 역량을 집중해야 한다
예제
1. 이번에는 controller로 외부에서 파라미터를 받을 것이다
@RequestParam, String, Model을 선언해준다
String name -> 웹 url을 Model model에 담아 뷰에서 랜더링할 때 사용해준다
model.addAttribute를 통해 파라미터로 넘어온 name을 넘겨준다
"name"은 키, name은 위의 name이다
return hello-template을 통해 이 것이 hello-template.html로 넘어간다
2. hello-template.html 생성
hello-template.html을 생성해준다
뒤에 hello! empty가 있는 이유
-> thymeleaf를 통해 앞의 코드로 동작을 하지만, 페이지 소스보기로 뒤에 어떤 구문이 들어가는지 개발자가 보기 편하도록 만들어져 있다. 뒤의 코드가 없어도 정상적으로 동작한다
변수로 넘어온 name을 인자값으로 출력한다
thymeleaf의 장점
다음과 같은 절대경로를 통해 서버의 출력없이 html 결과물을 볼 수 있다
하지만 localhost를 통해 들어가보면
처음에는 다음과 위 아래와 같은 에러가 발생한다
에러 WHY??
RequestParam은 default로 인자를 넘겨주어야 하는데,
우리는 넘기지 않았기 때문에 Error가 발생하는 것이다
동작 방식
1. name = "spring!!!!" 이 넘어온다
2. 다음과 같은 Controller의 helloMVc에서 String name이 "spring!!!!"으로 변환된다
3. model에 담긴 후 hello-template으로 넘어가서 ${name} 이 위에 담긴 "spring!!!"으로 치환되어 화면에 출력된다
MVC, 템플릿 엔진 이미지
1. Spring Boot가 띄울 때 같이 띄우는 내장 톰켓 서버를 거친다.
2. 내장 톰켓 서버는 hello-mvc가 넘어왔다고 Spring에게 던진다
3. 스프링은 Hellocontroller에 그 메서드가 매핑되어 있다고 인지를 한 후 메서드를 호출한다
4. Return을 해줄 때 이름은 hello-template이라는 이름으로 모델에 키는 name, 값은 spring으로 spring(viewResolver)에 return한다
5. viewResolve은 view를 찾아주고 template과 연결 시켜주는 동작을 한다
6. hello-template이라는 이름과 일치하는 html을 찾아서 thymeleaf에게 템플릿 엔진을 처리해달라고 넘긴다
7. 템플릿이 랜더링을 진행한 후 변환한 html을 웹 브라우저에 반환을 한다
+ 정적 컨텐츠는 변환하지 않고 넘기지만 MVC는 변환 후 넘겨준다
API
api : 데이터를 웹에 그대로 내려준다
예제 1
1. HelloController에 다음과 같은 메서드를 만들어준다
중요한 것은 @ResponseBody를 꼭 넣어주어야 한다
@ResponseBody는 html의 Body가 아닌
http 프로토콜 구조의 Body를 의미한다
즉 Body 부분을 직접 삽입해준다는 의미이다
return "hello + " + name; 은 hello spring!!!! 으로 변환되어 내려갈 것이다
우와 같이 정상적으로 출력되는 것을 확인할 수 있다
Question
"그러면 mvc와 차이가 없는 것 아닌가????"
라는 질문에
페이지 소스코드를 열어보면
이전과 다르게 html 소스 코드 없이 반환된 값만 내려가는 것을 볼 수 있다
예제 2(중요)
1. 다음과 같이 hello-api를 선언해준다
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello(); //인스턴스 생성
hello.setName(name); // setName()을 통해 파라미터로 넘어온 name을 넣어준다
return hello; // 문자가 아닌 객체 자체를 넘겨준다
}
static class Hello{ //Hello라는 객체를 만들어준다
private String name; // name은 private이기 때문에 메서드를 통해서만 접근할 수 있다
public String getName() { //꺼낼 때는 getName()
return name;
}
public void setName(String name) { //넣을 때는 setName()
this.name = name;
}
}
위 코드는 java bin 표준 방식이다
팁
-> 변환
2. 출력
이 동작 방식은 key와 value로 이루어진 json 방식이다.
@ResponseBody는 json 방식으로 반환하는 것이 기본이다.
@ResponseBody 사용 원리
1. helloController까지는 mvc와 동일하다
2. @ResponseBody를 발견한 순간 Http 응답에 바로 넘기기 때문에 HttpMessageConverter가 동작한다.
2-1 : 그러나 넘기는 값이 문자가 아닌 객체다
3. 객체가 넘어오면 json 방식으로 생성하여 응답을 하는 것이 default 원리이다.
3-1 객체가 넘어올 때 몇 가지를 체크한다
3-2-1 만약 문자가 넘어오면 StringConverter가 동작한다
3-2-2 만약 객체가 넘어오면 JsonConverter가 동작해서 json 방식으로 응답한다
참고 : 실무에서는 거의 이 동작 방식으로 사용한다
'Spring' 카테고리의 다른 글
[Spring / 스프링 입문] 04. 회원 관리 예제(2) - 백엔드 개발 (0) | 2023.07.07 |
---|---|
[Spring / 스프링 입문] 04. 회원 관리 예제(1) - 백엔드 개발 (0) | 2023.07.04 |
[Spring / 스프링 입문] 02. View 환경 설정 및 빌드 & 실행 (0) | 2023.06.30 |
[Spring / 스프링 입문] 01. 스프링 환경 설정 (0) | 2023.06.27 |