728x90

정적 컨텐츠

정적 컨텐츠는 클라이언트의 요청을 받고 서버에 미리 저장된 파일을 그대로 응답해주는 것이다.

모든 클라이언트에 동일한 작업을 한다.

더보기

 

1. .../resources/static에 hello-static.html 생성

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
</head>
<body>
정적 컨텐츠입니다!
</body>
</html>

 

 

2. 웹 브라우저에 [경로]/hello-static.html 입력

 

이게 어떻게 가능할까?

 

작동원리

출처 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)

1. 웹 브라우저에서 [경로]/hello-static.html로 접속한다.

2. 톰켓 서버에서 스프링 컨테이너 안에 hello-static관련 컨트롤러가 있는지 확인한다.

3. 없으면 .../resources/static폴더 안에 hello-static.html이 있는지 확인한다.

4. 있으면 해당 html 파일을 웹 브라우저에 전송한다.


MVC와 템플릿 엔진

더보기

Controller

앞서 작성했던 helloController에 다음 코드를 추가한다.

@GetMapping("hello-mvc")
public String helloMVC(@RequestParam("name") String name, Model model)
{
    model.addAttribute("name", name);
    return "hello-template";
}

웹브라우저에서 [경로]/hello-mvc라고만 주소를 입력하면 에러 페이지가 뜬다.

그 이유는 @RequestParam 어노테이션 때문이다.

메서드가 실행되기 위해서는 이름 그대로 변수를 브라우저에서 입력을 받아야 한다.

 

어떻게?

[경로]/hello-mvc?name=helloooooo

그러면 @RequestParam("name") String name의 변수 값이 "helloooooo"로 들어오게 된다.

 

그리고 "name"과 변수 값을 모델에 추가하고 View에 전송한다.

 

View

.../resources/templates 폴더에 다음 html을 생성한다.

<html xmlns:th="http://www.thymeleaf.org"> // 템플릿 엔진 불러오기
<body>
<p th:text="'hello ' + ${name}"></p> // text의 값이 태그 안에 들어온다.
</body>
</html>

컨트롤러에서 받아온 name의 밸류값인 helloooooo가 들어오게 된다.

그러면 text변수는 hello helloooooo가 되고, 그 값이 표시된다.

 

 

결과


API

더보기

helloController에 다음 코드를 추가한다.

static class Hello
{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) 
    {
            this.name = name;
    }
}

@GetMapping("hello-string")
@ResponseBody // html의 body부분을 반환값으로
public String helloString(@RequestParam("name") String name, Model model)
{
    return "hello " + name;
}

