스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
라이브러리 살펴보기
- Gradle은 의존관계가 있는 라이브러리를 함께 다운로드 한다.
스프링 부트 라이브러리
- spring-boot-starter-web
- spring-boot-starter-tomcat: 톰캣 (웹서버)
- spring-webmvc: 스프링 웹 MVC
- spring-boot-starter-thymeleaf: 타임리프 템플릿 엔진(View)
- spring-boot-starter(공통): 스프링 부트 + 스프링 코어 + 로깅
- spring-boot
- spring-core
- spring-boot-starter-logging
- logback, slf4j
- spring-boot
테스트 라이브러리
- spring-boot-starter-test
- junit: 테스트 프레임워크
- mockito: 목 라이브러리
- assertj: 테스트 코드를 좀 더 편하게 작성하게 도와주는 라이브러리
- spring-test: 스프링 통합 테스트 지원
정적 콘텐츠
- 클라이언트의 요청을 받고 서버에 미리 저장된 HTML, CSS, JS 등의 파일을 그대로 응답해 보여주는 것을 말한다.
- 모든 클라이언트들의 요청에 대해 동일한 결과를 보여준다.
- html 작성
/main/resources/static 하위에 hello-static.html 파일을 생성하고 다음과 같이 작성해 준다.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
클라이언트로부터 localhost:8080/hello-static.html 요청이 들어오게 되면 우선 Tomcat 서버를 거치고
그다음 hello-static 관련 컨트롤러가 있는지 확인한다.
이후 해당 컨트롤러가 없을 경우 /resources/static 하위에서 해당하는 파일을 찾아 반환해 준다.
→ (resources: static/hello-static.html)
- 프로젝트 실행
프로젝트를 실행시키고 localhost:8080/hello-static.html 링크를 통해서 요청한 정적 콘텐츠를 확인할 수 있다.
동작과정을 그림으로 나타내면 아래와 같다.
MVC와 템플릿 엔진
MVC (Model, view, Controller)
웹에서 화면을 출력하기 위해 내용을 담고, 보여주고, 전달해 주는 소프트웨어 구현 방식 중 하나
템플릿 엔진
- 템플릿 양식과 특정 데이터 모델에 따른 입력 자료를 합성하여 결과 문서를 출력하는 소프트웨어
- 쉽게 말해 server에서 html파일로 변형 후 전달하는 것
Controller
@GetMapping("hello-mvc")
public String hellomvc(@RequestParam("name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
}
Templates
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
실행
- http://localhost:8080/hello-mvc?name=spring!!!
?name 을 통해 파라미터의 값(spring!!!)을 넘겨준다.
→ hello spring!!!
동작과정을 그림으로 나타내면 아래와 같다.
API
API : 운영체제와 응용프로그램 사이의 통신에 사용되는 언어나 메시지 형식
이전의 서버는 백엔드에서 데이터를 이용해서 완성된 HTML를 브라우저에게 전달해 줘서, 브라우저는 단순한 뷰어 역할로 쓰였다.
요즘의 서버는 브라우저에서 필요한 데이터만을 전달하는 API 서버의 형태로 변화하고 있다.
즉, 서버는 브라우저에게 완성된 HTML이 아닌, 브라우저에서 요구하는 순수한 데이터를 전해준다.
이전 방법에서는, 모델에 있는 key 값에 대응하는 value를 넣어줬었다.
그렇지만 api는 모델에 값을 넣지 않고, 데이터를 바로 전달해 준다.
@ResponseBody 문자 반환
@Controller
public class HelloController {
@GetMapping("hello-stirng")
@ResponseBody
public Hello helloString(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name); // name에 spring을 넣으면 "hello spring"으로 바뀔 것
return hello;
}
}
- @ResponseBody 를 사용하면 뷰 리졸버(viewResolver)를 사용하지 않는다. 이 말이 무슨 말이냐 하면 http요청 body를 자바 객체로 전달받을 수 있다. http의 body부에 하단의 "hello " + name 내용을 직접 넣어주겠다는 것이다. "hello " + name 이라는 데이터를 그대로 내려주기 때문에 http 페이지에서 소스코드 보기를 누르면 "hello " + name 만 떡하니 있다. ex) name을 spring 라고 하면 hello spring 만 소스코드에 있는 것을 볼 수 있다.
- 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)
- 이걸 쓸일은 거의 없음
@ResponseBody 객체 반환
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) { //문자가 아닌 객체 반환
Hello hello = new Hello();
hello.setName(name); //value(spring)
return hello;
}
static class Hello {
private String name; //key
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- @ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환
- JSON : JSON은 속성-값 쌍, 배열 자료형 또는 기타 모든 시리얼화 가능한 값 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 쉽게 말해 key-value로 이루어진 구조이다.
실행
- http://localhost:8080/hello-api?name=spring
→ {"name":"spring"}
동작과정을 그림으로 나타내면 아래와 같다.
- 객체가 오면 기본 디폴트가 JSON방식(출력 : name: spring - key : value)으로 만들어서 http응답에 반응하겠다는 것이 spring의 기본 정책이다. / 문자가 오면 StringConverter가 동작
- HttpMessaeConverter를 내가 원하는 방식으로 바꿔서 사용할 수도 있는데 실무에선 거의 그대로 쓴다.
출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한
'SPRING > 스프링 입문 (김영한 강사님)' 카테고리의 다른 글
AOP (1) | 2023.05.10 |
---|---|
스프링 DB 접근 기술 (0) | 2023.05.10 |
회원 관리 예제 - 웹 MVC 개발 (0) | 2023.05.03 |
스프링 빈과 의존관계 (0) | 2023.05.03 |
회원 관리 예제 - 백엔드 개발 (0) | 2023.05.03 |