- 김영한 강사님이 제공하시는 인프런 - "스프링 입문 - 코드로 배우는 스프링 부트, 웹, MVC, DB 접근 기술" 강의를 듣고 정리한 내용입니다.
- 강의 링크
스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
정적 컨텐츠
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
코드 작성 후 http://localhost:8080/hello-static.html 페이지에 들어가면
정적 컨텐츠가 보인다.
동작 원리
1. 웹 브라우저에서 http://localhost:8080/static.html 주소에 들어간다
2. 내장 톰켓 서버가 요청을 받고, 스프링 부트가 컨트롤러에 hello-static.html 관련 컨트롤러가 있는지 확인을 한다. (컨트롤러가 먼저 우선순위를 가짐)
3. 컨트롤러 파일이 없으면 다음으로 넘어가 static 관련 html 이 있는 지 확인 한다.
4. 관련 파일을 찾으면 웹 브라우저에 바로 보내준다.
MVC
MVC 패턴 실습
기존에 만들었던 HelloController.java 파일에 새로운 controller 내용 추가
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
코드를 자세히 보면
@GetMapping("hello-mvc")
: "localhost:8080/hello-mvc" 경로에 대한 GET 요청을 처리하는 메서드를 정의
public String helloMvc(@RequestParam("name") String name, Model model)
: 이 메서드는 name, model 두 개의 파라미터를 받는다.
model.addAttribute("name", name);
: 이 코드는 Model 객체에 "name"이라는 이름으로 데이터를 추가.
return "hello-template";
: "hello-template"이라는 뷰의 이름을 반환. 스프링은 이 뷰 이름을 View Resolver에 전달하여 실제 뷰를 찾아 렌더링하고, 모델에 담긴 데이터를 뷰로 전달하여 화면에 표시
controller를 만들었으므로 그 화면에 대한 templates인 resources/templates/hello-template.html 파일 새로 만들기
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
HelloController에서 모델에 추가된 "name" 변수의 값이 ${name}에 들어가게 된다.
실행하고 접속할때 Controller에서 @RequestParam("name"), 즉 name Required가 true이기 때문에 name 값을 넣어서 접속해야 한다!!
http://localhost:8080/hello-mvc?name=myfirstspring!
으로 접속하면 아래처럼 페이지가 뜬다.
템플릿 엔진
API
Application Programming Interface의 약자로, 애플리케이션 간에 데이터를 주고받는 데 사용되는 인터페이스를 의미
API 기초 실습
이번에도 기존에 만들었던 HelloController.java 파일에 새로운 controller 내용 추가
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
@ResponseBody
: 이 어노테이션은 메서드가 반환하는 값이 HTTP 응답의 본문으로 사용됨을 나타냄. 즉, 메서드가 반환하는 값은 HTTP 응답의 본문에 직접 포함되어 클라이언트로 전송 public String helloString(@RequestParam("name") String name);
: name이라는 이름의 요청 파라미터를 받음return "hello " + name;
: "hello"라는 문자열과 요청 파라미터로 받은 name 변수를 결합하여 반환⇒ 이 코드는 "/hello-string" 경로로 GET 요청이 들어오면, 요청에 포함된 "name" 파라미터 값을 받아 "hello {name}" 형식의 문자열로 응답
코드를 실행하고 http://localhost:8080/hello-string?name=Spring 페이지로 접속하면
hello-mvc와 똑같은 화면이 뜬다.
더 자세히 보기 위해 페이지 소스를 보면
값이 그대로 웹 브라우저에 내려간 것을 볼 수 있다.
스프링 부트에서의 API 구현
1. 컨트롤러 생성: 먼저 API의 엔드포인트를 처리할 컨트롤러 클래스 생성. 이 클래스에 API의 요청을 처리할 메서드 정의.
2. RequestMapping 설정: 각 메서드에는 @RequestMapping 또는 @GetMapping, @PostMapping과 같은 어노테이션을 사용하여 요청 경로 설정.
3. API 응답 처리: API의 요청을 처리하는 메서드에서는 요청을 받아서 필요한 로직을 수행한 후, 응답으로 전송할 데이터를 생성.
4. 데이터 전송: API 응답 처리 메서드에서는 데이터를 HTTP 응답 본문에 담아 클라이언트로 전송.
5. 서버 실행: API가 정의된 스프링 부트 애플리케이션을 실행하면, API가 요청을 받아들이고 처리할 준비 완료.
어노테이션: 자바 프로그래밍 언어에서 메타데이터를 나타내는 특별한 형식의 표기법. 간단하게 @를 시작으로 구성된 노란색 코드 부분
@RestController
@GetMapping()
@ResponseBody 객체 반환
기존에 만들었던 HelloController.java 파일에 계속해서 새로운 controller 내용을 추가한다.
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
//객체 생성
hello.setName(name);
return hello;
//객체 전달
}
//HelloController 클래스 내에 정의된 내부 정적 클래스
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
코드를 자세히 보면
Hello hello = new Hello();
: Hello 클래스의 객체를 생성. 이 객체는 후에 JSON 형식으로 변환되어 응답으로 클라이언트로 전송 hello.setName(name);
: Hello 클래스의 setName 메서드를 호출하여 객체에 name 값을 설정.return hello;
: 위에서 생성한 Hello 객체를 반환.코드를 실행하고 http://localhost:8080/hello-api?name=Spring 페이지에 들어가면
이런 형태로 지금까지와는 살짝 다른 형태로 출력된다.
이는 JSON(JavaScript Object Notation) 형식으로 {"key":"value"} 형식으로 data가 웹 브라우저에 내려간 것이다.
@ResponseBody 사용 원리
@ResponseBody