๐Ÿ“š [Spring] #2. ์Šคํ”„๋ง ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ

์ด๊ฐ€์€ยท2024๋…„ 4์›” 6์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
2/13
post-thumbnail

๐Ÿ“• ์ •์  ์ปจํ…์ธ 

์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—… ์—†์ด ๋‹จ์ง€ ํŒŒ์ผ์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹

  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ •์  ์ปจํ…์ธ  ๊ธฐ๋Šฅ์„ ์ž๋™์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค
  • resources/static ํด๋”์— study.html ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜๋ฉด ์ •์  ํŽ˜์ด์ง€์˜ url์€ http://localhost:8080/study.html์ด ๋œ๋‹ค

๐ŸŽˆ ๋™์ž‘ ๋ฐฉ์‹

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/hello-static.html์„ ๋˜์ง€๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„ ์Šคํ”„๋งํ•œํ…Œ ์ „๋‹ฌํ•œ๋‹ค.

  2. ์Šคํ”„๋ง์€ ๋จผ์ € Controller ์ชฝ์—์„œ hello-static์ด ์žˆ๋Š”์ง€ ์ฐพ์•„๋ณธ๋‹ค. (Controller๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค)

  3. ๋งŒ์•ฝ ์—†๋‹ค๋ฉด, resources/static ํด๋” ์•ˆ์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•œ ํ›„ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ํŒŒ์ผ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“™ MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„

์„œ๋ฒ„์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•ด์„œ HTML์„ ๋™์ ์œผ๋กœ ๋ฐ”๊ฟ”์„œ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹

  • MVC๋ž€ Model View Controller์„ ๋งํ•œ๋‹ค
    Model : ํ™”๋ฉด์— ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๋‹ด์•„์„œ ์ „๋‹ฌํ•˜๊ณ , ๋‚ด๋ถ€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• 
    View : ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ์—ญํ• , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ํ™”๋ฉด(UI)
    Controller : ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ์„œ๋ฒ„ ๋’ท ๋‹จ์— ๊ด€๋ จ๋œ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , Model๊ณผ View ์‚ฌ์ด๋ฅผ ์ด์–ด์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• 

๐ŸŽˆ @RequestParam

์›น url์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ๋ฐ์ดํ„ฐ์— ์ €์žฅ (ex. ?name=spring!)

@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
	model.addAttribute("name", name);
	return "hello-template";
}

http://localhost:8080/hello-mvc?name=spring!
@RequestParam์—์„œ๋Š” required๋ผ๋Š” ์†์„ฑ์ด ์žˆ๋‹ค. default ๊ฐ’์€ true์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์„ ๋„˜๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด required๋ฅผ false๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. required = false์ผ ๋•Œ ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์ด ์—†์œผ๋ฉด null์ด ์ €์žฅ๋œ๋‹ค.

๐ŸŽˆ ์ด ์ฝ”๋“œ๋Š” ๋ญ์•ผ?

์œ„ ์ฝ”๋“œ์—์„œ ํ•˜์ด๋ผ์ดํŠธ ์ฝ”๋“œ๋Š” ์—†์ด๋„ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•œ๋‹ค! ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ํ•„์š”ํ•œ๊ฑธ๊นŒ?

thymeleaf ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ๋ฐ ์„œ๋ฒ„ ์—†์ด HTML ํŒŒ์ผ์„ ์—ด์–ด ํ™”๋ฉด์— ๋„์šธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค!

๐ŸŽˆ ๋™์ž‘ ๋ฐฉ์‹

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/hello-mvc๋ฅผ ๋˜์ง€๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„ ์Šคํ”„๋งํ•œํ…Œ ์ „๋‹ฌํ•œ๋‹ค.

  2. ์ „๋‹ฌ๋ฐ›์€ ์Šคํ”„๋ง์€ ๋งค์นญ ๊ฐ€๋Šฅํ•œ Controller๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. (@GetMapping)

  3. ๋งค์นญ๋œ ๋ฉ”์†Œ๋“œ๋Š” ๋ฆฌํ„ด์„ ํ•  ๋•Œ hello-template์„ ๋„˜๊ธฐ๊ณ  Model์—๋Š” (name:spring)์„ ๋‹ด์•„ ๋ณด๋‚ธ๋‹ค.

  4. viewResolver๊ฐ€ ํ™”๋ฉด์„ ์ฐพ๊ณ  ํ…œํ”Œ๋ฆฟ ์—”์ง„์— ์—ฐ๊ฒฐํ•œ๋‹ค.

  5. ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ๋ Œ๋”๋ง์„ ํ†ตํ•ด ๋ณ€ํ™˜๋œ HTML์„ ์›น ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“’ API

