Development/Spring

[Spring] 스프링 입문 - 강의 정리 2

kangkyunghyun 2026. 2. 8. 14:44
728x90
반응형

본 게시물은 김영한님의 “스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술” 강의를 바탕으로 작성했습니다.

스프링 웹 개발 기초

정적 컨텐츠

정적 컨텐츠는 src/main/resources/static 폴더에 html 코드를 작성하면 페이지에서 보여줍니다.

정적 컨텐츠 실행

위 폴더에 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 접속하면 아래 사진과 같이 뜨는 것을 확인할 수 있습니다.
  • static 폴더에는 정적인 컨텐츠만 가능하고 코드를 통한 변화는 반영할 수 없습니다.

정적 컨텐츠 원리

  • 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
  • 스프링 부트가 hello-static 관련 컨트롤러가 있는지 확인합니다.
  • 해당 컨트롤러가 없음이 확인되면 hello-static이라는 이름의 html 파일을 찾습니다.
  • html 파일이 있으면 이 파일을 웹 브라우저에서 보여줍니다.

스프링 부트 정적 컨텐츠 기능: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot- features.html#boot-features-spring-mvc-static-content

MVC와 템플릿 엔진

템플릿 엔진은 html을 서버에서 동적으로 프로그래밍해서 웹 브라우저로 내보내줍니다. 템플릿 엔진을 사용하기 위한 Model, View, Controller를 줄여 MVC라고 합니다.

MVC와 템플릿 엔진 기초

Controller부터 작성하겠습니다. 이전에 만들었던 HelloController에 코드를 추가합니다.

@Controller
public class HelloController {
	@GetMapping("hello-mvc")
	public String helloMvc(@RequestParam("name") String name, Model model) {
		model.addAttribute("name", name);
		return "hello-template";
	}
}
  • @RequestParam 애노테이션으로 “name” 이라는 값을 name 변수로 받습니다.
  • model에 key는 “name” , value는 name 으로 넘겨줍니다.

View를 만들어보겠습니다. src/main/resources/templates/hello-template.html 을 만들고 아래 코드를 작성합니다.

hello! empty



  • Controller에서 “hello-template” 으로 넘겨준 model을 통해 name에 값이 들어가게 됩니다.

스프링 부트를 재실행하고 웹 브라우저에서 http://localhost:8080/hello-mvc에 접속하여 결과를 확인해봅니다.

  • 에러가 발생하는 이유는 위에서 작성한 @RequestParam 애노테이션의 required 속성 기본값이 true 이기 때문입니다. 한 마디로 name 파라미터를 받기로 해놓고 안 받았기 때문입니다.
  • 다시 한 번 웹 브라우저에서 http://localhost:8080/hello-mvc?name=spring!!!! 으로 접속합니다.

  • 파라미터는 ?key=value 형태로 작성합니다. Controller로 들어온 파라미터가 Model을 통해 View로 전달되어 ${name}에 대치됩니다.

MVC, 템플릿 엔진 원리

  • 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
  • 스프링 부트가 hello-mvc가 mapping되어 있는 컨트롤러가 있는지 확인합니다.
  • 컨트롤러에서 받은 파라미터를 모델을 통해 "hello-template"로 보냅니다.
  • viewResolver가 hello-template과 동일한 이름의 html을 thymeleaf라는 템플릿 엔진을 통해 처리하여 HTML로 변환 후 웹 브라우저에 보여줍니다.

API

JSON 데이터 구조 포맷으로 클라이언트로 데이터를 전달하는 방식을 API라고 합니다. 또한 서버끼리 데이터를 주고 받을 때도 API를 사용합니다.

@ResponseBody 문자 반환

HelloController.java에 아래와 같이 hello-string을 mapping하는 새로운 함수를 만들고 스프링 부트를 재시작합니다.

@Controller
public class HelloController {
	@GetMapping("hello-string")
	@ResponseBody
	public String helloString(@RequestParam("name") String name) {
		return "hello " + name;
	}
}
  • Model을 사용하지 않고 문자열 자체를 return합니다.
  • @ResponseBody 애노테이션은 viewResolver를 사용하지 않고 HTTP의 BODY에 문자 내용을 직접 반환합니다.
  • 웹 브라우저에서 http://localhost:8080/hello-string?name=spring!!!!에 접속하면 아래와 같은 화면이 뜹니다.

  • F12를 눌러 보면 아래와 같이 그냥 문자열이 반환된 것을 볼 수 있습니다.

@ResponseBody 객체 반환

HelloController.java에 아래와 같이 hello-api를 mapping하는 새로운 함수를 만들고 스프링 부트를 재시작합니다.

@Controller
public class HelloController {
	@GetMapping("hello-api")
	@ResponseBody
	public Hello helloApi(@RequestParam("name") String name) {
		Hello hello = new Hello();
		hello.setName(name);
		return hello;
	}
	static class Hello {
		private String name;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
	}
}
  • @ResponseBody 애노테이션을 사용하고 객체를 반환하면 JSON 형식으로 변환됩니다.
  • 객체를 만들 때는 Getter와 Setter가 있는데 객체 내에서 [⌘N → Getter and Setter]를 선택하고 확인을 누르면 Spring 표준 Getter와 Setter를 작성해줍니다.
  • http://localhost:8080/hello-api?name=spring!!!!에 접속하면 아래와 같이 객체가 JSON 형식으로 변환되어 반환된 것을 볼 수 있습니다.

@ResponseBody 원리

  • 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
  • 스프링 부트가 hello-api가 mapping되어 있는 컨트롤러가 있는지 확인합니다.
  • @ResponseBody 애노테이션으로 아래 작업을 수행합니다.
    • HTTP의 BODY에 문자 내용을 직접 반환합니다.
    • viewResolver 대신에 HttpMessageConverter 가 동작합니다.
      • 기본 문자(String) 처리는 StringHttpMessageConverter 가 동작합니다.
      • 기본 객체(Object) 처리는 MappingJackson2HttpMessageConverter 가 동작합니다.
    • byte 처리 등 기타 여러 HttpMessageConverter 가 기본으로 등록되어 있습니다.
    • 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택됩니다.
728x90
반응형