rosieblue
article thumbnail
728x90

์ด ํฌ์ŠคํŠธ๋Š” ์ธํ”„๋Ÿฐ์˜ ์Šคํ”„๋ง ์ž…๋ฌธ - ์ฝ”๋“œ๋กœ ๋ฐฐ์šฐ๋Š” ์Šคํ”„๋ง ๋ถ€ํŠธ, ์›น MVC, DB ์ ‘๊ทผ ๊ธฐ์ˆ (๋ฌด๋ฃŒ) ๊ฐ•์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.


 

์Šคํ”„๋ง์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒฝ์šฐ๋Š” ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ์ •์  ํŒŒ์ผ ์ œ๊ณต (ex: test.jpeg, test.html)
  2. ํ…œํ”Œ๋ฆฟ ์—”์ง„(html์„ ๋™์ ์œผ๋กœ ๋ฐ”๊พธ๋Š” ์• ๋“ค)๊ณผ MVC(Model, View, Controller)
  3. API - JSON ํ˜•ํƒœ๋กœ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค์ฃผ๋Š” ํ˜•์‹

์˜ค๋Š˜์€ ์ด ์„ธ๊ฐ€์ง€์— ๋Œ€ํ•ด ํฌ์ŠคํŒ…ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์ •์  ํŒŒ์ผ ์ œ๊ณต

src/main/resources/static์— ์ •์  ํŒŒ์ผ abc.txt๋ฅผ ์ €์žฅํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.

๊ทธ๋Ÿฌ๋ฉด URL์—์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ localhost:8080/abc.txt๋กœ ๊ทธ๋ƒฅ ์ ‘๊ทผํ•˜๋ฉด๋œ๋‹ค. (๋‹จ์ˆœํžˆ URL์— ํŒŒ์ผ ์ž…๋ ฅํ•˜๋ฉด ๋จ)

๋ฌผ๋ก  ํ”„๋กœ๊ทธ๋žจ ๊ฐ™์€ ๊ฑฐ ๋ง๊ณ  ๋‹จ์ˆœ ํŒŒ์ผ๋งŒ ๋„์›Œ์ค„ ์ˆ˜ ์žˆ๋‹ค!

๊ฐ„๋‹จํ•œ html ์ •์  ํŒŒ์ผ

 

๋กœ์ง์€ ๋ญ˜๊นŒ?

์ผ๋‹จ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ localhost:8080/hello-spring.html๋กœ ์ ‘๊ทผํ•˜๋ฉด, ๋จผ์ € ํ†ฐ์บฃ ์„œ๋ฒ„๊ฐ€ hello-spring์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋ฐ, ์—†์œผ๋ฏ€๋กœ static์— ๊ฐ€์„œ ์ฐพ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๋จผ์ € ์ปจํŠธ๋กค๋Ÿฌ์— ๊ฐ€์„œ ์Šคํ”„๋ง์€ ๋งž๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ฐพ๋Š”๋‹ค.

๊ฐ•์˜ ์ž๋ฃŒ ์ฒจ๋ถ€ (๋ฌธ์ œ ์‹œ ๋ฐ”๋กœ ์‚ญ์ œ)

MVC

MVC๋Š” Model, View, Controller์˜ ์•ฝ์ž์ด๋‹ค. ์ด์ œ ์ด ์„ธ๊ฐ€์ง€์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ์•„๋ณด์ž

 

๋จผ์ € View vs Controller์ด๋‹ค.

View์™€ Controller๋Š” ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜์ง€๋งŒ View๋Š” ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š”๋ฐ ์ง‘์ค‘ํ•œ๋‹ค๋ฉด, Controller๋Š” ๋น„์ฆˆ๋‹ˆ์Šค์  ๋กœ์ง, ๋‚ด๋ถ€์  ๋กœ์ง(ex: ํšŒ์›๊ฐ€์ž… ์ค‘๋ณต ๊ฒ€์‚ฌ ๋“ฑ) ์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ ์ง‘์ค‘ํ•œ๋‹ค.

