스프링 입문 Section2. 스프링 웹 개발 기초

Bae YuSeon·2024년 4월 10일
1

spring스터디

목록 보기
2/15
post-thumbnail

1. 정적 컨텐츠

정적 컨텐츠

  • 파일을 웹 브라우저(고객)에 그대로 내려주는 것
  • 스프링 부트는 정적 컨텐츠 기능을 자동으로 제공
    Static Content

    src → main → resource → 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>

코드 작성 후 http://localhost:8080/hello-static.html 페이지에 들어가면

정적 컨텐츠가 보인다.


동작 원리

1. 웹 브라우저에서 http://localhost:8080/static.html 주소에 들어간다
2. 내장 톰켓 서버가 요청을 받고, 스프링 부트가 컨트롤러에 hello-static.html 관련 컨트롤러가 있는지 확인을 한다. (컨트롤러가 먼저 우선순위를 가짐)
3. 컨트롤러 파일이 없으면 다음으로 넘어가 static 관련 html 이 있는 지 확인 한다.
4. 관련 파일을 찾으면 웹 브라우저에 바로 보내준다.

2. MVC와 템플릿 엔진

MVC

  • Model, View, Controller
    • Model: 데이터를 나타내고 처리하는 역할
    • View: 사용자에게 보이는 부분 담당
    • Controller: 사용자 입력을 처리하고 그에 따른 모델과 뷰를 업데이트

MVC 패턴 실습
기존에 만들었던 HelloController.java 파일에 새로운 controller 내용 추가

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

코드를 자세히 보면

  • @GetMapping("hello-mvc"): "localhost:8080/hello-mvc" 경로에 대한 GET 요청을 처리하는 메서드를 정의

  • public String helloMvc(@RequestParam("name") String name, Model model): 이 메서드는 name, model 두 개의 파라미터를 받는다.

    • 첫 번째 파라미터는 @RequestParam 어노테이션을 통해 HTTP 요청의 쿼리 파라미터 중 "name" 값을 받아와 name 변수에 저장
    • 두 번째 파라미터는 Model 객체로, 스프링 MVC에서 사용되는 모델 객체.
  • model.addAttribute("name", name);: 이 코드는 Model 객체에 "name"이라는 이름으로 데이터를 추가.

  • return "hello-template";: "hello-template"이라는 뷰의 이름을 반환. 스프링은 이 뷰 이름을 View Resolver에 전달하여 실제 뷰를 찾아 렌더링하고, 모델에 담긴 데이터를 뷰로 전달하여 화면에 표시

controller를 만들었으므로 그 화면에 대한 templates인 resources/templates/hello-template.html 파일 새로 만들기

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

HelloController에서 모델에 추가된 "name" 변수의 값이 ${name}에 들어가게 된다.

실행하고 접속할때 Controller에서 @RequestParam("name"), 즉 name Required가 true이기 때문에 name 값을 넣어서 접속해야 한다!!
http://localhost:8080/hello-mvc?name=myfirstspring!
으로 접속하면 아래처럼 페이지가 뜬다.


템플릿 엔진

  • MVC 패턴에서 View의 역할을 구현하는 기술
  • 동적으로 생성되는 HTML을 만들어주는 역할
  • 주요 템플릿 엔진으로는 Thymeleaf, FreeMarker, Velocity 등 존재

3. API

API
Application Programming Interface의 약자로, 애플리케이션 간에 데이터를 주고받는 데 사용되는 인터페이스를 의미

API 기초 실습
이번에도 기존에 만들었던 HelloController.java 파일에 새로운 controller 내용 추가

@Controller
public class HelloController {
 @GetMapping("hello-string")
 @ResponseBody
 public String helloString(@RequestParam("name") String name) {
 return "hello " + name;
 }
}
  • @ResponseBody: 이 어노테이션은 메서드가 반환하는 값이 HTTP 응답의 본문으로 사용됨을 나타냄. 즉, 메서드가 반환하는 값은 HTTP 응답의 본문에 직접 포함되어 클라이언트로 전송
  • public String helloString(@RequestParam("name") String name);: name이라는 이름의 요청 파라미터를 받음
    • @RequestParam 어노테이션은 요청의 쿼리 문자열 또는 폼 데이터에서 해당 이름의 값을 가져옴. 여기서는 "name"이라는 이름의 파라미터를 문자열로 받음.
  • return "hello " + name;: "hello"라는 문자열과 요청 파라미터로 받은 name 변수를 결합하여 반환

⇒ 이 코드는 "/hello-string" 경로로 GET 요청이 들어오면, 요청에 포함된 "name" 파라미터 값을 받아 "hello {name}" 형식의 문자열로 응답

