본문 바로가기

개발일지/Spring

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

정적 컨텐츠

 

static 폴더 안에 있는 파일을 그대로 고객에게 전달한다

 

 

이런식

static 파일 안에서 프로그래밍을 직접 하진 않고 요즘은 보통 MVC 패턴으로 코딩하는 추세

  1. 웹 브라우저에서 해당 html 주소를 요청
  2. 톰켓 서버는 스프링 컨테이너에 관련 컨트롤러가 있는지를 우선적으로 탐색한다
  3. 스프링 컨테이너에 해당 매핑이 없음
  4. 스프링 컨테이너에서 관련 컨트롤러가 없으면 그 때 resources/static 폴더에서 해당 파일이 있으면 그 파일을 반환한다

 

MVC(Model, View, Controller)

관심사 분리 !

 

View는 화면을 그리는 데에 모든 영향을 집중한다

Controller에서는 비즈니스 로직, 내부 로직 처리에 집중해야 하므로 관심사를 분리

Model에 관련 된 로직을 화면에 넘겨주는 방식

 

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

model에 담아서 보내면 View에서 렌더링할 때 사용

 

실제 서버에서 돌면 hello! empty값이 th:text 값으로 바뀐다

 

 

 

  1. 로컬호스트 8080에서 해당 주소 넘기기
  2. 스프링 부트 띄울 때 같이 띄우는 내장 톰켓 서버를 먼저 거침
  3. hello-mvc 요청을 스프링에 전달
  4. 스프링 컨테이너 helloController에 매핑이 되어있는 메서드 호출 → 리턴할 때 hello-template, model의 키: name으로, 값: spring을 넘김
  5. viewResolver라는 화면 해결자가 동작 : view를 찾아주고 템플릿 엔진을 연결시켜줌
  6. viewResolver가 return 값과 똑같은 스트링을 찾아서 템플릿 엔진에 처리해달라고 넘김
  7. 템플릿 엔진이 렌더링해서 변환을 하고 웹 브라우저에 넘긴다



API

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

@ResponseBody

http의 body 부분의 데이터에 return 내용을 직접 넣어주겠다는 뜻

 

view가 없고, 문자 그대로 내려가는 방식

페이지 소스로 차리 확인하기

 

 

API는 다음과 같다

 

 

 

템플릿 엔진은 다음과 같다

 

1. 객체 만들기

static class Hello {
        private String name;

        public String getName() {
            return name;
        }

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

이 Hello 클래스는 HelloController.Hello 등의 방식으로 사용할 수 있다 [static class]

getter, setter를 만들어준다 [단축키 커맨드+N]

 

2. 매핑해서, 객체 넘기기

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

return Hello 를 보면 알 수 있듯, 객체를 넘겼다

 

 

3. 웹 브라우저에 hello-api 요청

 

다음과 같이 json 구조로 나타남

json?
key : value 구조

 

getter setter

: 단축키 → 커맨트+N

static class Hello {
        private String name;

        public String getName() {
            return name;
        }

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

name에 직접 접근할 수 없음 → private,

getter, setter 메서드로 접근 → 자바 빈 표준 방식, 프로퍼티 접근 방식

 

 

@ResponseBody가 없으면 → viewResolver에게 던짐

 

@ResponseBody가 있으면 → 그대로 데이터를 넘겨야 되겠구나 !

- 문자를 넘기면? StringConverter

- 객체를 넘기면? httpMessageConverter가 동작한다 -> JsonConverter

 

Hello 라는 객체가 오면, json 방식으로 데이터를 만들어서 http body에 반환을 하는 방식

 

 

@참고자료

[인프런] 김영한 - 스프링 입문 강의 (무료)