[스프링 입문] Section03. 스프링 웹 개발 기초

Euiyeon Park·2025년 6월 6일
0

갓영한 스프링🍀

목록 보기
2/12
post-thumbnail

“웹을 개발한다?”

1. 정적 컨텐츠

  • 서버에서 하는 일 없이 파일을 그대로 웹 브라우저에게 전달

2. MVC와 템플릿 엔진(JSP, PHP)

  • 서버에서 처리한 내용으로 HTML을 동적으로 바꿔서 전달
  • Model, View, Controller

3. API

  • JSON 데이터 구조 포맷으로 클라이언트에게 전달
  • API로 데이터만 전달하면, 클라이언트 단에서 화면 처리

07. 정적 컨텐츠 - 웹 개발1

진짜 하는 일 없이 그냥 정적 파일을 클라이언트(웹 브라우저)에 반환

📂 /main/resources/static/hello-static.html

🖥️ `http://localhost:8080/hello-static.html`

내부 동작

  • 톰캣이 받은 요청을 스프링에게 넘김
  • 스프링은 hello-static과 매핑된 컨트롤러를 찾음 → 없어 → resources/static에서 찾음
    • 🪄컨트롤러가 먼저 우선순위를 가짐

08. MVC와 템플릿 엔진 - 웹 개발2

  • Model, View, Controller
  • MVC구조는 관심사, 역할, 책임의 분리
    • View는 화면을 그리는데 집중
    • Model, Controller는 비지니스 로직, 내부적인 처리에 집중

📂 Controller

📂 View
/main/resources/static/hello-templates.html

🖥️http://localhost:8080/hello-mvc?name=나는의연

Thymeleaf 템플릿 장점

  • HTML을 그대로 쓰고, 그 파일을 서버없이 바로 열어봐도 확인할 수 있는 내용이 있음
    ("hello! empty")
  • ⚠️단, 템플릿 엔진으로 작동하면 다른 내용으로 치환
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

내부 동작

  • 클라이언트 요청이 들어오면, 내장 톰캣 서버를 먼저 거침
  • 톰캣 → 스프링, 컨트롤러는 컨트롤러와 매핑된 메서드를 호출
  • 컨트롤러는 ViewResolver에게 Model을 함께 전달
    • ViewResolver는 뷰를 찾고 템플릿을 연결하는 역할
    • 템플릿 엔진(Thymeleaf)는 변환한 HTML을 웹 브라우저에게 전달

09. API - 웹 개발3(Json 방식)

🪄정적 컨텐츠를 제외하고 딱 두 가지만 기억

  1. HTML로 보낼래? - 뷰를 찾아서 템플릿 엔진을 통해 화면을 렌더링해서 전달
  2. API방식으로 데이터를 보낼래?

@ResponseBody

  • Spring MVC에서 사용하는 어노테이션, 메서드 반환값을 HTTP 응답 본문에 직접 쓰도록 지정
  • 컨트롤러 메서드 반환값이 뷰(View)이름이 아닌, HTTP 응답 본문으로 직접 전송
  • JSON, XML 형식으로 데이터를 반환할 때 사용
    • 내부적으로 HttpMessageConverter를 이용해 객체를 JSON, XML으로 변환
  • 예제
@RestController
@RequestMapping("/api")
public class ExampleController {

    @GetMapping("/user")
    @ResponseBody
    public User getUser() {
        return new User("John", 30);
    }

    static class User {
        private String name;
        private int age;

        **// 생성자**
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        **// Getter**
        public String getName() {
            return name;
        }

        public int getAge() {
            return age;
        }
    }
}

근데 위에 예제에서 getter()가 필요한거임 ..? - getter()와 JSON 직렬화

JSON 직렬화(Serialization)

Spring에서는 객체를 JSON으로 변환할 때 Jackson 라이브러리가 기본적으로 사용

  • Jackson은 객체의 필드에 직접 접근하지 않고, getter메서드를 통해 값을 읽음
  • getter메서드가 없으면 Jackson은 해당 필드를 직렬화하지 못함❌

🪄 @Data 어노테이션(Lombok 라이브러리)

  • @Datagetter, setter, equals, hashCode, toString을 자동으로 생성해,
    getter를 추가하지 않아도 JSON으로 직렬화 가능
import lombok.Data;

@Data
static class User{
		private String name;
		private int age;
}

@ResponseBody를 사용하면 뷰 리졸버 사용❌

@ResponseBody 사용시 View Resolver 대신 HTTP Body(응답 메세지 바디)에 문자 내용을 직접 반환

JSON 방식

내부 동작 - @ResponseBody

  • @ResponseBody를 사용하면
    • ViewResolver 대신에 HttpMessageConverter가 동작
      (ViewResolver는 템플릿을 찾아서 반환)
    • HTTP 응답 메세지 바디에 문자 내용을 직접 반환
    • 문자 데이터 처리: StringHttpMessageConverter
    • 객체 데이터 처리: MappingJackson2HttpMessageConverter
    • 객체가 반환값인 경우, JSON형식으로 데이터를 만들어서 HTTP응답에 반환하는 것이 디폴트
    • 객체→JSON으로 직렬화, Serialization”)
profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글