깡뇽

[Spring] 스프링 입문 - 스프링 웹 개발 기초 본문

Web/Spring

[Spring] 스프링 입문 - 스프링 웹 개발 기초

깡뇽 2022. 2. 16. 18:25
반응형

인프런 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 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에 값을 넣어 반영할 수 있다.

강의자료 "MVC, 템플릿 엔진 이미지"

검색을 하면 내장 톰켓 서버가 요청을 받고, 내장 톰켓 서버가 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) 방식. 객체의 무결성(데이터의 정확성과 일관성을 유지하고 보증)을 보장하기 위해서이고 내부에서 통제 가능해서 유지보수가 용이하다는 장점.

 

강의자료 "@ResponseBody 사용 원리"

검색을 하면 내장 톰켓 서버가 요청을 받고, 내장 톰켓 서버가 hello-api 요청이 왔음을 스프링에게 알린다. 스프링은 hello-api가 있음을 확인하는데 @ResponseBody 어노테이션이 붙어 있으므로 http응답에 데이터를 그대로 넘긴다. 근데 문자가 아닌 객체를 반환한다면 json 방식으로 데이터를 만들어서 반환한다 자세히 말해서 @ResponseBody가 확인되고 객체를 넘기면 HttpMessageConverter가 동작하면서 문자라면 StringConverter가 동작하는데 객체이므로 JsonConverter가 동작한다. 

 

참고로 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보를 조합해서 'HttpMessageController"가 선택된다. 

반응형