인프런/스프링 입문

3. 스프링 웹 개발 기초(정적컨텐츠,mvc와 템플릿엔진,API)

backend dev 2022. 10. 3.

정적컨텐츠 방식

 

-> 저번에 했던 웰컴페이지처럼 서버에서 뭐하는거없이 html파일을 그냥 보여주는 방식

스프링부트는 resources/static에서 해당 html파일을 찾아서 보여준다.

해당위치에 실험용 html 생성

다음과 같이 파일명을 뒤에 붙이니 해당 html 내용을 그대로 보여줬다.

결과

정적컨텐츠 동작방식

1. 웹브라우저에서 톰캣으로 해당 url 전달 , 톰캣이 스프링에게 전달 , 스프링은 hello-static관련 컨트롤러를 찾아본다. 

전 시간에 hello를 가지는 컨트롤러는 있었지만 hello-static이 맵핑된 컨트롤러는 존재하지않음

 

2. 존재하지않으므로 스프링은 resources안에있는 hello-static.html을 찾아서 가져온다.

 

 


 

MVC와 템플릿 엔진 방식

-> mvc는 모델 뷰 컨트롤러 이고 템플릿 엔진은 html을 동적으로 보여줄때 사용한다.

요즘은 이 방식을 많이 사용한다.

 

MVC -> model , view ,controller

 

예전에는 컨트롤러 없이 뷰에서 처리했다 전 시간에 hello-template.html처럼 

 

뷰파일(jsp)에서 모든일을 처리하려고하니 코드가 길어져서 보기도 관리하기도 불편함

 

그래서 요즘은 컨트롤러랑 뷰를 쪼개는게 기본이 되었다

(뷰는 보여주는데 집중하고 , 컨트롤러는 관련 일처리를한 후 모델에다가 필요한 데이터를 담아서 넘겨주는게 MVC)

 

MVC 예시)

@GetMapping("hello-mvc")
    public String helloMVC(@RequestParam("name")String name ,Model model)
    {
        model.addAttribute("name",name); // 파람에서 넘어온걸 모델에 담는다.
        return "hello-template";

    }

helloController에다가 다음과같은 코드를 추가해준다.

model.addAttribute에서 모델에 값을 담고

return으로 해당 템플릿으로 모델을 보내주는 로직

return을 hello-template로 해주니 hello-template.html이 필요하므로 resources/template/에다가 하나 생성해준다. 

 

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

3번째줄에 뒤쪽 hello! empty는 타임리프가 작동하지않고 해당 html파일을 열기만 했을때 보여지는 부분이고

서버가 동작해서 타임리프가 작동하면 "'hello ' + ${name}" 이 부분이 보인다.

 

 

Tip

인텔리제이에서 컨트롤 + p 를 누르면 parameter info라고 파라미터로 어떤값을 넣어야하는지 확인할 수 있다.

required의 기본값은 true라고 친절히 알려줌.

 

required은 값을 필수로 넘겨야하는지 여부 ( 기본값 true == 넘겨야함)

value는 파리미터의 이름.

@GetMapping("hello-mvc")
    public String helloMVC(@RequestParam("name")String name ,Model model)
    {
        model.addAttribute("name",name); // 파람에서 넘어온걸 모델에 담는다.
        return "hello-template";

    }

이상태로 두고

 

서버를 실행해서

다음과 같이 작성하면 결과를 확인할 수 있다.

결과

?뒤에는 파라미터 이름 , = 뒤에는 값을 넣어준다.

jaehyun이 잘들어가서

hello-template.html의 "'hello ' + ${name}"  부분에서 name에 jaehyun이 들어간 결과를 확인 할수있다.

방금 진행한것의 동작방식 그림

 


 

API 방식

-> json이라는 데이터포맷으로 클라이언트에게 데이터를 전달하는 방식 

 

api방식을 확인하기위해 컨트롤러에 해당 코드 추가

 @GetMapping("hello-string")
    @ResponseBody // html 통신프로토콜에서 헤더와 바디가있는데 , 바디에다가 직접 데이터를 넣어주겠다는 뜻 // 템플릿엔진없이 뷰없이 그냥 값을 때려넣는다.
    public String helloString(@RequestParam("name")String name )
    {
        return "hello" + name;
    }

@ResponseBody 부분은 결과를 바디에다가 넣어 보내주겠다는 뜻.

템플릿엔진없이 ,뷰없이  바디내용을 때려박기 때문에 페이지 소스보기를해도 html관련 태그가없다.

 

결과
페이지 소스보기 해도 html관련 태그는 보이지않는다.

 

 

api 새로운 예

 

 

Tip

1. 클래스안에서 클래스를 생성할수있다. static을 붙이면 

예)

static class Hello
    {
        private String name;

        
        public String getName() {
            return name;
        }

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

2. 인텔리제이에서 getter,setter를 쉽게만드는방법 2가지 

  1. 오른쪽마우스클릭 generate 선택
  2. 알트 + 인설트

 

를 하면 위의 코드와 같이 생김.

getter와 setter은 자바빈 규약,프로퍼티 접근방식이라고 한다. 객체안에 private한 변수는 밖에서 접근못하므로 getter와 setter를 이용하는것(getter,setter는 public이므로)

 

3. 인텔리제이에서 컨트롤+쉬프트+엔터를 치면 자동완성해준다. ( 뒤에 세미콜론 알아서 붙여줌)

 

 

이제 api로 String말고 ,변수가 객체를 리턴해보자 ( 주로쓰는 api방식임)

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

}

위의 코드와 같이 Hello라는 객체를 리턴해준다.  결과를 확인해보자.

 

해당 결과모습 (소스보기해도 다음과 똑같이 나온다.)

Json 형식으로 결과값이 전달되는것을 확인할 수 있다.

 

json은 간단하게 키 밸류로 이루어진 구조이다. 

 

예전에는 html태그같이 태그 열고닫고 하는 xml방식을 사용했는데 요즘에는 심플한 json방식을 기본으로 사용한다.

 

ResponseBody  사용원리

ResponseBody&nbsp; 사용원리

1. 도메인을 입력해서 들어오면 톰캣이 스프링에게 알림 , 스프링이 컨트롤러에서 해당 매핑된 부분이 있는지 찾는다.

 

2. 위쪽에 정적방식이나 mvc방식같은경우에는 @ResponseBody라는 어노테이션이 없으므로 뷰리졸브를 이용해서 맞는 템플릿을 찾고 진행하는데 , ResponseBody를 이용하게되면 http 응답에 데이터를 넘겨버린다. 객체가 아닌애들은 그냥 넣어서 줬고 , 객체같은애들은 json형식으로 보내준다.

 

3. @ResponseBody가 있으면 httpMessageConverter가 동작하는데 받은게 String이라면 StringConverter, 객체였다면 JsonConverter가 동작한다. 

 

위에 내용에 대한 그림

 

댓글