Static resource
: 서버 처리 필요 없이 바로 클라이언트로 응답하는 처리 방식
특징
- 특정 URL로 요청이 오면 static resource로 인식하고 바로 응답 수행 필요
(반대개념)
Dynamic resource
: 요청을 보내면 서버측까지 도달해서 필요한 메소드를 호출하고 리턴하는 방식
Spring에서는 Static resource와 Dynamic resource를 분리해, static resource 응답을 빠르게 해줄 수 있도록 지원한다.
요구사항 1. /hello 요청 시 resources/templates/static.html 페이지가 응답할 수 있도록 설정
=> localhost:8080/hello 요청이 들어오면 내부에서 resources/templates/static.html 정적 파일을 보여줄 수 있도록 설정
요구사항 2. 쿼리 파라미터로 name 요청이 들어왔을 때 해당 값을 hello.html에서 사용할 수 있도록 하기
=> 쿼리 파라미터로 name 요청이 들어왔을 때, 해당 값을 hello.html에서 보여주기
1. 컨트롤러 메서드 작성
2. 쿼리 파라미터로 전달된 값을 'hello.html'템플릿에서 사용할 수 있도록 하기
[@GetMapping]
: Spring Framework에서 제공하는 어노테이션
HTTP GET 요청을 처리하기 위해 사용된다. 이 어노테이션을 사용해, 특정 URL 경로에 대한 GET 요청을 특정 메서드에 매핑할 수 있다.
이는 주로 RESTful 웹 서비스에서 데이터를 조회하는 용도로 사용된다.
*매핑(mapping): 특정 URL 요청을 특정 메서드에 연결하는 것을 의미한다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}
@GetMapping("/hello")는 "/hello" 경로로 들어오는 GET 요청을 'sayHello' 메서드에 매핑한다.
따라서 사용자가 브라우저에서 'http://localhost:8080/hello'로 접근하면, "Hello, World!"라는 문자열을 응답으로 받게 된다.
(@GetMapping은 @RequestMapping 어노테이션의 축약형으로, 아래와 같은 방식으로도 구현이 가능하다. )
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@RequestMapping(value = "/hello", method = ReqeustMethod.GET)
public String sayHello() {
return "Hello, World!";
}
}
=> @GetMapping은 코드의 가독성을 높이고 RESTful 서비스 개발을 편하게 만들어 준다.
@RestController는 이 클래스가 RESTful 컨트롤러 임을 나타낸다.
그러면 RestController는 라우터는 아닌거지?=> yes
: @RestController는 Spring Framework에서 제공하는 어노테이션으로, 해당 클래스가 RESTful 웹 서비스의 엔드포인트를 정의하고 있다는 것을 나타냄
그러나, 이것 자체는 라우터는 아님.
그냥 라우팅 설정역할을 하는 메서드와 함께 사용될 뿐임
Spring에서 라우팅을 담당하는 부분
:@RequestMapping
@GetMapping
@PostMapping 등의 어노테이션
위 어노테이션들이 HTTP 요청을 특정 메서드에 매핑함.
@RestController는 위 어노테이션을 포함하는 클래스이고, RESTful API를 제공한다는 의미를 가짐.
Membercontroller.class
package cholog;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class MemberController {
@GetMapping("/hello")
public String world(@RequestParam (name = "name", required = false, defaultValue = "World") String name, Model model) {
// TODO: /hello 요청 시 resources/templates/static.html 페이지가 응답할 수 있도록 설정하세요.
// TODO: 쿼리 파라미터로 name 요청이 들어왔을 때 해당 값을 hello.html에서 사용할 수 있도록 하세요.
model.addAttribute("name", name);
return "static";
}
public Person json() {
// TODO: /json 요청 시 {"name": "brown", "age": 20} 데이터를 응답할 수 있도록 설정하세요.
return null;
}
}
그동안 나혼자 이상한거하고 있었는듯; main에서 가이드 안보고 코드부터 뜯을 생각(MemberController부터 할 생각)했음
다시 cholog https://cho-log.github.io/docs/spring/spring-mvc-1 이 페이지 보고 다시 하는중
스프링 시작하기
1. Welcome Page
스프링 부트는 정적 페이지와 템플릿 시작 페이지를 모두 지원한다.
먼저 구성된 정적 콘텐츠 위치(main/resources/static/)에서 index.html 파일을 찾습니다. 하나라도 없으면 index 템플릿 (main/resources/templates/)을 찾는다. 둘 중 하나라도 찾으면 자동으로 응용 프로그램 시작 페이지로 사용된다.
처리 방법: 일단 main에 있는 resources/static/hi.html 의 이름을 index.html로 바꾸고 실행하니까 테스트 통과함
2 Static Page
resources/static 아래의 경로에 위치한 파일은 접근이 가능하다. 서비스에서 필요한 정적 자원들을 해당 경로에 위치시킨 후 활용할 수 있다.
static과 templates폴더의 차이는?
:static 디렉토리와 tmeplates 디렉토리는 서로 다른 목적을 가진 파일들을 저장한다.
static 디렉토리
목적: 정적 리소스를 저장한다.
내용: css, javaScript, image, font 등과 같은 정적 파일.
기본 경로: src/main/resources/static
접근 방법: 브라우저에서 '/static' URL 경로를 생략하고, 정적 리소스의 경로를 직접 사용한다.
ex) src/main/resources/static/image/logo.png => http://localhost:8080/images/logo.png 로 접근할 수 있다.
templates 디렉토리
목적: 동적 템플릿 파일을 저장한다.
내용물: Thymeleaf, FreeMarker, JSP 등과 같은 템플릿 파일.
기본 경로: src/main/resources/templates
접근 방법: 컨트롤러를 통해 템플릿을 렌더링하고 클라이언트에게 HTML 페이지로 제공함.
ex) src/main/resources/templates/hello.html 파일은 컨트롤러에서 return "hello"; 와 같이 반환하면 브라우저에 렌더링 된다.
처리 방법: 일단 main에 있는 resources/templates/static.html을 resources/static/static.html 으로 위치 변경함
3. Template Engine
동적으로 페이지 처리를 하기 위해서는 템플릿 엔진을 활용할 수 있다. 이번에는 Thymeleaf를 활용해 요청에 대한 동적 처리를 한다.
쿼리 스트링(?name=brown)으로 전달된 name 값을 @RequestParam을 활용하여 컨트롤러 메서드의 파라미터로 주입받는다.
컨트롤러 메서드 내에서 뷰로 값을 전달하기 위해서 Model 객체를 활용한다.
Model 객체는 컨트롤러 메서드의 파라미터로 주입 받을 수 있고, addAttribute 메서드를 통해 값을 전달할 수 있다.
처리 방법: 일단 main에 있는 MemberController 코드 수정하고 name 코드가 있는 경우와 없는 경우 조건문으로 반환값 다르게 작성해줌. 단, 쿼리 파라미터가 없는 경우에는 static을 반환해야한다고 기존 코드 가이드라인 주석에 적혀있었는데, static.html은 static폴더에만 존재했는데 아마 자동으로 static폴더에서 static.html을 반환하지 않았나 싶음.. 맞는지 확인 필요함
4. Json 응답
컨트롤러 메서드(웹 요청을 처리하는 함수)의 리턴타입을 그대로 body에 담아 응답하기 위해서는 @ResponseBody를 활용할 수 있음
해당 어노테이션을 사용하면, 컨트롤러 메서드가 반환하는 데이터를 그대로 웹 응답의 본문(body)에 담아 보낼 수 있음
해당 상황은 다음과 같이 비유하여 설명할 수 있음.
: 친구에게 편지를 보내는 상황이고, 편지지에 글을 써서 편지 봉투에 넣어 보낼 수 있는 상황임.
그러나 친구가 바로 편지가 쓰여진 편지지을 받고 싶어 한다면, 편지 봉투 없이 바로 편지만 보낼 수있음
- 편지지에 글을 쓰고 편지 봉투에 넣는 것 => 컨트롤러 메서드가 HTML 페이지를 반환하는 것을 의미함
- 편지지를 바로 보내는 것=> 컨트롤러 메서드가 데이터를 그대로 웹 요청의 응답으로 보내는 것이고, 이때 @ResponseBody를 사용
처리 방법: 바로 return 값에 데이터를 넣어 보내면됨
참고
*쿼리 스트링: https://dayae-dev.tistory.com/356
따로 궁금했던점
- 자바는 왜 클래스에서 한줄 띄우고 시작하는지?
- => 가독성을 높이기 위한 관습
- => 컨벤션(많은 Java 코딩 스타일 가이드와 컨벤션에서 클래스 선언부와 클래스 몸체 사이에 한 줄을 띄우는 것을 권장함)
'프레임워크 > Spring' 카테고리의 다른 글
Spring Core 1 (0) | 2024.08.14 |
---|---|
Spring JDBC(Java Database Connectivity) 1 (0) | 2024.08.12 |
Spring mvc 4 (MVC Configuration, View Controller, Interceptor, Argument Resolver) (0) | 2024.08.06 |
Spring mvc 3 (예외처리) (0) | 2024.08.05 |
Spring mvc 2 (CRUD API) (0) | 2024.08.05 |