์„œ๋ฒ„์—์„œ Json ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ํฌ๋งท์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

@GetMapping("hello-string")
@ResponseBody //HTTP์˜ Body์— ๋ฌธ์ž ๋‚ด์šฉ์„ ์ง์ ‘ ๋ฐ˜ํ™˜
public String helloString(@RequestParam("name") String name) {
	return "hello " + name; //๋งŒ์•ฝ name์ด spring์ด๋ผ๋ฉด hello spring, view ์—†์ด ๋ฌธ์ž๊ฐ€ ๋ฐ”๋กœ ์ „๋‹ฌ
}


โœ” View๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ์†Œ์Šค ๋ณด๊ธฐ๋ฅผ ํ–ˆ์„ ๋•Œ html ์ฝ”๋“œ๋กœ ๋œจ์ง€ ์•Š๊ณ  ๊ธ€์ž๋งŒ ๊ทธ๋Œ€๋กœ ๋œธ

๐ŸŽˆ JSON

@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;
	}
}


โœ” ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด, key์™€ value๋กœ ์ด๋ฃจ์–ด์ง„ JSON ํ˜•์‹์œผ๋กœ ๋ฐ˜ํ™˜

๐ŸŽˆ ๋™์ž‘ ๋ฐฉ์‹

  1. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080/hello-api๋ฅผ ๋˜์ง€๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ ๋ฐ›์•„ ์Šคํ”„๋งํ•œํ…Œ ์ „๋‹ฌํ•œ๋‹ค.

  2. ์ „๋‹ฌ๋ฐ›์€ ์Šคํ”„๋ง์€ ๋งค์นญ ๊ฐ€๋Šฅํ•œ Controller๋ฅผ ์ฐพ์•„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค. (@GetMapping)

  3. @ResponseBody๋Š” HTTP์˜ ์‘๋‹ต body์— ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธฐ๋„๋ก ๋™์ž‘ํ•œ๋‹ค. ์ด๋•Œ, ๋„˜๊ฒจ์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌธ์ž๋ผ๋ฉด ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๊ฐ์ฒด๋ผ๋ฉด json ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋„๋ก default๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋‹ค.

  4. ๋ณ€ํ™˜์„ ํ•˜๊ธฐ ์œ„ํ•ด HttpMessageConverter๊ฐ€ ๋™์ž‘ํ•˜๋Š”๋ฐ, ๊ธฐ๋ณธ ๋ฌธ์ž ์ฒ˜๋ฆฌ๋Š” StringHttpMessageConverter์—์„œ ํ•˜๊ณ , ๊ธฐ๋ณธ ๊ฐ์ฒด ์ฒ˜๋ฆฌ๋Š” MappingJackson2HttpMessageConverter์—์„œ ํ•œ๋‹ค.

  5. ์ถ”๊ฐ€๋กœ byte ์ฒ˜๋ฆฌ ๋“ฑ ์—ฌ๋Ÿฌ HttpMessageConverter๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์˜ HTTP Accept ํ—ค๋”์™€ ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋ฐ˜ํ™˜ ํƒ€์ž… ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•ด์„œ ์„ ํƒํ•œ๋‹ค.

  6. ๊ทธ ํ›„ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•œ ์„œ๋ฒ„๋‚˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ“š ์ฐธ๊ณ ์ž๋ฃŒ

์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ 

profile
๊ฐ€๋ฟก์ด์˜ ๊ณต๋ถ€ ์ƒ์ž๐Ÿ“ฆ

0๊ฐœ์˜ ๋Œ“๊ธ€