코드를 실행하고 http://localhost:8080/hello-string?name=Spring 페이지로 접속하면

hello-mvc와 똑같은 화면이 뜬다.
더 자세히 보기 위해 페이지 소스를 보면

값이 그대로 웹 브라우저에 내려간 것을 볼 수 있다.

  • @ResponseBody 를 사용하면 뷰 리졸버( viewResolver )를 사용하지 않음
  • 대신에 HTTP의 BODY에 문자 내용을 직접 반환(HTML BODY TAG를 말하는 것이 아님)

스프링 부트에서의 API 구현
1. 컨트롤러 생성: 먼저 API의 엔드포인트를 처리할 컨트롤러 클래스 생성. 이 클래스에 API의 요청을 처리할 메서드 정의.
2. RequestMapping 설정: 각 메서드에는 @RequestMapping 또는 @GetMapping, @PostMapping과 같은 어노테이션을 사용하여 요청 경로 설정.
3. API 응답 처리: API의 요청을 처리하는 메서드에서는 요청을 받아서 필요한 로직을 수행한 후, 응답으로 전송할 데이터를 생성.
4. 데이터 전송: API 응답 처리 메서드에서는 데이터를 HTTP 응답 본문에 담아 클라이언트로 전송.
5. 서버 실행: API가 정의된 스프링 부트 애플리케이션을 실행하면, API가 요청을 받아들이고 처리할 준비 완료.

어노테이션: 자바 프로그래밍 언어에서 메타데이터를 나타내는 특별한 형식의 표기법. 간단하게 @를 시작으로 구성된 노란색 코드 부분

@RestController

  • @Controller와 @ResponseBody가 합쳐진 것으로, 주로 RESTful 웹 서비스에서 사용
  • 해당 클래스의 모든 메서드가 HTTP 응답의 본문에 직접 데이터 작성

@GetMapping()

  • @RequestMapping의 축약형으로, HTTP GET 요청을 처리하는 메서드를 지정하는데 사용

@ResponseBody 객체 반환
기존에 만들었던 HelloController.java 파일에 계속해서 새로운 controller 내용을 추가한다.

@GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        //객체 생성
        hello.setName(name);
        return hello;
        //객체 전달 
    }
    
    //HelloController 클래스 내에 정의된 내부 정적 클래스
    static class Hello {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }

코드를 자세히 보면

  • Hello hello = new Hello();: Hello 클래스의 객체를 생성. 이 객체는 후에 JSON 형식으로 변환되어 응답으로 클라이언트로 전송
  • hello.setName(name);: Hello 클래스의 setName 메서드를 호출하여 객체에 name 값을 설정.
  • return hello;: 위에서 생성한 Hello 객체를 반환.

코드를 실행하고 http://localhost:8080/hello-api?name=Spring 페이지에 들어가면

이런 형태로 지금까지와는 살짝 다른 형태로 출력된다.
이는 JSON(JavaScript Object Notation) 형식으로 {"key":"value"} 형식으로 data가 웹 브라우저에 내려간 것이다.

@ResponseBody 사용 원리

@ResponseBody

  • HTTP의 BODY에 문자 내용을 직접 반환
    • 메서드가 반환하는 값이 뷰를 통해 렌더링되지 않고, 직접 HTTP 응답의 본문에 포함되어 클라이언트로 전송
  • viewResolver 대신에 HttpMessageConverter 가 동작
    • 스프링 MVC는 일반적으로 컨트롤러의 메서드가 반환하는 값을 뷰 이름으로 해석하여 적절한 뷰를 찾아 렌더링하는 데 사용되는 ViewResolver를 이용.
    • 하지만 @ResponseBody를 사용하면 뷰 리졸버 대신에 HttpMessageConverter가 동작
      • HttpMessageConverter: HTTP 요청과 응답의 본문을 객체로 변환하거나, 객체를 HTTP 요청과 응답의 본문으로 변환하는 역할
    ⇒ 즉, 컨트롤러의 메서드가 반환하는 객체를 적절한 형식으로 변환하여 HTTP 응답의 본문에 담아 클라이언트로 전송
  • 기본 문자처리: StringHttpMessageConverter
    • 문자열을 HTTP 응답의 본문에 그대로 포함시켜 클라이언트로 전송
  • 기본 객체처리: MappingJackson2HttpMessageConverter
    • 객체를 JSON 형식으로 변환하여 HTTP 응답의 본문에 담아 클라이언트로 전송
  • byte 처리 등등 기타 여러 HttpMessageConverter가 기본으로 등록

0개의 댓글

관련 채용 정보