정적컨텐츠 방식
-> 저번에 했던 웰컴페이지처럼 서버에서 뭐하는거없이 html파일을 그냥 보여주는 방식
스프링부트는 resources/static에서 해당 html파일을 찾아서 보여준다.
다음과 같이 파일명을 뒤에 붙이니 해당 html 내용을 그대로 보여줬다.
정적컨텐츠 동작방식
1. 웹브라우저에서 톰캣으로 해당 url 전달 , 톰캣이 스프링에게 전달 , 스프링은 hello-static관련 컨트롤러를 찾아본다.
전 시간에 hello를 가지는 컨트롤러는 있었지만 hello-static이 맵핑된 컨트롤러는 존재하지않음
2. 존재하지않으므로 스프링은 resources안에있는 hello-static.html을 찾아서 가져온다.
MVC와 템플릿 엔진 방식
-> mvc는 모델 뷰 컨트롤러 이고 템플릿 엔진은 html을 동적으로 보여줄때 사용한다.
요즘은 이 방식을 많이 사용한다.
MVC -> model , view ,controller
예전에는 컨트롤러 없이 뷰에서 처리했다 전 시간에 hello-template.html처럼
뷰파일(jsp)에서 모든일을 처리하려고하니 코드가 길어져서 보기도 관리하기도 불편함
그래서 요즘은 컨트롤러랑 뷰를 쪼개는게 기본이 되었다
(뷰는 보여주는데 집중하고 , 컨트롤러는 관련 일처리를한 후 모델에다가 필요한 데이터를 담아서 넘겨주는게 MVC)
MVC 예시)
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name")String name ,Model model)
{
model.addAttribute("name",name); // 파람에서 넘어온걸 모델에 담는다.
return "hello-template";
}
helloController에다가 다음과같은 코드를 추가해준다.
model.addAttribute에서 모델에 값을 담고
return으로 해당 템플릿으로 모델을 보내주는 로직
return을 hello-template로 해주니 hello-template.html이 필요하므로 resources/template/에다가 하나 생성해준다.
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body></html>
3번째줄에 뒤쪽 hello! empty는 타임리프가 작동하지않고 해당 html파일을 열기만 했을때 보여지는 부분이고
서버가 동작해서 타임리프가 작동하면 "'hello ' + ${name}" 이 부분이 보인다.
Tip
인텔리제이에서 컨트롤 + p 를 누르면 parameter info라고 파라미터로 어떤값을 넣어야하는지 확인할 수 있다.
required은 값을 필수로 넘겨야하는지 여부 ( 기본값 true == 넘겨야함)
value는 파리미터의 이름.
@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name")String name ,Model model)
{
model.addAttribute("name",name); // 파람에서 넘어온걸 모델에 담는다.
return "hello-template";
}
이상태로 두고
서버를 실행해서
다음과 같이 작성하면 결과를 확인할 수 있다.
?뒤에는 파라미터 이름 , = 뒤에는 값을 넣어준다.
jaehyun이 잘들어가서
hello-template.html의 "'hello ' + ${name}" 부분에서 name에 jaehyun이 들어간 결과를 확인 할수있다.
API 방식
-> json이라는 데이터포맷으로 클라이언트에게 데이터를 전달하는 방식
api방식을 확인하기위해 컨트롤러에 해당 코드 추가
@GetMapping("hello-string")
@ResponseBody // html 통신프로토콜에서 헤더와 바디가있는데 , 바디에다가 직접 데이터를 넣어주겠다는 뜻 // 템플릿엔진없이 뷰없이 그냥 값을 때려넣는다.
public String helloString(@RequestParam("name")String name )
{
return "hello" + name;
}
@ResponseBody 부분은 결과를 바디에다가 넣어 보내주겠다는 뜻.
템플릿엔진없이 ,뷰없이 바디내용을 때려박기 때문에 페이지 소스보기를해도 html관련 태그가없다.
api 새로운 예
Tip
1. 클래스안에서 클래스를 생성할수있다. static을 붙이면
예)
static class Hello
{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2. 인텔리제이에서 getter,setter를 쉽게만드는방법 2가지
- 오른쪽마우스클릭 generate 선택
- 알트 + 인설트
를 하면 위의 코드와 같이 생김.
getter와 setter은 자바빈 규약,프로퍼티 접근방식이라고 한다. 객체안에 private한 변수는 밖에서 접근못하므로 getter와 setter를 이용하는것(getter,setter는 public이므로)
3. 인텔리제이에서 컨트롤+쉬프트+엔터를 치면 자동완성해준다. ( 뒤에 세미콜론 알아서 붙여줌)
이제 api로 String말고 ,변수가 객체를 리턴해보자 ( 주로쓰는 api방식임)
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name")String name )
{
Hello hello = new Hello();
hello.setName(name);
return hello;
}
위의 코드와 같이 Hello라는 객체를 리턴해준다. 결과를 확인해보자.
Json 형식으로 결과값이 전달되는것을 확인할 수 있다.
json은 간단하게 키 밸류로 이루어진 구조이다.
예전에는 html태그같이 태그 열고닫고 하는 xml방식을 사용했는데 요즘에는 심플한 json방식을 기본으로 사용한다.
ResponseBody 사용원리
1. 도메인을 입력해서 들어오면 톰캣이 스프링에게 알림 , 스프링이 컨트롤러에서 해당 매핑된 부분이 있는지 찾는다.
2. 위쪽에 정적방식이나 mvc방식같은경우에는 @ResponseBody라는 어노테이션이 없으므로 뷰리졸브를 이용해서 맞는 템플릿을 찾고 진행하는데 , ResponseBody를 이용하게되면 http 응답에 데이터를 넘겨버린다. 객체가 아닌애들은 그냥 넣어서 줬고 , 객체같은애들은 json형식으로 보내준다.
3. @ResponseBody가 있으면 httpMessageConverter가 동작하는데 받은게 String이라면 StringConverter, 객체였다면 JsonConverter가 동작한다.
'인프런 > 스프링 입문' 카테고리의 다른 글
6)스프링 빈과 의존관계, 스프링 빈 등록방법 1. 컴포넌트 스캔 2. 자바로 직접 등록 (0) | 2022.11.11 |
---|---|
5)회원 서비스 만들기(회원가입..등),테스트하기,static변수특징,생성자사용하기,인터페이스객체,의존성주입 (0) | 2022.10.29 |
4)비즈니스 요구사항 정리,회원도메인,회원 리포지토리생성,테스트코드생성,테스트해보기 (0) | 2022.10.12 |
2. View 환경설정, welcome page 만들기,컨트롤러 생성, 웰컴페이지가 보이는 동작방식 , 콘솔에서 실행방법 (0) | 2022.10.03 |
1. 스프링 부트 프로젝트 생성 ~ 실행, build.gradle,프로젝트 설정 팁,라이브러리 살펴보기 (0) | 2022.10.03 |
댓글