공부/Spring

스프링 입문 - 프로젝트 환경 설정2

Stair 2024. 10. 15. 10:40
반응형

https://surrealcode.tistory.com/84

 

스프링 입문 - 프로젝트 환경 설정

https://start.spring.io/ 스프링 부트 기반으로 스프링 프로젝트를 만들어주는 사이트이다. 요즘 추세는 Gradle 프로젝트를 진행한다. Java언어를 선택하고 최신 부트 버전을 선택한다.(SNAPSHOT이나 M이

surrealcode.tistory.com

 

이전에 스프링 프로젝트의 환경 설정을 진행했었다.

 

이번엔 코드를 짜고 프로그램을 직접 돌려보자.

package hello.hello_spring;

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);
    }

}

 

처음에 보이는 코드이다.

이 부분을 통해 실행한다.

또한 패키지들을 볼 수 있는데 우선 정적인 페이지를 생성하기 위해

resources/static 패키지에 index.html 파일을 만들고 아래의 코드를 복붙하자.

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

 

static은 말그대로 정적인 페이지로 변화하지 않는다. 그냥 이 코드를 실행시 끌어올리기만 한다고 생각하면 편할거 같다.

동적으로 따로 수정은 불가하다.

그럼 이제 실행시켜보자.

 

참고로 포트는 기본 포트인 8080이고

URL은 컴퓨터 내에서만 돌아가므로

localhost:8080이다.

 

이 부분은 스프링 실행 시 나타나는 콘솔의 로그로 알 수 있는데 

2024-10-14T23:10:40.481+09:00  INFO 13452 --- [hello-spring] [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'

로 8080포트를 쓰는것을 알 수 있다.

 

실행하면 다음과 같은 창이 뜨게 된다.

 

다음은 컨트롤러 생성을 해보자 

MVC에서 그 C가 Controller이다.

 

참고

M : Model

V : View

C : Controller

 

 

hello_spring의 아래에 controller라는 패키지를 하나 생성하고

HelloController라는 자바 파일을 생성하였다.

 

또한 resources/templates 밑에 hello.html을 생성하였다.

우리는 이전에 thymeleaf라는 템플릿 엔진을 사용하였기로 정하여서 여기선 thymeleaf라는 템플릿 엔진을 사용한다.

 

두 파일의 코드는 아래와 같다.

 

package hello.hello_spring.controller;


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

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data","hello!!");
        return "hello";
    }
}

 

컨트롤러는 클래스명 위에 @Controller라는 어노테이션을 꼭 붙혀야 한다.

또한 GetMapping("hello")가 있는데 이건 get,post방식 중 get방식으로 hello를 접근하게 해준다.

 

AddAttriabute()메서드를 보면 "data"은 아래의 html의 data에 "hello!!"값을 넣어주고

return "hello"는 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>

 

 

 

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

  - 스프링 부트 템플릿엔진 기본 viewName 매핑

  - 'resources:templates/' + <ViewName> + '.html'

 

따라서 결과는 다음과 같다.

정적 컨텐츠

정적 컨텐츠는 resources/static 파일 밑에 html을 서버에서 그냥 전달해준다.

웹브라우저에서 localhost:8080/hello-static.html을 치면 내장 톰캣 서버가 요청을 받고 스프링에게 넘긴다.

스프링은 hello-static에 관련된 컨트롤러를 찾아보고, 없다면 resources:static/hello-static.html을 반환한다.

 

 

 

MVC와 템플릿 엔진

MVC와 템플릿 엔진은 서버에서 html을 변경해서 내려주는 방식이다.

Model, View, Controller를 MVC라 한다.

 

View : 뷰는 화면을 그리는데 모든것을 집중해야 한다.

Controller : 비즈니스 로직을 처리하는데 모든 것을 집중해야 한다.

Model : 관련된 화면에서 필요한 것들을 담아서 화면으로 넘겨준다.

 

다음과 같은 코드를 보자.

@Controller
public class HelloController {

    @GetMapping("hello")
    public String hello(Model model){
        model.addAttribute("data", "hello!!");
        return "hello";
    }

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


}
<html xmlns:th="http://www.thymeleaf.org" >
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

 

hello-mvc를 get방식으로 매핑하는  메서드 helloMvc가 있다. 이 메서드는 name이라는 parameter를 받는다.