์˜ˆ์ „์—๋Š” View ํŒŒ์ผ ํ•˜๋‚˜์—๋‹ค ๋‹ค ํ•ด์„œ ๋„ˆ๋ฌด ๊ธธ๊ณ  ๋ณต์žกํ•ด์ง€๋Š” ๋ฉด์ด ์—†์ง€์•Š์•„ ์žˆ์—ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ controller๋ž‘ view๋ฅผ ์ชผ๊ฐœ ๊ธฐ๋Šฅ์„ ๋ถ„๋ฐฐํ•˜๋Š” ๊ฒƒ์ด ๋”  ํšจ์œจ์ ์ด์–ด์„œ ํ˜„์žฌ๋Š” view๊ณผ controller๋ฅผ ํ•จ๊ผ ์“ฐ๊ณ  ์žˆ๋‹ค.

 

@GetMapping("hello-mvc") //hello-mvc๋ผ๋Š” ๊ฒฝ๋กœ๋กœ get๋ฐฉ์‹์œผ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ์ด ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰
public String helloMVC(@RequestParam("name") String name, Model model){
	 model.addAtrribute("name",name); //model์— {name:name}์œผ๋กœ key:value ๊ฐ’? ์ถ”๊ฐ€
	 return "hello-template"; //์ด๋Ÿฌ๋ฉด hello-template.html์„ ๋„์›Œ์ค˜!
}

//@RequestParam("name") String name : ์‚ฌ์šฉ์ž๊ฐ€ name(์™ผ์ชฝ)์ด๋ž€ ์ด๋ฆ„์œผ๋กœ ๋ณด๋‚ด์ค€ ๊ฐ’์„ String name(์˜ค๋ฅธ์ชฝ)์œผ๋กœ ๋ฐ›๊ฒ ๋‹ค๋Š” ๋œป
//์—ฌ๊ธฐ์„œ ๋๋‚ด๋ฉด Required request parameter 'name' for method parameter type String is not present ๋ผ๋Š” ์—๋Ÿฌ๋‚จ
//์™œ๋ƒํ•˜๋ฉด name์ด๋ž€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์•ˆ๋ณด๋‚ด์คฌ๊ธฐ ๋•Œ๋ฌธ

 

์œ„ ์ฝ”๋“œ๋กœ localhost/hello-mvc์— ์ ‘๊ทผํ–ˆ์„ ๋•Œ๋Š” ์•ˆํƒ€๊น๊ฒŒ๋„ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค

์ด๋Š” ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ name๊ฐ’์„ ์‚ฌ์šฉ์ž๊ฐ€ ์•ˆ ๋ณด๋‚ด์คฌ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ์—๋Ÿฌ์ด๋‹ค. (@GetRequest ์—์„œ name์„ ๋ฐ›๊ธฐ๋กœ ํ–ˆ์—ˆ์œผ๋ฏ€๋กœ) /hello-mvc/name=haeun ์ด๋Ÿฐ์‹์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ์ž˜ ํ•ด๊ฒฐ๋œ๋‹ค.

 

 

๊ฐ•์˜์ž๋ฃŒ ์ฒจ๋ถ€ (๋ฌธ์ œ ์‹œ ๋ฐ”๋กœ ์‚ญ์ œ)

 

์ฐธ๊ณ ) html ํŒŒ์ผ์˜ p ํƒœ๊ทธ

<p th:text="'hello' +${name}">hello!empty</p>
//์—ฌ๊ธฐ์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ์ž‘๋™ํ•˜๋ฉด p ํƒœ๊ทธ ์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค*hello+$(name)~์ด ์ž‘๋™์ด ๋˜๊ตฌ,,,,,,
๋งŒ์•ฝ์— ์ž‘๋™ ์•ˆํ•˜๋ฉด hello, empty๊ฐ€ ์ž‘๋™๋˜๋Š”๊ฒƒ!(์‹ ๊ธฐํ•œ๊ฑด ๊ทธ๋ƒฅ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ์ž…๋ ฅํ•ด๋„ url์—์„œ ์ ‘๊ทผ์ด ๋œ๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ํ…œํ”Œ๋ฆฟ ์—”์ง„์€ ์ ์šฉ ์•ˆ๋˜๋Š”๊ฑฐ๊ตฌ~)

 

API

์œ„์—์„œ ํ…œํ”Œ๋ฆฟ ์—”์ง„์œผ๋กœ htmlํŒŒ์ผ์„ ๋ Œ๋”๋งํ•ด์„œ ๋‚ด๋ ค์ฃผ์—ˆ๋‹ค๋ฉด, ์ด์ œ API ๋ฐฉ์‹์€ ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ ๊ทธ์ž์ฒด๋งŒ ๋‚ด๋ ค์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๊ฒŒ ๋ญ” ์†Œ๋ฆฐ๊ฐ€ ์•„์ฃผ์•„์ฃผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

 

