seonggoc
2. Spring 웹 개발 기초 (김영한 스프링 입문 강의 정리) 본문
Spring은 3가지 방식으로 응답을 한다.
- 정적 컨텐츠
- MVC와 템플릿 엔진
- API
위 3가지 방식으로 응답을 하는데, 이전 Django 프로젝트를 보면 API, MVC, 정적 컨텐츠 순으로 많이 활용할 것 같다.
웹 개발 기초
1. 정적 컨텐츠
정적 컨텐츠는 src/main/resources/static 폴더에서 그냥 정적으로 파일만 전달하는 역할을 한다.
Webserv 프로젝트를 했을 때 C++로 Nginx를 구현했었는데... 그게 여기서 도움이 되는 것 같다.
TMI를 하자면 그때 기억나는 게 모든 파일을 string으로 보냈었는데 그림과 같은 파일에 수많은 0이 있다 보니 문자열 끝 NULL로 받아들여서 고민하다가 vector로 변경했던 기억이 있다.
아무튼 정적 컨텐츠는 서버가 가지고 있는 파일을 있는 그대로 보내는 것이다.
작동 방식은 위와 같이 컨트롤러를 먼저 확인하고, 관련된 컨트롤러가 없다면, 정적 컨텐츠가 있는지 확인을 하는 방식이다.
실제로 소스코드에서 null 체크를 해서 있는지 확인하고 넘어간다.
2. MVC와 템플릿 엔진
- html을 동적으로 렌더링 해주는 것을 템플릿 엔진이라 한다
- 템플릿 엔진을 사용하기 위해 Model, View, Controller(MVC)라고 한다.
Thymeleaf를 봤을 때 html에서 작성을 하기에 오해할 수 있지만 클라이언트가 아니라 서버에서 렌더링 해서 보내준다.
@GetMapping("hello-mvc")
public String hellMvc(@RequestParam("name") String name, Model model)
{
model.addAttribute("name", name);
return "hello-template";
}
위와 같이 코드를 짜면 Get방식으로 param을 받을 수 있다.
ex) http://localhost:8080/hello-mvc?name=hi
- localhost:8080/hello-mvc // Get request
- 톰캣 서버를 통해 helloController가 hello-mvc로 mapping된 메서드를 호출해 준다.
- addAttribute로 model 생성해 준다.
- viewResolver가 return과 일치하는 템플릿 html을 찾는다
- thymeleaf 템플릿 엔진에게 처리해 달라고 넘긴다.
- thymeleaf가 렌더링 해주고, 반환
3. API
API는 보통 json을 통해 데이터를 주고받는다.
지금까지는 html 문서를 전달하여 렌더링 하였지만, API는 특정한 데이터가 필요할 때 전달을 한다.
server-side rendering된 pingpong 게임이라면 서버가 공의 좌표, 플레이어 바의 위치 좌표를 json을 통해 계속 쏴준다.
API 기본 사용법
@GetMapping("hello-string")
@ResponseBody // http body 직접 전달
public String helloString(@RequestParam("name") String name) {
return "hello " + name; // param으로 받은 게 그대로 요청한 서버에 바로 전달
}
위와 같이 컨트롤러에서 ResponseBody annotation을 사용하면 html을 찾아서 보내는 게 아니라 response body 부분에 직접 전달한다.
하지만 위에서 말한 것처럼 Json형태가 기본 형태인데, parsing 작업을 또 해야 하는 번거로움이 있어, 객체를 통해 Json을 만드는 것도 지원한다.
API class 활용 방법
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello; // hello 객체 자체를 리턴함
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
위와 같이 짜고 나서, http://localhost:8080/hello-api?name=hi를 실행하면 돼야 한다.
하지만.. 강의가 예전 버전이라 계속 에러페이지가 떴다.
Spring 2.x 버전 이상에선 Jackson이라는 라이브러리를 깔아줘야 실행이 된다.
1. gradle.build에 코드를 삽입한다.
dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
2. 프로젝트 최상위 디렉토리에 간 후 아래의 명령어를 치면 해결된다.
# 지웠다가 다시 빌드
./gradlew clean build
@ResponseBody로 인해 data를 그대로 넘겨주게 되는데, 이때 객체를 넘겨주면 data가 아니라 Json 형식으로 가공해서 response 해주게 된다.
- @ResponseBody로 인해 HTTPMessageConverter가 동작함
- String이 아니라 객체가 반환되어 JsonConverter가 동작함
- Json 형태로 응답
'Spring' 카테고리의 다른 글
5. 웹 MVC 개발 (김영한 스프링 입문 강의 정리) (0) | 2025.02.18 |
---|---|
4. 스프링 빈과 의존관계 (김영한 스프링 입문 강의 정리) (0) | 2025.02.12 |
3. 회원 관리 예제 (김영한 스프링 입문 강의 정리) (0) | 2025.02.11 |
1. Spring 프로젝트 환경설정 (김영한 스프링 입문 강의 정리) (1) | 2025.02.06 |
Spring Boot 튜토리얼 (1) | 2024.12.30 |