2023.05.02 Spring 김영한
인프런 강의 김영한
1. 강의 소개
스프링 공부 어떻게 해야할지 어렵다.
스프링을 왜 해야하는가 개발자는 직접 코딩하면서 배우는게 더 잘배운다.
간단한 것을 만들어보면서 공부할 것이다.
어떤기술들이 어떻게 사용되는지 배울 것이다.
핵심사이클을 돌려볼것이다.
앞으로 어떤부분을 깊이 학습해야하는지 배울 것이다.
처음부터 끝까지 직접 코딩
2. 프로젝트 생성
스프링
사전준비물 java 11
ide 이클립스 혹은 인텔리j
스프링부트 스타터로 스프링 프로젝트 사용할 것임.
https://start.spring.io/ 에서 프로젝트 생성
부트기반으로 스프링 프로젝트를 만들어주는 사이트임
과거에는 메이븐을 많이 사용햇는데 요즘엔 Gradle을 많이 사용한다.
spring web
웹브라우저 템플릿엔진 보는 Thymeleaf 를 추가해준다.
회사마다 이건 다르다.
mian이랑 test가 나눠져잇다. main java밑에 메인이 들어가고
test에 test코드가 있다.
build.gradle이 중요하다.
설정을 하나씩 다쳤어야하는데 스프링부트에서 알아서 처리해준다.
mavenCentral()에서 다운로드 받으라고 설정되어있다.
-> gradle문제인지 java 11이 스프링 3.0x이상에선 작동을 안한다
학습용으로 스프링 버전도 낮춰보았다.
plugins {
id 'java'
id 'war'
id 'org.springframework.boot' version '2.3.1.RELEASE'
id 'io.spring.dependency-management' version '1.1.0'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
java 17버전으로 할지 11로할지는 진행해보면서 정하면될듯하다.
3. 라이브러리 살펴보기
의존관계가 있는 라이브러리를 다운로드 받자.
타임리프, 스프링웹밖에 안넣엇는데 많이 들어있다.
gardle이나 메이븐은 의존관계를 알아서 관리해준다.
관련 필요한 라이브러리들을 알아서 가져와준다.
옛날에는 웹서버를 하고 웹서버에 자바코드를 넣엇엇다.
그런데 요즘에는 보통 내장하고 있다.
실무에서는 log로 넘겨야 관리를 한다.
spring start loging lofgback sf4j등등을 사용한다.
실무에서는 system.out사용안한다!!!
타임리프 템플릿엔진
테스트용 junit5, spring-test 스프링과 통하면서 테스트
등등이 있다.
4. View 환경설정
main-resource-static에 index.html을 만들면 웰컴페이지로 열어준다.
웰컴페이지 어떻게하지?
https://spring.io/projects/spring-boot 공식문서를 보고 만들면된다.
스프링은 먼저 index.html을 찾는다. 못찾으면 index template를 찾는다.
방금 한것은 정적페이지 이다.
그냥 파일을 던져준것임
템플릿엔진을 쓰면 내가 원하는대로 모양을 바꿀 수 있다.
view대신 사용하는 것인듯 하다.
https://www.thymeleaf.org/
메뉴얼에도 템플릿 엔진이 있다.
스프링부터 공식튜토리얼
https://spring.io/guides/gs/serving-web-content/
https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot-features.html#boot-features-spring-mvc-template-engines
resources - templates - hello.html을 만든다.
th:는 타임리프 문법을 사용한다는 것이다.
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
컨트롤러에서 리턴 값으로 문자를 반환하면 뷰 리졸버( viewResolver )가 화면을 찾아서 처리한다.
스프링 부트 템플릿엔진 기본 viewName 매핑
resources:templates/ +{ViewName}+ .html
maven과의 차이점이 좀 어렵긴하다.
타임리프는 정적파일을 동적파일처럼 보는 것인 것 같다.
EL로 꺼내보는 것은 비슷하다.
5. 빌드하고 실행하기
gradlew.bat로 실행하면된다.
콘솔로 이동
1../gradlew build
2.cd build/libs
3.java -jar hello-spring-0.0.1-SNAPSHOT.jar
4.실행 확인
윈도우 사용자를 위한 팁
콘솔로 이동 명령 프롬프트(cmd)로 이동
./gradlew로 gradlew.bat 를 실행하면된다.
실제 빌드하고 배포할때는 이런식으로 한다는 것이다.
개발공부시에는 그냥 이클립스를 사용하면된다.
과거에는 톰캣 설치하고 그랫어야햇는데 그럴필요가 없다.
이부분은 나중에 알아두고 사용하자
스프링 웹 개발 기초
6. 정적 컨텐츠
클라이언트에게 파일을 전달하는 것은 세가지가 있다.
정적 컨텐츠는 그냥 html파일을 뿌려주는 것이다.
템플릿엔진은 html을 view로 조작해서 보여주는 것이다.
api는 json포맷으로 클라이언트에게 전달하는데 이런 방식이다.
정적컨텐츠는 그냥 전달하는 것이다.
스프링부트는 정적파일을 그냥 제공한다.
static파일에서 찾아서 제공한다.
http://localhost:8080/hello-static.html
서버주소로 검색하면 나오게 된다.
원하는 파일을 넣으면 그대로 반환되고 대신 프로그래밍을 하지 못한다.
웹브라우저에서 http://localhost:8080/hello-static.html을치면
먼저 내장 톰캣서버가 스프링에게 넘긴다.
스프링컨테이너에서 관련 컨트롤러를 찾아본다.
이게 없으면 static에서 찾아서 반환하게 된다.
7. MVC와 템플릿 엔진
MVC라는것은 Model View Controller이다.
과거에는 분리되어 잇지 않앗다.
요새는 나눠서한다.
View는 관심사를 분리해야한다. view는 그냥 화면을 그리는 것이다.
타임리프를 뷰로 사용한다.
웹사이트에서 name이라는 파라미터를 받아서 넘겨서 보자.
타임리프의 장점은 파일자체를 복사해서 소스보기를 하면 html을 그대로 쓰고 껍데기를 볼 수있다.
템플릿엔진이 동작하면 매핑되서 보여지게 된다.
<p th:text="'hello ' + ${name}">hello! empty</p>
이처럼 p태그에 내용을 넣어놓는 것은 마크업하는 사람들이 볼때 뭔가 적어두고 볼 수 있게 하는것이다.
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
8. API
정적을 제외하면 api와mvc뿐이다.
@ResponseBody 어노테이션은 문자를 그대로 반환한다.
@ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않는다.
대신에 HTTP의 BODY에 문자 내용을 직접 반환한다.(HTML BODY TAG를 말하는 것이 아님)
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
문자가 아니라 객체를 출력한다고 해보자.
@ResponseBody 를 사용하고, 객체를 반환하면 객체가 JSON으로 변환되어서 나온다.
최근에는 거의 JSON으로 반환해서 사용하는게 기본이다.
@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가 붙어있으면
viewResolver 대신에 HttpMessageConverter 가 동작한다.
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
JSON반환하는게 두가지가 있는데 Jackson이 보통 많이 쓰인다.
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있다.
2023.05.02
gradle과 타임리프를 처음접해본다.
기초지만 새로운 공부가 될 것같다.
-> gradle문제인지 java 11이 스프링 3.0x이상에선 작동을 안한다
학습용으로 스프링 버전도 낮춰보았다.
java 17버전으로 할지 11로할지는 진행해보면서 정하면될듯하다.
maven에서는 문제가 잇는 건 아니엇는데 수정이 쉬워서 확인하면서 해보면 될듯하다.