@GetMapping("hello-string")
@ResponseBody //์ด๊ฑธ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ž์ฒด๊ฐ€ ๊ทธ๋ƒฅ ๋ฐ”๋กœ http ๋ฐ”๋””์— ๋“ค์–ด๊ฐ!! ํ…œํ”Œ๋ฆฟ ์—”์ง€์ด๋‚˜ ๋ทฐ๊ฐ™์€๊ฑฐ ์ƒ๊ด€ ์—†์ด!
// ์ด๊ฒŒ ๋ชฌ ์†Œ๋ฆฌ๋ƒ ํ•˜๋ฉด, ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์— name ๋„ฃ์–ด์„œ ์ ‘๊ทผํ•ด์„œ ํ™”๋ฉด์—์„œ ์†Œ์Šค๋ณด๊ธฐ(๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ง๊ณ !) ํ•˜๋ฉด, ๊ทธ๋ƒฅ ใ„นใ…‡๋กœ html ์ด๋”ด ๊ฑฐ ์—†์ด ๋ฐ์ดํ„ฐ๋งŒ ์ก์œผ๋กœ ๋‚ด๋ ค๊ฐ
public String helloString(@RequestParam("name") String name){
    return "hello "+name;
}

@ResponseBody๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ HTTP Response ๋ฉ”์‹œ์ง€์˜ body ๋ถ€๋ถ„์— ๋„ฃ์–ด์„œ ๋ณด๋‚ด๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค!

๋‹ค๋ฅธ ๋ฐฉ์‹๋“ค์€ html๋กœ ๊ฐ์‹ธ์„œ ๋“ค์–ด๊ฐ”๋”ฐ๋ฉด ์ด๊ฑด ๊ทธ๋Ÿฐ๊ฑฐ ์—†๋‹ค 

 

์™ผ ์ชฝ์ด ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์ด์šฉํ•ด์„œ ๊ฐ„ ๊ฒฝ์šฐ, ์˜ค๋ฅธ ์ชฝ์€ API ์ด์šฉํ•ด์„œ ๊ฐ„๊ฒฝ์šฐ์˜ ์†Œ์Šค ์ฝ”๋“œ

์˜ค๋ฅธ ์ชฝ์€ html ๋”ฐ์œ„ ์—†์ด ๋ง๊ทธ๋Œ€๋กœ hello cute๋งŒ ์ „๋‹ฌ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!

 

 

 

์ข€๋” ๋ณต์žกํ•˜๊ฒŒ ๊ฐ€๋ณด์ž. ์ด์ œ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์ฃผ๊ณ  ์ด ํด๋ž˜์Šค๋กœ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ API๋กœ ๋‚ด๋ณด๋‚ด์ค„(?) ๊ฒƒ์ด๋‹ค.

static class Hello{ //ํด๋ž˜์Šค Hello ์ •์˜
        private String name;

        //๊ฒŒํ„ฐ์„ธํ„ฐ ์ •์˜~์˜ฌ๋งŒ์ด์•ผใ… ใ… 
        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name=name;
        }
    }

์•„์ฃผ ๊ฐ„๋‹จํ•œ Hello๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์ฃผ์—ˆ๋‹ค. 

์–˜๋Š” name์ด๋ผ๋Š” String์„ ๋ฉค๋ฒ„๋กœ, getName(),setName()์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„๋‹ค.

 

@GetMapping("hello-api") 
@ResponseBody 
public Hello helloAPI(@RequestParam ("name") String name){ //์ด์ œ Hello๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ!
        //์ฐธ๊ณ ๋กœ @requestParam(name)์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋‚ธ ๋ณ€์ˆ˜ 'name'(์™ผ์ชฝ)์„ ์˜ค๋ฅธ์ชฝ name์ด๋ผ๋Š” String์œผ๋กœ ๋ฐ›๋Š”๋‹ค๋Š” ๊ฑฐ ๊ฐ™๋‹ค
        Hello hello = new Hello();
        hello.setName(name);
        return hello; //hello๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
    }
    //json์€ key,value ํ˜•ํƒœ๋กœ๋œ ๊ตฌ์กฐ
}

 

