단의 개발 블로그
스프링 요청 및 라이브러리 살펴보기 본문
웹 요청
스프링 애플리케이션에 추가할 첫번째 기능은 홈페이지 이다. 홈 페이지는 다음 두가지 파일을 생성하여 처리된다.
- 웹 요청을 처리하는 컨트롤러 클래스
- 처리된 요청을 전달 받아 사용자에게 보여주는 뷰 템플릿
스프링은 MVC라고 널리 사용되는 디자인 패턴이 존재한다. 개발 영역을 MVC(Model, View, Controller)로 구분하여 각 역할을 나눠서 코드를 작성한다. 컨트롤러는 웹 요청과 응답을 처리하는 역할을 한다. 컨트롤러는 응답마다 데이터를 채워서 전송해야 할 때도 있는데 이때 Model을 사용하고, 사용자에게 HTML를 전달하는데 이때 요청을 View로 전달한다.
src/main/java 아래에 각자 생성한 projectname 패키지에서 new -> package를 클릭하고 controller 패키지를 생성한다.

controller 패키지에서 new -> java Class를 클릭하고 HomeController.java를 생성한다.

HomeController.java
// 컨트롤러 지정
@Controller
public class HomeController {
// 사용자의 요청
@GetMapping("/")
public String home() {
// 뷰 이름 반환
return "home";
}
}
home() 의 리턴은 뷰 이름을 반환한다.
@Contoller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
- 클래스가 컨트롤러 임을 나타낸다. 이 어노테이션은 @Component의 특수화 된 상태로 classpath 스캐닝을 통해 구현 클래스를 자동 감지 할 수 있도록 한다. 일반적으로 RequestMapping, GetMapping 등과 함께 같이 쓰인다.
@GetMapping
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
@AliasFor(annotation = RequestMapping.class)
String[] params() default {};
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {};
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {};
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {};
}
- HTTP Get 요청을 특정 핸들러 메소드에 매핑하기 위한 어노테이션이다. 구체적으로는 @GetMapping은 @RequestMapping(method = RequestMethod.GET)의 축약형이다. 이 어노테이션은 동일한 메소드에 선언된 다른 @RequestMapping 어노테이션과 함께 사용할 수 없다. GetMapping 뿐만아니라 Put, Post, 등도 마찬가지이다.
View
src/main/resources/templates에서 오른쪽 마우스를 클릭하여 new -> html를 생성한다. 이름은 home.html로 한다.
home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Welcome to...</h1>
<img th:src="@{/images/TacoCloud.png}" />
</body>
</html>
- img 태그를 보면 thymeleaf 표현식을 사용하여 이미지를 불러온다. 이미지는 컨텍스트의 경로인 images/TacoCloud.png로 불러온다. 이미지 같은 정적 콘텐츠의 위치는 src/main/resources/static 폴더에 위치해야 한다.
테스트 작성
홈 컨트롤러를 요청하면 요청이 성공적인지, view 이름이 home이면서, Welcome to.. 메시지가 포함되어 있는지 테스트 해야 한다. 테스트는 Junit Test를 이용해서 테스트 한다. HomeController에서 클래스 명을 두번 클릭 후 마우스를 올린 상태에서 Alt + Enter를 누르고 Create Test를 클릭한다.

컨트롤러에서 작성한 메소드 목록이 아래와 같이 출력된다. 생성할 테스트 메소드를 클릭하여 생성한다.

아래와 같이 HomeController가 생성된 경로에 똑같은 경로로 test/java/com/example/taco/contoller/HomeControllerTest가 생성된다.
class HomeControllerTest {
@Test
void home() {
}
}
HomeControllerTest.java 파일을 아래와 같이 작성한다.
@WebMvcTest(HomeController.class)
class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void home() throws Exception {
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("home"))
.andExpect(content().string(containsString("Welcome to...")));
}
}
- home() 메소드에는 홈페이지에 대한 테스트가 정의되어 있다. GET 요청을 MockMvc 객체로 수행한다. 요청에 대한 기대 값은 andExpect로 정의한다. 응답은 200상태, 뷰 이름은 home, 브라우저에 보이는 뷰에 'Welcome to...' 텍스트가 포함되어야 한다. 해당 테스트에서는 실제 서버를 시작하는 대신 스프링 MVC 모의 매커니즘을 사용해도 충분하기 때문에 MockMvc 객체를 주입해서 사용한다.
작성한 테스트를 실행하는 방법은 아래와 같다.

