0. 스프링 강의 듣는 공부 일지
강의 주소 :
[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 | 김영한 - 인프
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확
www.inflearn.com
1. 스프링을 왜 공부해야 하는가...
=> 실무에서 제대로 동작하는 웹 애플리케이션을 개발하기 위해서
강의 목표 : 스프링을 어떻게 사용해야 하는가
미니 프로젝트 주제 : 간단한 웹 애플리케이션 개발
+a) 추후과제
+a) 추후과제
퍼블릭 클라우드 위에 서비스 배포 및 유지 보수(CI/CD를 이용한)
React Native를 이용한 Android, ios 등 기기 상관없는 서비스 배포...(표현 용어 있었던 것 같은데)
2. Index
프로젝트 주제 : 간단한 웹 애플리케이션 개발
1. 스프링 프로젝트 생성 및 스프링 부트로 웹 서버 실행
2. 회원 도메인 개발
3. 웹 MVC 개발
4. DB연동 - JDBC, JPA, 스프링 데이터 JPA
5. 테스트 케이스 작성
3. Tool stack
- spring boot
- Gradle
- Thymeleaf
- JPA ( Java Persistence API )
- Hibernate
- Tomcat
4. Project Setting
다운 받은 후, 압축을 풀어서 인텔리제이에서 프로젝트로 실행한다.
위와 같이 계속해서 외부에서 라이브러리를 다운받아 열리는 과정이 계속된다
- 프로젝트 폴더 구성
- src 하위 폴더의 main과 test는 Maven과 Gradle 둘 다 표준화 되어 있다.
test 하위의 테스트 코드가 중요하다는 얘기 ( 테스트코드와 관련된 소스들이 들어가는 폴더)
- src 하위 폴더의 main과 test는 Maven과 Gradle 둘 다 표준화 되어 있다.
main 폴더의 이미 생성된 클래스의 메인메서드를 실행
현재 아무것도 작성한 것이 없어서 위의 에러 페이지가 정상인 모습.
1. 스프링 프로젝트 생성 및 웹 서버 실행
(1) Welcome page 만들기
<!--파일경로 : resources/static/index.html -->
<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
- welcome page와 관련된 spring boot의 docs 링크
https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-welcome-page
Spring Boot Features
Graceful shutdown is supported with all four embedded web servers (Jetty, Reactor Netty, Tomcat, and Undertow) and with both reactive and Servlet-based web applications. It occurs as part of closing the application context and is performed in the earliest
docs.spring.io
- static/index.html 을 올려두면 welcome page를 제공한다.
hello를 클릭하면 이전의 404에러의 페이지가 나오도록 했다
(1)-1. Thymeleaf (타임리프)
: JSP, Freemarker와 같은 템플릿 엔진.
템플릿 엔진은 서버에서 HTML 파일을 생성하고 동적으로 데이터를 삽입하여 클라이언트에게 전달하는 데 사용.
쉽게 말해, HTML 문서 안에 Java 코드의 데이터를 결합해 최종적으로 사용자가 볼 수 있는 완성된 웹 페이지를 만들도록 도와줌.
- 주요 특징
- HTML 기반 템플릿 엔진: Thymeleaf는 HTML 문서와 아주 비슷한 구조.
즉, 개발자가 기존 HTML 파일을 사용하면서 필요한 부분에만 동적인 데이터를 삽입 가능.
일반 HTML 파일처럼 브라우저에서 확인할 수 있어 템플릿 작성이 매우 직관적. - 스프링 부트와 통합이 용이: Thymeleaf는 스프링 부트와 자연스럽게 통합.
스프링 부트에서 제공하는 컨트롤러에서 데이터를 Thymeleaf로 전달하고, 해당 데이터를 웹 페이지에 표시하는 구조를 쉽게 만들 수 있음. - 표현식 지원: Thymeleaf는 ${} 같은 표현식을 사용하여 서버에서 전달된 데이터를 HTML 문서 안에 삽입.
예를 들어, Java 객체의 데이터를 HTML에 쉽게 바인딩 가능.
여기서 th:text는 Thymeleaf의 속성으로, ${message}의 값을 HTML에 표시. - 동적 콘텐츠 생성: Thymeleaf는 조건부 렌더링(조건에 따라 HTML의 일부를 표시하거나 숨김), 반복문 등을 지원하여, 동적인 HTML을 쉽게 생성할 수 있음
- HTML 기반 템플릿 엔진: Thymeleaf는 HTML 문서와 아주 비슷한 구조.
참고
Thymeleaf(타임리프)란 ? 타임리프의 기본 기능알아보기
Thymeleaf(타임리프)란 ? 타임리프는 JSP, Freemarker와 같은 템플릿 엔진의 일종으로 다음과 같은 특징을 갖고 있습니다. 서버 사이드 HTML 렌더링 (SSR) 백엔드 서버에서 HTML을 동적으로 렌더링 하는 용
hstory0208.tistory.com
<!-- 경로 : java/controller/HelloController -->
package hello.hello_spring.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.stereotype.Controller;
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}
}
<!-- 경로 : resoucres/static/hello-static.html -->
<HTML>
<head>
<title>
static content
</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</HTML>
(1)-2. 정적 컨텐츠
<!--파일경로 : resources/static/index.html -->
<HTML>
<head>
<title>
static content
</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</HTML>
(1)-3. 정적 컨텐츠와 동적 컨텐츠를 제공하는 방식의 차이
정리정리 채워넣쟈
(2) MVC 와 템플릿 엔진
- MVC : Model, View, Controller
<-> 정적 컨텐츠와의 차이 : 그냥 간단하게 파일을 고객에게 전달해주는게 정적, mvc와 템플릿 엔진을 이용한 방식은 서버에서 변형을 통하여 HTML을 좀 바꿔서 내려주는 방식
- API
: 안드로이드나 아이폰 클라이언트랑 개발을 하기 위하여 JSON 데이터포맷으로 클라이언트에게 데이터를 전달하기 위한 방식 ( Vue, React 등등)
이전에는 JSP를 가지고도 뷰와 모델을 구분하지 않았지만 요즘 MVC 방식에는 뷰와 모델을 분리해야한다.
간단히,
> 뷰 : 화면을 그리는데 모든 역량을 집중
> 모델 : 컨트롤러와 같은 비즈니스와 관련된 로직이나 내부 처리에 집중
- 구분하면 좋은 장점 :
>> 규모가 큰 프로젝트나 기업에서 유지보수하기에 개발자들의 접근이 용이하다,
>> 즉 내가 작성한 것이 아닌 다른 사람이 작성한 수천라인의 코드라도 접근하기가 상대적으로 쉬워질 수 있다.
<!-- 파일경로 : resoureces/templates/hello-template.html >
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
=> 템플릿 엔진을 통해서 동적이 아닌 정적인 방법으로 값을 넘겨줘(치환)
아까와 다른 (empty)가 아닌 spring이라고 출력된 것임
(2)-1. 스프링 웹 개발에서 이야기하는 API 방식
=>객체반환
<!-- 객체반환 : @Controller-->
@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;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ResponseBody <!-- html에 나오는 body 태그를 의미하는 것이 아닌 http에서 헤더부와 바디부가 있는 것 중 바디부 -->
과거 html에서 주로 사용되던 XML방식보다(코드상 <html/></html>열고닫고하는구조)
key:value 형식인 JSON 형식으로 더 많이 사용되고 있음.
- 스프링에서 문자를 반환할 때 >
@Responsebody에 따라 http응답에 데이터를 return - 스프링에서 객체를 반환할때 >
json 형식으로 데이터를 만들어서 http 응답에 반응하는 것이 기본 정책
(2)-3. 정리하기 - 강의자료 참고 ★
- @ResponseBody 를 사용
HTTP의 BODY에 문자 내용을 직접 반환
viewResolver 대신에 HttpMessageConverter 가 동작 - 기본 문자처리: StringHttpMessageConverter
- 기본 객체처리: MappingJackson2HttpMessageConverter
- byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음
참고: 클라이언트의 HTTP Accept 해더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택된다. 더 자세한 내용은 스프링 MVC 강의에서 설명하겠다