์ฒ˜์Œ์œผ๋กœ String์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‚˜์™”๋‹ค. Hello ๊ฐ์ฒด ์ƒ์„ฑํ›„ name์„ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•˜๋ฏ€๋กœ ์–˜๋„ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์—์„œ ?name=์–ด์ฉŒ๊ตฌ ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด์„œ ์ ‘๊ทผํ•ด์•ผํ•œ๋‹ค.

 

localhost:8080/hello-api?name=hannah ๋กœ ์ ‘๊ทผํ•œ ๋ชจ์Šต

์ด์ฒ˜๋Ÿผ ๊ฐ์ฒด ๊ทธ์ž์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋Ÿฐ๊ฑด JSON ๋ฐฉ์‹์ธ๋ฐ, ์˜ˆ์ „์—๋Š” XML ๋ฐฉ์‹์ด ๋งŽ์ด ์“ฐ์˜€๋‹ค๊ณ  ํ•œ๋‹ค!! (html ํƒœ๊ทธ๊ฐ€ ๊ทธ๋Ÿฐ ๋ฐฉ์‹์ž„!) ๊ทธ๋Ÿฐ๋ฐ ์ข€ ๋ฌด๊ฒ๊ณ , ํƒœ๊ทธ ์—ด๊ณ  ๋‹ซ๊ณ  ํ•ด์•ผ๋ผ์„œ ๊ท€์ฐฎ์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.. ๊ทธ๋ž˜์„œ ์š”์ฆ˜์€ JSON๋ฅผ ๋””ํดํŠธ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค!

 

viewResolver๋Š” ์—ฌ๊ธฐ์„œ ์•ˆ๋‚˜์˜จ๋‹ค!! 

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์œผ๋กœ jsonํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์„œ ๋ณด๋‚ด์ฃผ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ ์ •์ฑ…์ด๋‹ค!!

@ResponseBody ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด viewResolver ๋ง๊ณ  HttpMessageConverter๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค (ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” viewResolver๋กœ ๊ฐ€์„œ ํ…œํ”Œ๋ฆฟ์„ ์ฒ˜๋ฆฌํ•ด์คฌ๋‹ค)

  • ์•„๋งˆ HttpMessageConverter๋Š” jsonํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ญํ• ๋„ ํ•˜๋Š” ์• ์ธ๊ฐ€…….?
  • ์˜ค,,, HttpMessageConverter๋Š” ๊ฐ์ฒด๊ฐ€ ์˜ค๋ฉด JSON ํ˜•ํƒœ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” MappingJackson2HttpMessageConverter๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค!!(Jackson์€ ๋ญฅ๋ฏธ? ๊ฑ ๊ฐ์ฒด๋ฅผ json์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ jackson์ธ๋“ฏํ•˜๋‹ค) ๊ทธ๋ฆฌ๊ณ  String์ด ์˜ค๋ฉด ์–˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” StringHttpMessageConverter ๊ธฐ๋Šฅ์ด ์žˆ๊ณ ~! ์–˜๋„ค๋ง๊ณ  ๋‹ค๋ฅธ ์• ๋“ค ex)byte ๋„ ๋‹ค๋ค„์ฃผ๋Š” ๋‹ค๋ฅธ converter๋“ค๋„ ์žˆ๋‹ค๊ตฌ ํ•œ๋‹น

 

์•„๋ฌดํŠผ ์˜ค๋Š˜์€ Spring์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค.

 

๋”๋ณด๊ธฐ

๊ฐ•์˜ ๋๊นŒ์ง€ ๋‹ค ๋“ค์—ˆ๋Š”๋ฐ,,, ์ƒˆ๋กœ ํ”Œ์  ํŒŒ๊ณ  ๊ฑฐ๊ธฐ์„œ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ ๊นƒํ—™์— ์˜ฌ๋ฆฌ๋‹ค๊ฐ€ ํ„ฐ๋ฏธ๋„์—์„œ ์‹ค์ˆ˜๋กœ !! ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ด๋ฒ„๋ ค์„œ ๋‹ค์‹œ ๋“ค์–ด์•ผํ•œ๋‹ค..... ๊ฑฐ๊ธฐ ํ•„๊ธฐ๋„ ๋‹ค์žˆ์Œ ใ…‹ ใ…‹ ใ…‹ ใ…‹ ใ…‹ ใ…‹ ใ…‹ ใ…œ ใ…  ใ…  ใ…  

profile

rosieblue

@Rosieblue

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!