name=spring!!! 으로 파라미터를 받았다.

웹 브라우저에서 localhost:8080에 hello-mvc를 넘기면 스프링 부트를 띄울때 같이 뜨는 내장 톰캣 서버에 넘긴다.

내장 톰캣 서버는 hello-mvc라는게 왔다고 스프링한테 던진다. 스프링은 Controller에 매핑이 되어있는지 확인 후 return을 할 때 return은 "hello-template"이고 model의 키는 name 값은 spring을 스프링한테 넘겨준다.

 

그럼 스프링이 viewResolver(화면과 관련된 해결자)가 동작을 한다.

viewResolver는 뷰를 찾아주고 템플릿을 연결시켜준다. 

이 viewResolver가 templates/helllo-template.html이라는 return의 String네임과 똑같은 애를 찾아서 Thymeleaf 템플릿 엔진에서 처리해달라고 넘긴다.

그럼 템플릿 엔진이 렌더링을 해서 변환을 한 HTML을 웹 브라우저에 반환한다.

 

 

**정적일때는 변환 없이 그대로 반환을 해줬으나 이런 템플릿 엔진에서는 변환을 해서 웹브라우저에 넘겨준다.

 

 

 

API

JSON이라는 데이터 구조 포멧으로 클라이언트한테 데이터를 전달하는 방식이다.

MVC와의 다른 점은 html의 형식으로 내리는지, API 방식이라는걸로 데이터를 바로 내리는지의 차이이다.

 

다음 코드를 통해 확인해보자.

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name")String name){
    return "hello" + name;
}

 

@ResponseBody라는 어노테이션이 붙어있다.

@ResponseBody는 http 프로토콜의 바디부에 데이터를 내가 직접 넣어주겠다는 뜻이다.

서버를 재시작 해보면

결과가 잘 나오는 것을 볼 수 있다.

이전 코드와의 차이는

HTML태그같은게 하나도 없이 적은 문자가 그대로 내려간다는 점이다.

 

즉 이전에 했던 템플릿 앤진은 템플릿이 있는 상황에서 템플릿을 조작하는 방식이고, API 방식은 데이터를 그대로 내려준다.

이런 Api 방식은 아래와 같은 형태에서 강점을 나타내는데

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name){
    Hello hello = new Hello();
    hello.setName(name);
    return hello;
}

static class Hello{
    private String name;

    public String getName() {
        return name;
    }

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

 

이번엔 문자가 아닌 Hello형의 객체를 리턴한다.

이 방식이 제이슨이라는 방식이다. JSON은 키 값 쌍으로 이루어진 구조이다.

이전에는 XML형식으로 많이 사용되었지만 최근에는 JSON방식으로 통일이 되었다. 따라서 JSON 방식으로 반환하는게 기본이다.

 

옛날 레거시 프로젝트에서는 XML을 사용하기도 한다.

웹브라우저에서 localhost:8080/hello-api를 치면 톰캣 내장 서버에서 hello-api를 스프링에 던진다.

Controller단에서 처리를 하려 보니 @ResponseBody어노테이션이 붙어있는것을 확인하고 hello 객체를 json방식으로 데이터를 만들어서 HTTP 응답에 반환한다.

 

-@ResponseBody를 사용

  - HTTP의 BODY에 문자 내용을 직접 반환

  - 'viewResolver' 대신에 'HttpMessageConverter'가 동장

  - 기본 문자처리 : 'StringHttpMessageConverter'

  - 기본 객체처리 : "MappingJackson2HttpMessageConverter'

  - byte처리 등 기다 여러 HttpMessageConverter가 기본으로 등록되어있음

 

참고 : 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 'HttpMessageConverter'가 선택된다.

Jackson, Gson -> 객체를 json데이터로 만들어서 반환하는 라이브러리이다. Spring은 Jackson을 사용한다.

 

 

 

 

 

 

 

 

 

 

 

반응형

'공부 > Spring' 카테고리의 다른 글

객체 지향 설계와 스프링  (1) 2024.10.22
스프링 회원 관리 예제 2  (0) 2024.10.21
스프링 회원 관리 예제  (1) 2024.10.16
스프링 입문 - 프로젝트 환경 설정1  (1) 2024.10.11