[스프링 입문] 정적 컨텐츠, MVC,API

atdawn·2024년 5월 1일

SPRING BOOT+JPA

목록 보기
4/49

📹 참고 : 인프런 [ 스프링 입문 - 김영한 ]


💡 정적컨텐츠 : 서버를 통한 것이 아닌 파일(html) 그대로 웹 브라우저에 띄우는 형식

💡 MVC 와 템플릿 엔진 : 과거의 JSP, PHP 와 같이 HTML을 그냥 웹브라우저에 띄우는 것이 아닌 서버에서 프로그래밍을 통해 HTML을 동적으로 바꾸어 화면에 띄우는 것. 가장 많이 사용하는 방식

💡API : JSON과 같은 데이터 구조 포맷으로 클라이언트한테 데이터를 전달하는 방식.

  • Vue, React 등을 사용할 때 API로 데이터만 내려주면 화면은 클라이언트가 알아서 그리고 정리할 때 사용
  • 서버끼리 통신할 때

정적 컨텐츠


스프링 부트는 정적 컨텐츠를 자동으로 제공함.


/resources/static/hello-static.html
경로에 파일을 생성하여 예제 코드를 삽입해 보자.

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

스프링 부트를 실행 한 후 www.localhost:8080/hello-static.html 에 접속하면

위와 같은 정적 파일이 그대로 반환된다.

정적 컨텐츠 동작 방식

  1. 웹 브라우저에 www.localhost:8080/hello-static.html 을 치면 톰캣 서버가 hello-static.html 이 입력된 것을 스프링에게 전달한다.
  2. 스프링 부트는 우선적으로 컨트롤러에 hello-static 과 맵핑되는 것이 있는지 찾아본다. (해당 예시는 컨트롤러에 맵핑되는 것이 없다)
  3. 이후 스프링 부트는 resources/static 에서 hello-static.html 이라는 것을 찾는다. 있다면 웹브라우저에 반환해준다.

MVC

: Model, View, Controller

과거 jsp를 사용하여 개발할 때 컨트롤러와 뷰를 분리하지 않고 뷰에서 모든 걸 다 개발하는 Model 1 방식을 사용했다.

  • 현재는 모델, 뷰 , 컨트롤러로 나누는 방식을 MVC 방식을 선호

이번에는 외부에서 파라미터를 입력 받아 화면에 띄워보자.
/controller/HelloController

@Controller //컨트롤러 어노테이션 필수
public class HelloController {

    @GetMapping("hello-mvc")
    public String helloMVC(@RequestParam("name") String name,Model model){ //@RequestParam으로 외부에서 파라미터를 받아 옴.
        model.addAttribute("name",name); //파라미터로 넘어온 name을 모델에 넘어감 (key,value)
        return "hello-template";

    }
}

/resources/templates/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p> 
<!-- 서버에서는 "'hello ' + ${name}" 로 내용이 바뀌게 됨-->
</body>
</html>

스프링 부트를 실행 후 http://localhost:8080/hello-mvc 에 접속하면

에러 페이지를 볼 수 있다.

이유는 컨트롤러에서 @RequestParam을 사용하여 외부에서 파라미터를 받아왔는데, 해당 어노테이션은 String 형식의 value,required 두가지 파라미터가 필요하다.
required는 default 값이 true 이기 때문에 해당 오류가 발생.

🌟 해결 방법
1. required = false 로 설정 (에러는 없지만 null로 넘어옴)
2. defaultValue 설정 (파라미터 값이 비어있으면 디폴트 값으로 설정)
3. 주소 값에 임의적으로 파라미터 입력

http://localhost:8080/hello-mvc?name=spring! 실행

MVC 템플렛 엔진 동작과정


1. 톰캣 서버가 요청된 주소를 스프링 부트에 전달한다.
2. 스프링 부트는 컨트롤러에서 맵핑되는 메소드인 hello-mvc를 찾는다.
3. 이때 파라미터로 넘어온 spring!이 model의 키값인 name에 치환된다.
4. 컨트롤러가 모델에 name:spirng! 을 담아 이름을 hello-template으로 하여 스프링에 넘겨준다.
4.뷰를 찾아주고 템플릿을 연결 시켜주는 ViewResolvertemplates/hello-template 라는 return 된 값과 똑같은 파일을 찾아서 thymeleaf 템플릿 엔진에 넘긴다.
5. 템플릿 엔진은 렌더링해서 변환 한 html을 웹브라우저에 반환한다.


브라우저 화면에서 소스보기를 하면 위와 같이 변환된 것을 확인할 수 있다.


API

정적 컨텐츠를 제외하면 MVC 와 API 방식 두가지를 기억하면 됨.
HTML으로 내리느냐 API으로 데이터를 바로 내리냐 라는 차이점이 존재.

API를 사용하여 스트링 데이터를 확인해보자.

/controller/HelloController

@Controller //컨트롤러 어노테이션 필수
public class HelloController {

    @GetMapping("hello-string")
    @ResponseBody //필수! http 통신의 헤드와 바디 중 응답 바디에 아래 데이터를 직접 넣어주겠다는 의미.
    public String hellostring(@RequestParam("name") String name) {
        return "hello " + name; //hello Spring!
    }
}

위의 템플릿 엔진 예제와 다른 점은 View가 없다는 것.
그냥 문자가 그대로 내려간다.


소스보기로 확인해 보아도 html 태그는 보이지 않는다.


이번에는 문자가 아닌 데이터를 보이려 할 경우 API 사용 예제를 살펴보자.
/controller/HelloController

@Controller //컨트롤러 어노테이션 필수
public class HelloController {

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


실행해보면 json 형식으로 띄워지는 것을 확인 할 수 있다.

@Responsebody 사용 원리


1. 톰캣 서버가 요청된 주소를 스프링 부트에 전달한다.
2. 스프링 부트는 컨트롤러에서 맵핑되는 메소드인 hello-api를 찾는다.
3. @Responsebody 어노테이션을 확인하고 http 응답에 그대로 이 데이터를 넣은게 되겠구나 라고 동작한다.
4. API방식 에서는 viewResolver 이 아닌 HttpMessageConverter가 동작하여 객체를 json 형태로 변환한다.
5. 변환된 데이터를 웹브라우저에 반환한다.

@ResponseBody 를 사용


HTTP의 BODY에 문자 내용을 직접 반환
viewResolver 대신에 HttpMessageConverter 가 동작
기본 문자처리: StringHttpMessageConverter
기본 객체처리: MappingJackson2HttpMessageConverter
byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록되어 있음

profile
복습 복습 복습

0개의 댓글