@GetMapping("hello-api")
@ResponseBody // html의 body부분을 반환값으로
public Hello helloApi(@RequestParam("name") String name, Model model)
{
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

 

@ResponseBody는 html의 body를 반환값으로 한다.

 

예제 1.

@GetMapping("hello-string")
@ResponseBody // html의 body부분을 반환값으로
public String helloString(@RequestParam("name") String name, Model model)
{
    return "hello " + name;
}

위 결과에서는 @RequestParam("name") String name의 값을 받고 메서드를 실행한 다음, 그 반환값을 body에 넣었다.

 

사실 이 결과는 의미가 없다고 볼 수 있다.

 

예제 2.

@GetMapping("hello-api")
@ResponseBody // html의 body부분을 반환값으로
public Hello helloApi(@RequestParam("name") String name, Model model)
{
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

위 결과에서는 @RequestParam("name") String name의 값으로 새로운 객체를 생성하고,

해당 객체를 반환함으로써 JSON형태의 데이터를 body에 넣었다.

 

출처 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)

@ResponseBody 어노테이션이 없었으면 그냥 맞는 템플릿(html문서)를 찾아서 돌려줬는데

@ResponseBody 어노테이션이 있으면 그냥 그대로 데이터를 넣게 된다.

 

그리고 만약 반환값이 객체이면?

JSON으로 변환한다.

 

즉, 핵심은

API방식은 객체를 JSON으로 변환 후 반환하는 것이라고 할 수 있다.

728x90

'Spring' 카테고리의 다른 글

Spring TIL - 01 스프링 환경설정  (0) 2024.04.04
728x90

스프링을 따로 공부하려고 했는데 프로젝트 생성에서부터 막혔다..

 

프로젝트 환경설정

 

사전 준비물 :

JAVA 17 설치

IntelliJ IDE 

 

 

스트링 부트 스타터 사이트에서 스프링 프로젝트 생성

더보기

이 사이트는 스트링 부트 기반의 프로젝트를 만들어주는 사이트이다.

https://start.spring.io/

나는 Gradle프로젝트로 생성할 것이다.

 

언어는 Java로 설정했고, 스프링 부트 버전은 그냥 3.2.4로 설정했다.

 

프로젝트 메타데이터

 

Group은 그냥 무시했다.

Artifact는 프로젝트 명으로 생각하면 된다.

 

Defendencies(중요)

spring boot기반의 프로젝트를 만들 것이다.

웹 프로젝트를 만들 예정이기 때문에 Spring Web을 추가하고,

브라우저의 html을 만들어 주는 템플릿 엔진인 thyme leaf도 추가한다.

 

 

결과 화면

 

Java파일은 java 폴더에 들어가고 xml이나 설정파일, html같은 파일은 resources에 들어간다.

 

프로젝트를 실행해보면 아래 터미널에서 

Tomcat started on port 8080이라는 것을 볼 수 있다.

실제로 

localhost:8080에 접속하면 뭐가 뜨긴한다!

라이브러리

더보기

build.gradle파일에 가보면 dependencies에 적용한 spring web과 타임리프가 있다.

하지만 이것들도 구현할 때에 사용한 다른 라이브러리와의 의존성이 존재한다.

우리는 이것들을 이미 다 설치했다.

 

View 환경설정

더보기

Welcom Page 만들기

프로젝트를 실행하고 localhost:8080에 접속하면 뭐가 뜨긴 했는데 error페이지가 나왔다.

이건 그냥 아무것도 없어서 뜨는거다.

 

<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
</head>
<body>
HelloWorld
<a href="/hello">hello</a>
</body>
</html>

위 코드를 .../resources/static 폴더 안에 넣어보자

결과화면 : 

스프링에서는 기본적으로 index.html파일을 웰컴 페이지로 설정한다.


타임리프 템플릿 엔진

 

위에서는 적어놓은 index.html파일을 그대로 넘겼다.

템플릿 엔진을 쓰면 다음과 같은 장점이 있다.

  • 동적 컨텐츠 처리
  • 재사용성
  • 유지보수성

등등..

 

뭔가 동작하는 화면을 보여주겠다.

 

1. java 파일을 생성한다.(HelloController)

package com.example.daeheespring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("hello") // localhost:8080/hello라고 입력 하면 아래의 메서드가 실행된다.
    public String hello(Model model)
    {
        model.addAttribute("data","hello!!");
        return "hello";
    }
}

 

2. .../resource/template 폴더에 html 파일을 생성한다.(hello.html)

<!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>

 

3. 프로젝트를 실행하고 기존의 주소(localhost:8080) 뒤에 /hello를 추가한다.

4. 컨트롤러로 지정한 HelloController의 "hello"로 매핑한 hello메서드가 실행된다. (반환값인 "hello"는 "hello.html"로도 쓸 수 있다.

5. model.addAttribute()함수를 호출하여 data라는 값을 "hello!!" 로 설정한다.

6. 타임리프가 적용되는 p태그에서의 data변수는 컨트롤러의 hello메서드로 인해 "hello!!"로 값이 초기화된다.

 

작동 원리

출처 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술(인프런)

1. 웹 브라우저에서 localhost:8080/hello에 접속

2. 스프링 안에 내장되어있는 톰켓 서버가 helloContoller에 "hello"가 매핑된 hello메서드를 실행

3. 컨트롤러에서 리턴값으로 문자를 반환하면 뷰 리졸버(viewResolver)가 화면을 알아서 찾아준다.

4. 모델에 저장된 키:밸류 값을 화면에 적용한다.

빌드/실행(Mac만 ㅎ)

더보기

 

 

1. 프로젝트 위치로 이동

2. ./gradle build 입력 (빌드 됨)

3. ./build/libs로 이동

4. java -jar 프로젝트명-?.?.?-SNAPSHOT.jar 실행

 

728x90

'Spring' 카테고리의 다른 글

Spring TIL - 02 스프링 웹 개발 기초  (0) 2024.04.05

+ Recent posts