web/스프링
<스프링 입문> 스프링 웹 개발 기초
nongdamgom
2024. 1. 30. 00:22
인프런 <스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술> by 김영한
섹션 1
기본 환경설정
예전에 인텔리제이를 깔아둬서 그냥 인텔리제이를 사용하기로 함(이클립스 지워야지...ㅎ)
일단
start.spring.io로 가서 기본 설정 해주고 generate 해주면, 기본파일 zip이 다운로드됨
그걸 인텔리제이에서 열어주면 끝.
maven 과 gradle => 요즘은 gradle을 많이 쓴다고 한다.
들으면서 메모해둔 내용 자잘한 내용
더보기
라이브러리
thymeleaf, web, test 이 세가지 사용 중
근데 실제라이브러리 들어가보면 엄청나게 많음 => 요즘에는 웹 만들 때 이정도 라이브러리는 다 땡기고 시작해야 함
예를들어 starter-web 같은 라이브러리 하나만 써도, 의존관계 엮여있는 라이브러리 다 같이 땡겨옴(gradle 이)
그냥 자바 메소드 하나 실행해주면 웹이 뜬다.. 편해졌다.
현업에선 println 보다 "로그"를 사용해서 출력
logback을 이용해서 로그를 출력... + slf4도 사용
스프링 부트 기본 구조
- 라이브러리같은건 차치하고, 제일 중요해보이는 것
- src의 main 내에 java 폴더와 resources 폴더 존재
- java : main 함수와 controller 존재
- resources : 사용되는 파일 모음
controller ?
- 스프링 내에서 웹과 연동을 시킬 때 이거저거 하게 만드는거..?
- 설명하라고 하니 모르겠음 그냥 느낌적인 느낌으로 보면 앎
웹 띄우는 방법
package hello.hellospring;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloSpringApplication {
public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
/* springbootapplication이 tomcat 이라는 서버를 내장하고 있어서
main을 실행해주면 그 서버를 자체적으로 띄우면서 스프링부트를 실행한다.*/
}
}
- 여기서 그냥 main 함수 실행하면 localhost 포트 번호가 생성되고, 아무 브라우저에다가 그 포트번호를 던지면 된다.
*** 커맨드로 띄우는 방식(IDEA를 사용하지 않고 서버 배포할 때)
- 파일 있는 곳에 가서 gradlew build
- build 성공하면 cd build, cd libs 한 후
- dir 명령어 치면, 내가 만든 스프링부트의 jar 파일이 보일거임
- 이후 java -jar (jar 파일 이름 복붙)
- 이렇게 해주고 포트번호만 복붙해서 뿌리면 됨
섹션 2
웹 개발 기초
스프링에서 웹을 띄우는 방식이 크게 세가지 존재
1. 정적 컨텐츠
2. MVC와 템플릿 엔진
3. API
1. 정적 컨텐츠
- 컨트롤러가 없으면 스프링부트가 자동으로 static 밑 파일을 검색
- 거기에 있는 파일을 그냥 냅다 웹으로 던져서 반환
- 서버에서 html을 수정하지 못하고 그냥 단순하게 띄워주기만 할 수 있다.
2. MVC와 템플릿 엔진
- MVC : Model, View, Controller
- 컨트롤러가 존재함
- 컨트롤러 내에서 mapping된 method를 보고, 반환값(html 파일 이름)을 확인
- template 파일 밑에 반환값으로 된 파일을 웹에 띄워줌
@Controller
public class HelloController {
@GetMapping("hello") // web /hello(클릭 했거나 웹이 hello로 움직였다는 뜻) 로 갔을 때 이 method를 호출해줌
public String hello(Model model){
model.addAttribute("data", "hello!!"); //그럼 여기서 나타내줄 값 넣어줌
return "hello"; // html 파일 이름 => hello.html로 렌더링 해라(기본적으로 템플릿 밑의 파일을 찾음)
}
@GetMapping("hello-mvc")
/* @RequestParam(value : 넘어올 값, required : 디폴트는 true, false로 하면 값 안넘겨도 됨)
웹에서 /hello-mvc?name= 여기로 넘어올 값이 value 값 == 즉 name으로 넘어갈 파라미터 값*/
public String helloMvc(@RequestParam(value = "name") String name, Model model){
model.addAttribute("name", name);
return "hello-template";
}
}
- 당연히 파라미터값 받기 가능
- 이런식으로 웹에서 넘겨주는 값을 받아서 처리를 해줌
- 정적 컨텐츠와 달리 서버에서 html 수정을 할 수 있음
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
<!--hello! empty는, 이 html 파일을 웹 자체에 던졌을 때 (그러니까 정적으로 열었을 때?) 보여지는 내용
템플릿을 사용해서 html 파일을 활용하면 태그 내부의 내용으로 저 내용이 치환이 된다고 한다.-->
</body>
</html>
- 이런식으로 hello-template 내의 html 코드를 수정해서 웹으로 보내는 방식
- controller에서 model에 속성을 추가해주고
- html에서 model의 key 값을 활용하여 ${name} 이런식으로 넣어주면, value 값으로 도출됨.
3. API
- 컨트롤러가 넘어와서 @ResponseBody를 사용
- 위에서 반환값을 viewResolver로 넘겨준것과 달리, Http body부분 자체를 수정한다.
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody // 파라미터로 받은 값으로 html 태그를 수정하는 방식(mvc)이 아니라, 단순 무식하게 string 자체를 변환해서 띄워줌
public String helloString(@RequestParam("name") String name){
return "hello " + name;
}
@GetMapping("hello-api")
@ResponseBody
// 이게 진짜 많이 쓰이는 api 방식 => json 방식
/* json? key value로 이루어진 구조 */
// 요즘 많이 쓰이는 방식이라고 한다.
public Hello helloApi(@RequestParam("name") String name){
Hello hello = new Hello();
hello.setName(name);
return hello;
/* @ResponseBody 를 보면 컨트롤러가 viewResolver 대신에 HttpMessageConverter 을 동작시킴
위의 경우처럼 일반 string이라면 StringConverter를 동작시키고
지금처럼 객체를 넘기는 경우라면 JsonConverter를 동작
*/
}
static class Hello{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- viewResolver가 resources 밑의 html 파일을 보고 변환하는 것이 아니라,
- 그냥 웹으로 바로 mapping된 주소를 던지면 http가 바로 변환되고, 그대로 웹에 띄워진다.
- api를 쓰는 것은 대부분 json 방식을 사용한다고 생각하면 된다고 한다.
- 즉 return hello 부분에서 객체를 넘겨주면, "name"이 키가 되고, 파라미터로 입력 받을 값이 value가 돼서
이런 식으로 웹에 띄워지게 된다.