Spring Boot/Spring Boot 입문 강의 정리(김영한)

[SpringBoot-스프링 입문] 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술: 2. 스프링 웹 개발 기초

조찬국 2024. 2. 20. 14:37
728x90

강의 출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

[지금 무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 강의 - 인프런

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

해당 강의는 "Inflearn"에 등록된 김영한님의 Springboot 강의입니다.

 

0. 웹 개발 방식에는 크게 3가지 방식이 있다.

  1. 정적 콘텐츠 방식
  2. MVC와 템플릿 엔진 방식(SSR -> 저번 글에 포스팅 했습니다.)
  3. API 방식(문자 반환 방식, JSON 데이터 반환 방식)

 현재 가장 인기 있는 방식은 바로 API 방식이다. 특히 JSON 데이터를 반환하는 RESTful API가 대세를 이루고 있다. 서버는 데이터를 JSON 형태로 반환하고, 클라이언트는 이 API를 호출해 필요한 데이터를 받아서 사용하는 식이다. 이 방식의 가장 큰 장점은 클라이언트와 서버의 역할이 명확히 분리되어 있어서 각각 독립적으로 발전시킬 수 있다는 거디. 현재 웹 개발에서는 서버가 주로 데이터를 제공하는 역할을 담당하고, 클라이언트는 이 데이터를 사용자에게 효율적으로 보여주는 역할을 하게 된다. 그리고 이 모든 과정에서 RESTful API가 큰 역할을 하고 있다. 특히 스프링 부트를 이용한 REST API 개발은 그 효율성과 강력한 기능 덕분에 많은 개발자들 사이에서 인기를 끌고 있다.

(스프링부트의 Rest APIAPI 개발Spring Boot JPA 활용편2에 기재하겠습니다.)

1. 정적 컨텐츠

resources/static/hello-static.html

<!--static/index.html 을 올려두면 Welcome page 기능을 제공한다.-->
<!DOCTYPE HTML>
<html>
<head>
    <title>Hello</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적콘텐츠 입니다.
</body>
</html>

결과

정적 콘텐츠 결과

동작 과정

정적 콘텐츠 동작과정

정적 콘텐츠는 resources/static 디렉토리에 그냥 html 파일 하나 만들고, 해당 파일명으로 접속하면

스프링부트의 내장서버(톰캣) MVC 없이 단순히 html파일만 띄운다.

2. MVC와 템플릿 엔진

  • mvc: model-view-controller

ControllerModel

 public class HelloController {
    //2.MVC와 템플릿엔진
    //내장 tomcat 서버가 콘트롤러에 hello-mvc로 넣어줌. ★템플릿엔진이 viewResolver에게 던짐★
    @GetMapping("hello-mvc")
    //@RequestParam는"name"이란 키값으로 parameter 받아서  name이란 이름으로 모델에 넘기기
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template"; //view resolver가 이 값을 받아서 찾아서 html로 변환(tymeleaf엔진이 처리)
    }
 }

View

resources/templates/hello-template.html

<html xmlns:th="http://www.thymeleaf.org">
<body>
<!--우측의 "hello! empty"은 그냥 미리 보기 느낌. 실제 서버를 타서 오면'hello ' + ${name}이게 나옴 -->
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

실행

/hello-mvc 경로와 사용자가 요청하는 파라미터 ?파라미터명= 값을 합치면 위 처럼 작동한다.

지난 시간 프로젝트 설정시 start.spring에서 dependecies(라이브러리)에 Thymeleaf를 추가했다.

Controller의 helloMvc메서드/hello-mvc 경로를 받으면Get에 대한 요청을 응답한다. 이때 메서드는 Model객체@RequestParam("파라미터") String 파라미터 명 annotation을 이용하여 사용자가 입력한 파라미터 값에 따라 model 객체에 값을 추가했다. 이를 통해 동적으로 사용자가 원하는 값을 입력하면 해당 값을 받아서 사용하는 view를 띄운다.

이때 viewview Resolverview를 찾고, Thymeleaf 템플릿 엔진랜더링 작업 후에 웹 브라우저에 띄운다.

3. API

3.1 API의 문자반환 방식

@ResponseBody annotation을 메서드에 설정하면 해당 메서드가 반환하는 값은 http의 body에 값을 직접 넣게 된다.

//3.1 문자반환 방식
    @GetMapping("hello-string")
    @ResponseBody//★★★http의 body에 직접 넣는것★★★
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }

결과

