일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스
- html
- BFS
- Spring
- Color
- algorithm
- inflearn
- DFS
- android
- 알고리즘
- DP
- 다이나믹 프로그래밍
- codecademy
- SWEA
- 순환
- javascript
- 검색트리
- CleanCode
- Web
- 정렬
- Kotlin
- 자바
- CSS
- 코딩테스트
- SQL
- front-end
- 구현
- 클린코드
- java
- 해슁
- Today
- Total
깡뇽
[Spring] 스프링 입문 - 스프링 웹 개발 기초 본문
인프런 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의를 수강하면서 정리하는 글.
방법1) 정적 컨텐츠
파일을 웹 브라우저로 그대로 보내는 것
- 실습
1) resoucres 폴더 -> static 폴더 -> "hello-static.html" File 생성 후 HTML 코드 넣기
2) 브라우저에 localhost:8080/hello-static.html 검색
브라우저에 HTML 코드가 그대로 반환된 것을 확인할 수 있다.
검색을 하면 내장 톰켓 서버가 요청을 받고, hello-static의 요청이 왔다는 것을 스프링에게 알린다. 스프링은 컨트롤러에서 hello-static이 있는지 먼저 찾아보고 없으니 resources에 static/hello-static.html을 찾는다. 해당 파일이 있으면 반환한다.
방법2) MVC(Model, View, Controller) 와 템플릿 엔진
서버에서 HTML을 바꿔서 보내는 것. 템플릿 엔진을 MVC 방식으로 쪼개고 뷰를 템플릿 엔진이 랜더링된 HTML을 클라이언트에게 전달.
Controller는 내부적인 처리, View는 화면을 그려내는 역할을 담당하는데 이 둘을 쪼개는 것이 보편적.
- 실습
1) 만들어 두었던 "HellloController"에 코드 추가
@GetMapping("hello-mvc")
public String helloMcv(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
// 모델에 담아서 랜더링 할 때 사용. 파람으로 넘어온 name을 넘기기.
2) resources 폴더 -> templates 폴더 -> "hello-template.html" File 생성 후 HTML 코드 넣기
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
3) 브라우저에 localhost:8080/hello-mvc 검색 -> 오류
4) 로그를 확인하면 "Required String parameter 'name' is not present"임을 확인
"WARN 13712 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'name' for method parameter type String is not present]"
5) 브라우저에 localhost:8080/hello-mvc?name=spring 라고 입력해서 name에 값을 넣어 반영할 수 있다.
검색을 하면 내장 톰켓 서버가 요청을 받고, 내장 톰켓 서버가 hello-mvc 요청이 왔음을 스프링에게 알린다. helloController에 메소드 Mapping이 되어 있음을 확인하고 메서드를 호출한다. 메서드가 호출되면 hello-template을 리턴하면서 name에 작성된 것을 model에 넣는다. 이것을 스프링에게 넘기면 viewResolver가 templates/hello-template.html을 찾아서 Thymeleaf 템플릿 엔진에게 처리를 맡긴다. 템플릿 엔진이 렌더링해서 변환한 HTML을 웹 브라우저에 반환한다.
방법3) API
뷰 없이 json 데이터 포멧으로 보내는 것
- 실습1
1) 만들어 두었던 "HellloController"에 코드 추가
@GetMapping("hello-string")
@ResponseBody //중요. http의 body부분에 응답을 넣는다는 의미.
public String helloString(@RequestParam("name") String name) {
return "hello " + name; //"hello spring"
}
2) 브라우저에 localhost:8080/hello-string.html?name=spring!! 라고 입력
템플릿 엔진과 다르게 HTML 태그들 없이 문자 그대로 반영된 것을 확인할 수 있다.
- 실습2 (이게 찐)
1) "HellloController"에 코드 추가
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello(); //객체 생성
hello.setName(name);
return hello; //객체 리턴
}
static class Hello {
private String name;
//Getter
public String getName() {
return name;
}
//Setter
public void setName(String name) {
this.name = name;
}
}
2) 브라우저에 localhost:8080/hello-api.html?name=spring 라고 입력
{"name":"spring"} 이라고 json 방식으로 나오는 것을 확인할 수 있다.
+ Getter & Setter : private으로 선언된 녀석을 외부에서 사용하지 못하므로 public의 메서드로 사용. 프로퍼티(property) 방식. 객체의 무결성(데이터의 정확성과 일관성을 유지하고 보증)을 보장하기 위해서이고 내부에서 통제 가능해서 유지보수가 용이하다는 장점.
검색을 하면 내장 톰켓 서버가 요청을 받고, 내장 톰켓 서버가 hello-api 요청이 왔음을 스프링에게 알린다. 스프링은 hello-api가 있음을 확인하는데 @ResponseBody 어노테이션이 붙어 있으므로 http응답에 데이터를 그대로 넘긴다. 근데 문자가 아닌 객체를 반환한다면 json 방식으로 데이터를 만들어서 반환한다 자세히 말해서 @ResponseBody가 확인되고 객체를 넘기면 HttpMessageConverter가 동작하면서 문자라면 StringConverter가 동작하는데 객체이므로 JsonConverter가 동작한다.
참고로 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보를 조합해서 'HttpMessageController"가 선택된다.
'Web > Spring' 카테고리의 다른 글
Java 개발 환경 설정 - 윈도우 Open JDK 설치 (0) | 2023.07.04 |
---|---|
[Spring] 스프링 입문 - 회원 관리 예제(2) (2) | 2022.02.17 |
[Spring] 스프링 입문 - 회원 관리 예제(1) (0) | 2022.02.17 |
[Spring] 스프링 입문 - 프로젝트 환경설정(2) (0) | 2021.12.23 |
[Spring] 스프링 입문 - 프로젝트 환경설정(1) (0) | 2021.12.23 |