ℓ 스프링이란?
스프링은 스프링 애플리케이션 컨텍스트(Spring application context)라는 컨테이너(container)를 제공하는데,
이것은 애플 리케이션 컴포넌트들을 생성하고 관리한다.
그리고 빈(Bean)들은 스프링 애플리케이션 컨텍스트 내부에서 서로 연결되어 완전한 애플리케이션을 만든다.
애플리케이션 컴포넌트는 스프링 애플리케이션 컨텍스트에 의해 관리되고 상호 주입된다.
ℓ 웹 요청 처리하기
스프링은 스프링 MVC라고 하는 강력한 웹 프레임워크를 갖고 있다.
스프링 MVC의 중심에는 컨트롤러가 있으다.
컨트롤러는 웹 요청과 응답을 처리하는 컴포넌트다.
웹 브라우저를 상대하는 애플리케이션의 경우에는 컨트롤러는 선택적으로 모델 데이터를 채워서 응답하며,
브라우저에 반환되는 HTML을 생성하기 위해 해당 응답의 웹 요청을 뷰에 전달한다.
package tacos;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller ← 컨트롤러
public class HomeController {
@GetMapping("/") ← 루트 경로인 /의 웹 요청을 처리한다.
public String home() {
return "home"; ← 뷰 이름을 반환한다.
}
}
TMI) 컴포넌트 :: 구성요소, 컴포넌트는 독립적인 단위 소프트웨어 모듈이다.
@Controller가 컴포넌트 검색 시에 위 클래스가 컴포넌트로 식별되개 하는 것이 주 목적이다.
따라서 스프링의 컴포넌트 검색에서는 자동으로 HomeController 클래스를 찾은 후 스프링 애플리케이션 컨텍스트의
빈(Bean)으로 HomeController의 인스턴스를 생성한다.
그리고 @Service, @Repository를 포함해서 소수의 다른 애노테이션들도 @Controller 기능을 하지만
굳이 @Controller 사용한 이유는 애플리케이션에서의 컴포넌트 역할을 더 잘 설명해 주기 때문이다.
@GetMapping("/")는 루트 경로인 "/"의 HTTP GET 요청이 수신되면 이 메서드가 해당 요청을 처리해야 한다.
여기서 home의 값을 갖는 String만 반환하고 다른 일은 하지 않는다. 이 값은 뷰의 논리적인 이름이다.
ℓ 뷰 정의하기
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org" lang="en">
<head>
<meta charset="EUC-KR">
<title>Taco Cloud</title>
</head>
<body>
<h1>Welcome...</h1>
<img th:src="@{/images/TacoCloud.png}"/> ← @{...} 표현식을 사용해서 Thymeleaf의 th:src 속성을 지정한다.
</body>
</html>
이 템플릿에는 <img> 태그 말곤 특별한 내용이 없다.
ℓ 컨트롤러 테스트하기
package tacos;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.web.servlet.MockMvc;
import static org.hamcrest.core.StringContains.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
@WebMvcTest(HomeController.class) ← HomeController의 웹 페이지 테스트
class HomeControllerTest {
@Autowired
private MockMvc mockMvc; ← MockMvc를 주입한다.
@Test
void testHomePage() throws Exception{
mockMvc.perform(get("/")) ← GET /를 수행한다.
.andExpect(status().isOk()) ← HTTP 200이 되어야 한다.
.andExpect(view().name("home")) ← home 뷰가 있어야 한다.
.andExpect(content().string(containsString("Welcome"))); ← 콘텐츠에 'Welcome to...'가 포함되어야 한다.
}
}
HomeControllerTest는 @SpringBootTest 대신 @WebMvcTest 애노테이션을 사용한다.
덕분에 스프링 MVC 애플리케이션의 형태로 테스트가 실행되도록 한다.
즉, HomeControllerTest가 스프링 MVC에 등록되므로 우리가 스프링 MVC에 웹 요청을 보낼 수 있다.
@WebMvcTest는 또한 스프링 MVC를 테스트하기 위한 스프링 지원을 설정한다.
그리고 테스트 클래스에 MockMvc 객체를 주입(연결)한다.
testHomePage() 메서드에는 홈페이지에 대해 수행하고자 하는 테스트를 정의한다. 내용은 ← 과 같다.
별 이상이 없으면 실행이 된다.
ℓ DevTools 알아보기
DevTools는 스프링 개발자에게 다음과 같은 개발 시점의 편리한 도구를 제공한다.
1. 코드가 변경될 때 자동으로 애플리케이션을 다시 시작시킨다.
2. 브라우저로 전송되는 리소스(예를 들어, 템플릿, 자바스크립트, 스타일시트)가 변경될 때 자동으로 브라우저를 새로고침한다.
3. 템플릿 캐시를 자동으로 비활성화한다.
4. 만일 H2 데이터베이스가 사용 중이라면 자동으로 H2 콘솔을 활성화한다.
ℓ 요약
1. 웹 애플리케이션 생성, 데이터베이스 사용, 애플리케이션 보안, 마이크로서비스 등에서 개발자의 노력을 덜어주는 것이
스프링의 목표다.
2. 스프링 부트는 손쉬운 의존성 관리, 자동-구성, 런타임 시의 애플리케이션 내부 작동 파악을 스프링에서 할 수 있게 된다.
3. 스프링 애플리케이션은 스프링 Initializr를 사용해서 초기 설정을 할 수 있다. 스프링 Initializr는 웹을 기반으로 하며, 대부
분의 자바 개발 환경을 지원한다.
4. 빈(Bean)이라고 하는 컴포넌트는 스프링 애플리케이션 컨텍스트에서 자바나 XML로 선언할 수 있으며, 컴포넌트 탐색
으로 찾거나 스프링 부트 자동으로 구성 할 수도 있다.
'개발 서적 > 스프링 인 액션' 카테고리의 다른 글
스프링 인 액션 Chapter 2.4 :: 뷰 컨트롤러로 작업하기 (0) | 2023.09.19 |
---|---|
스프링 인 액션 Chapter 2.3 :: 폼 입력 유효성 검사하기 (0) | 2023.09.12 |
스프링 인 액션 Chapter 2.2 :: 폼 제출 처리하기 (0) | 2023.09.11 |
스프링 인 액션 Chapter 2.1 :: 정보 보여주기 (0) | 2023.08.24 |