이 방식은 방금 전 MVC와 비슷하게 보이지만 작동은 완전 다르다. 전까지는 model에 키(파라미터): 값 을 넣은 후 그 modelview(html) 에 넘기고, 그 view랜더링해서 보여줬는데, 위 방식의http라는 프로토콜의 Body에 직접 데이터를 넣고 그 값
(hello {name:값} ) 을 반환하였다.

3.2 API의 Json 데이터 반환 방식

   //3.2 ★★★Json데이터 반환 방식(Json: key,value 한쌍의 데이터)★★★제일 자주 쓰임.
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello; //{"name":"request parameter"}의 객체 반환
    }

    //한 클래스내에 또다른 클래스-> static class
    static class Hello {
        private String name;

        //getter,setter 는 우클릭 Generate 클릭하면 생성가능
        //이러한 getter,setter를 넣는 방식을 property방식이라고 한다.
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
    //1.(★★★Responsebody 형태로 그냥 넣음.(viewResolver가 안함)★★★)
    //2.HttpMessageConverter가 동작->jsonConverter(json이면),StringConverter(String이면) 가 웹 브라우저에 띄움

결과

json 형태의 데이터

동작방식

https의 구조

위 사진을 보면 HTTP는 Header와 Body로 이루어져 있다.
(https는 http에 ssl을 추가하여 데이터를 암호화하여 송수신 하는 것이다. 추후 해당 내용에 대해서도 업로드 할 예정이다.)

Http의 Body에는 Json,html등의 데이터 형식으로 저장해서 인터넷을 통해 전송을 한다.

Spring boot 에서의 API개발은 @ResponseBody라는 것을 명시한 메서드를 개발하는 것 과 같다.

(추후엔 콘트롤러에 @RestController로 명시하면 (콘트롤러 + 각 메서드&@ResponseBody라고 할 수 있다.)

위의 helloApi 메서드는 @ResponseBody를 통해 http의 Body객체를 넣어 반환한다.

{"name":"request parameter"}의 객체 반환

해당 객체에 값을 setting하고 객체를 반환하면 스프링 부트에는 자동으로 객체Json데이터로 처리하는 메서드들이 처리한다.

정리하면 API개발은 @ResponseBody를 메서드에 명시하고, 객체를 생성한 후에 객체에 원하는 값을 setting (setter혹은 생성자를 통해서) 하고, 그 객체를 반환만 하면 된다. api호출시 http의 메서드 mapping?파라미터 형태로 호출하면 된다.

4. 전체 코드( /src/main/java/hello/hellospring/controller/HelloController.java)

//1. 콘트롤러 설정 (MVC의 C)
@Controller
public class HelloController {
    //1.정적컨텐츠
    //★★★hello값이 입력되면 "hello"라는 뷰이름을 반환함. 추후, "hello.html"을 뷰 리졸버가 찾음★★★
    @GetMapping("hello")
    public String hello(Model model) {
        //model은 data,hello로 구성되어 있다.
        model.addAttribute("data", "changuk!!");
        return "hello"; //ctrl+click은 해당 소스로 넘어감.
    }

    //2.MVC와 템플릿엔진
    //내장 tomcat 서버가 콘트롤러에 hello-mvc로 넣어줌. ★템플릿엔진이 viewResolver에게 던짐★
    @GetMapping("hello-mvc")
    //"name"이란 키값으로 parameter 받아서  name이란 이름으로 모델에 넘기기
    //@RequestParam는
    public String helloMvc(@RequestParam("name") String name, Model model) {
        model.addAttribute("name", name);
        return "hello-template"; //view resolver가 이 값을 받아서 찾아서 html로 변환(tymeleaf엔진이 처리)
    }

    //3.API 방식
    //3.1 문자반환 방식
    @GetMapping("hello-string")
    @ResponseBody//★★★http의 body에 직접 넣는것★★★
    public String helloString(@RequestParam("name") String name) {
        return "hello " + name;
    }

    //3.2 ★★★Json데이터 반환 방식(Json: key,value 한쌍의 데이터)★★★제일 자주 쓰임.
    @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello; //{"name":"request parameter"}의 객체 반환
    }

    //한 클래스내에 또다른 클래스-> static class
    static class Hello {
        private String name;

        //getter,setter 는 우클릭 Generate 클릭하면 생성가능
        //이러한 getter,setter를 넣는 방식을 property방식이라고 한다.
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
    //1.(★★★Responsebody 형태로 그냥 넣음.(viewResolver가 안함)★★★)
    //2.HttpMessageConverter가 동작->jsonConverter(json이면),StringConverter(String이면) 가 웹 브라우저에 띄움

}
728x90