@WebMvcTest
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(WebMvcTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class)
@OverrideAutoConfiguration(enabled = false)
@TypeExcludeFilters(WebMvcTypeExcludeFilter.class)
@AutoConfigureCache
@AutoConfigureWebMvc
@AutoConfigureMockMvc
@ImportAutoConfiguration
public @interface WebMvcTest {
String[] properties() default {};
@AliasFor("controllers")
Class<?>[] value() default {};
@AliasFor("value")
Class<?>[] controllers() default {};
boolean useDefaultFilters() default true;
Filter[] includeFilters() default {};
Filter[] excludeFilters() default {};
@AliasFor(annotation = ImportAutoConfiguration.class, attribute = "exclude")
Class<?>[] excludeAutoConfiguration() default {};
}
- Spring MVC 컴포넌트에만 집중하는 Spring MVC 테스트에 사용하는 어노테이션이다. 전체 자동 구성이 비활성화 되고, MVC 테스트에 관련된 구성만 적용된다. @Component, @Service, @Repository 빈은 적용되지 않는다. 기본적으로 @WebMvcTest로 설정된 테스트는 Spring Security와 MockMvc도 자동 구성 된다. 전체 응용프로그램 구성을 로드하고 MockMVC를 사용하려는 경우 이 어노테이션 대신 @SpringBootTest를 @AutoConfigurationMockMvc와 결합하여 사용하는것이 좋다.
@Autowired
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}
- Spring의 의존성 주입 기능에 의해 자동으로 주입될 생성자, 필드, Setter 메소드 또는 구성 메소드를 지정하는데 사용하는 어노테이션이다.
MockMvc
애플리케이션을 배포하지 않고도 서버의 MVC만으로 동작을 테스트하는 라이브러리이다. 실제 객체와 비슷하지만 가짜 객체를 만들어 애플리케이션 서버에 배포하지 않고도 스프링 MVC 동작을 재현할 수 있는 클래스이다. 주로 Contoller 레이어 단위 테스트에 주로 사용된다.
- perform : 가상의 요청을 처리한다. 가짜 요청은 MockHttpServletRequestBuilder를 통해서 생성된다.
- except : 가상의 response에 대해서 검증한다. 검증 항목은 handler(), status(), model(), view() 이며 해당 메소드들은 ResultMatcher를 반환한다.
- do : 테스트 과정에서 직접 처리할 일을 작성한다. 실제 동작은 RequestHandler를 사용한다.
실제 애플리케이션 실행 방법은 아래와 같다.

실행하면 아래와 같은 메세지가 출력된다.

애플리케이션 ip 바인딩을 하지 않았고, 포트도 지정하지 않았기 때문에 localhost:8080으로 요청하면 아래와 같은 결과가 출력된다.

DevTools
DevTools
스프링 개발자에게 개발 시점에 편리한 도구를 제공한다.
- 코드가 변경될 때 자동으로 다시 시작한다.
- 브라우저로 전송되는 리소스가 변경될 때 마다 자동으로 브라우저를 새로 고침 한다.
- 템플릿 캐시를 자동으로 비활성화한다.
- H2 데이터베이스를 사용 중이면 H2 콘솔을 활성화 한다.
자동 시작원리
DevTools는 변경을 감시하여 애플리케이션을 자동으로 다시 시작한다. 개발자가 DevTools를 사용 중이라면 애플리케이션은 JVM에서 두 개의 클래스 로더에 의해 로드된다. 그 중 하나는 우리가 작성한 자바 코드, 속성 파일, src/main에 있는 모든 것과 함께 로드 된다. 이것은 자주 변경될 수 있는 것이다. 다른 하나는 자주 변경되지 않는 의존성 라이브러리와 함께 로드 된다. 변경이 감지되면 자주 변경되는 클래스 로더만 다시 로드하고 애플리케이션 컨텍스트를 다시 시작 시키는 것이다. 다른 클래스 로더는 JVM에 그대로 있기 때문에 그나마 다시 시작하는 시간을 단축시킬 수 있는 것이다.
템플릿 캐시 비활성화
템플릿 엔진은 파싱(코드분석) 결과를 캐시에 저장하고 사용한다. 모든 요청마다 매번 다시 코드를 읽어 출력하지 않기 위해서다. 실제 운영 시에는 성능상에 이점이 있어 유용하지만, 자주 변경하며 확인해야 하는 개발 시점에는 해당 기능이 유용하지 않다. DevTools는 LiveReload 서버를 활성화한다. LiveReload 브라우저 플러그인과 연결해서 사용하면 브라우저에 전달되는 모든 것에 대해서 변경이 발생하면 자동으로 새로고침 한다.
핵심 라이브러리
스프링 부트
- 스타터 의존성 제공한다. 스타터에 맞는 여러 라이브러리 버전을 불러와준다.
- CLI를 제공하여 gradle로 작성한 명령행으로 애플리케이션을 빌드 및 실행할 수 있다.
스프링 데이터
- 여러 데이터베이스와 호환된다.
- 관계형 데이터 베이스인 JPA
- 문서형 데이터베이스인 Mongo
- 그래프형 데이터베이스인 Neo4j
스프링 시큐리티
- 인증 및 허가 외에도 API 보안을 포함하는 폭 넓은 범위의 애플리케이션 보안 요구를 처리한다.
통합 및 배치
- 스프링 통합은 데이터가 사용 가능한 즉시 처리되는 실시간 통합을 지원한다.
- 스프링 배치는 다량의 데이터가 처리되는 시점을 트리거가 알려줄 때 데이터가 수집 처리되는 배치 통합을 처리한다.
스프링 클라우드
- 애플리케이션을 거대한 단일체로 개발하는 대신 마이크로서비스라는 여러개의 개별적인 모듈 단위로 프로젝트가 개발된다. 스프링 클라우드는 마이크로 서비스로 개발된 스프링 프로젝트를 관리하는데 사용된다.
출처
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=239755024&start=slayer
'Web > Spring' 카테고리의 다른 글
| 데이터 베이스 (0) | 2024.09.04 |
|---|---|
| 사용자 요청 처리하기 (0) | 2024.09.03 |
| 간단한 웹 요청 만들기 (0) | 2024.05.08 |
| 프로젝트 생성 및 프로젝트 구조 (0) | 2024.05.02 |
| Spring 이란? (0) | 2024.04.18 |