본문 바로가기
개발/Spring

[스프링 입문] 스프링 정적컨텐츠, MVC, API

by ujin2021 2021. 6. 29.

* 인프런 김영한님의 '스프링 입문' 강의를 듣고 작성한 내용입니다! (https://inf.run/txXC)

* IDE : IntelliJ (Eclipase 도 가능하지만 인텔리제이 추천!) (intelliJ 설치 참고 블로그 : https://goddaehee.tistory.com/195)

* Java 11 설치 (Windows Java 11 설치 참고 블로그 : https://programmer-ririhan.tistory.com/118)

 

* 정적컨텐츠

- 서버에서 하는일 없이 그냥 파일만 띄워주는 것이다

- src-java-resources-static 폴더 밑에 html을 생성하면 된다

- 만약 hello-static.html을 작성했다면, localhost:8080/hello-static.html 로 접속하면 html파일을 띄운다

- 동작원리 : localhost:8080/hello-static.html 접속 -> tomcat 서버가 hello-static.html 관련 controller가 있는지 확인한다 -> 없으면 static 폴더 밑의 파일을 가져와서 웹브라우저에 띄운다

 

* MVC와 템플릿 엔진

- html을 서버에서 동적으로 바꿔서 띄워주는 것이다 (Controller, Model, View 필요)

- controller 코드 (Welcomepage 만들기 포스트의 HelloController class안에 추가되는 코드이다)

// MVC
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam(value = "name", required = false) String name, Model model) {
	model.addAttribute("name", name);
	return "hello-template";
 }

- GetMapping annotation을 붙였으므로 localhost:8080/hello-mvc url에 접근하면 template 폴더 안의 hello-template.html을 띄우라는 뜻이다

- @RequestParam은 get방식으로 파라미터를 전송한다는 뜻이다 (localhost:8080/hello-mvc?name=youjin 이런식으로)

- required = false 이므로 파라미터를 넣어주지 않아도 동작한다는 뜻이다 (만약 true이면 localhost:8080/hello-mvc에 접속하면 오류가 발생한다)

- 파라미터로 받은 name을 model attribute에 저장해준다

 

- hello-template.html 코드 (src-main-resources-template-hello-template.html)

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

- Controller에서 name을 파라미터로 받은 value로 매핑시켰기 때문에 파라미터로 들어온 값이 ${name}에 들어간다

- 파라미터를 넣어주지 않으면 hello null 이 뜬다

 

- 동작원리 : localhost:8080/hello-mvc 접속 -> tomcat 서버가 hello-template 관련 controller가 있는지 확인한다 -> 컨트롤러가 존재한다 -> 템플릿 엔진 처리를 해서(타임리프를 사용하므로) 변환된 html 파일을 웹 브라우저에 띄워준다

 

* API

- json 데이터 형식으로 넘겨주는 것이다

 

* API - 문자열 반환

- controller 코드 (HelloController class안에 추가)

// API - 문자열 반환하기
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
	return "hello " + name; // view 없이 이 문자가 그대로
}

- @ResponseBody annotation을 붙여준다 : 이것을 붙여주면 viewResolver를 사용하지 않는다

- 대신 http body에 문자열을 그대로 반환한다

- 만약 locallhost:8080/hello-string?name=youjin 으로 접속하면 hello youjin 문자열이 그대로 띄워진다

 

* API - 객체 반환

controller 코드 (HelloController class안에 추가)

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
	Hello hello = new Hello();
	hello.setName(name);
	return hello; // 객체를 반환하고 @ResponseBody를 해놓는다 - 기본으로 json객체 반환(default)
}

static class Hello { // Class 안에 Class 가능 (HelloController.Hello)
	private String name;

	public String getName() { 
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

- 이번에는 hello 객체를 반환한다

- Hello class에서 name은 private 이기 때문에 getter, setter가 필요하다

이때 private String name; 을 타이핑하고, alt + insert 단축키로 getter, setter을 바로 생성할 수 있다

- 파라미터로 받은 name을 hello.setName으로 넣어준다 

- return hello 해주면 json 객체를 반환한다

- 동작원리 : localhost:8080/hello-api 접속 -> hello-api 관련 controller 확인 -> @ResponseBody annotation이 있으므로 viewResolver 대신 HttpMessageConverter가 동작한다