๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring๐Ÿƒ/๊น€์˜ํ•œ์˜ ์Šคํ”„๋ง ์™„์ „์ •๋ณต

์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜ ๋…ธํŠธ ์ •๋ฆฌ (1) : ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •

728x90

1. with Spring initializr

Metadata

Group : ๊ธฐ์—… ์ด๋ฆ„, ๋„๋ฉ”์ธ ๋ช…

Artifact : ๋นŒ๋“œ๋˜์–ด ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฌผ์˜ ์ด๋ฆ„ ( ํ”„๋กœ์ ํŠธ๋ช… )

Dependencies : ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

์›น ํ”„๋กœ์ ํŠธ -> Spring Web

HTML ํ…œํ”Œ๋ฆฟ ์—”์ง„ -> Thymeleaf ๋“ฑ

test : ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๊ด€๋ จ๋‚ด์šฉ

resources : java ํŒŒ์ผ์„ ์ œ์™ธํ•œ xml, ์„ค์ •ํŒŒ์ผ ๋“ฑ

 

build.gradle

plugins : ๊ทธ๋ž˜๋“ค ์„ค์ •

repositories : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ URL

dependencies : ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

gitignore : ์†Œ์Šค์ฝ”๋“œ ๊ด€๋ฆฌ ( ๊นƒํ—™์— ํ•„์š”์—†๋Š” ์ฝ”๋“œ๋“ค์€ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก )

 

์ž๋ฐ” ํด๋” ์•ˆ ํ”„๋กœ์ ํŠธ ํŒจํ‚ค์ง€ ์•ˆ ๋ฉ”์ธ ๋ฉ”์„œ๋“œ + ์ž๋ฐ” ์‹ฌํ™”

 

์„œ๋ฒ„๋ฅผ ์—ด๋ฉด์„œ..

์Šคํ”„๋ง ๋ถ€ํŠธ ๋ฒ„์ „ ํ™•์ธ

ํ†ฐ์บฃ ํฌํŠธ ๋ฒˆํ˜ธ ํ™•์ธ

 

2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด

dependencies์—๋Š” ์—†๋Š” ์ˆ˜ ๋งŽ์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๊ณผ ํ•จ๊ป˜ ๋ฐ›์•„์ง„๋‹ค.

Why? ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐ„ ์˜์กด๊ด€๊ณ„๊ฐ€ ๋‹ค๋ฐฉ๋ฉด์œผ๋กœ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ

 

Gradle์—์„œ..

Dependencies์— ์˜์กด๊ด€๊ณ„๊ฐ€ ์ •๋ฆฌ๋˜์–ด ์žˆ๋‹ค -> Thymeleaf, Spring Web๋งŒ ๊ฐ€์ ธ์™€๋„ ์ˆ˜ ๋งŽ์€ ์—ฐ๊ด€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐ™์ด ์˜จ๋‹ค

+ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— (*) ํ‘œ์‹œ : ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋™์ผํ•œ ๋‚ด์šฉ์„ ์ด๋ฏธ ๊ฐ€์ ธ์™”์Œ

* tomcat : ์›น ์„œ๋ฒ„ ~ WAS

์Šคํ”„๋ง ๋ถ€ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : auto configure, dependencies, starter-logging, spring core ๋“ฑ

๋กœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ~ ์‹ค๋ฌด: Log๋กœ ๊ธฐ๋กํ•ด์•ผ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ์œ„ํ•œ ์ž๋ฃŒ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค

(in ์Šคํ”„๋ง ๋ถ€ํŠธ ์Šคํƒ€ํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ - ๋กœ๊น…) -> ์š”์ฆ˜ ํ‘œ์ค€์ธ logback, slf4j ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ~ ๊ฒ€์ƒ‰ํ•˜๊ธฐ

 

in spring boot starter test

์Šคํ”„๋ง ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Java Junit ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Mockito : ๋ชฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

assertj : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋„์šฐ๋ฏธ

spring- test : ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง€์›

 

3. View ์„ค์ • ๋“ฑ

index.html ~ welcome ํŽ˜์ด์ง€ ์ž‘์„ฑ (์Šคํ”„๋ง ๋ถ€ํŠธ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ : index.html์„ ๊ธฐ๋ณธ ์„ค์ •ํ•จ)

์›น ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ํ†ตํ•ด ์ง€์ •๋œ ํ…œํ”Œ๋ฆฟ ์–‘์‹๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ฉ์ณ์ ธ์„œ HTML ๋ฌธ์„œ๋ฅผ ์ถœ๋ ฅ

(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ํ…œํ”Œ๋ฆฟ ์—”์ง„ ์˜ˆ : JSP/ Thymleaf)

 

์ปจํŠธ๋กค๋Ÿฌ ํŒจํ‚ค์ง€ ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„

templates ํด๋”์— ํ…œํ”Œ๋ฆฟ ์—”์ง„์ด ์ ์šฉ๋˜๋Š” HTML ํŒŒ์ผ ์ž‘์„ฑ ~ ๋™์ ํ• ๋‹น๋œ HTML

์ถœ์ฒ˜ : ๊น€์˜ํ•œ์˜ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜

* ๊ฐ„๋‹จํžˆ ํŠธ๋Ÿฌ๋ธ” : ๊ฐ™์€ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ controller์˜ ์š”์ฒญ์€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ? ์ ‘๊ทผ์ œ์–ด์ž?

+ Dev-tools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด HTML ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ๋งŒ ์žˆ๋‹ค๋ฉด ์„œ๋ฒ„ ์žฌ์‹œ์ž‘์—†์ด View ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

4. ๋ช…๋ น์–ด๋กœ ๋นŒ๋“œํ•˜๊ธฐ

5. ์Šคํ”„๋ง ์›น๊ฐœ๋ฐœ ๊ธฐ์ดˆ

์ •์  ์ปจํ…์ธ  : ์„œ๋ฒ„์˜ ์ž‘์—… ์—†์ด ์š”์ฒญ์— ์ฆ‰์‹œ ํŒŒ์ผ๋กœ ์‘๋‹ตํ•˜๋Š” ์ปจํ…์ธ 

MVC์™€ ํ…œํ”Œ๋ฆฟ ์—”์ง„ : Jsp, Php ๋“ฑ html์„ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹

API : Json์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹, ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹  ๋ฐฉ๋ฒ•(html์„ ๋ฐ˜ํ™˜ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค) ~ React ๋“ฑ

 

MVC vs ์ •์  ์ปจํ…์ธ 

- ์ •์  ์ปจํ…์ธ ๋Š” ์„œ๋ฒ„์—์„œ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๋‚ด์šฉ์ด ์—†๋‹ค

 

์ •์  ์ปจํ…์ธ 

<!DOCTYPE HTML>
<html>
<head>
 <title>static content</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
์ •์  ์ปจํ…์ธ  ์ž…๋‹ˆ๋‹ค.
</body>
</html>

 

MVC

View : ํ™”๋ฉด์„ ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐ ์ง‘์ค‘

MC : ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ์— ์ง‘์ค‘

 

Param ๋ฐฉ์‹์œผ๋กœ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ

@Controller
public class HelloController {
 @GetMapping("hello-mvc")
 public String helloMvc(@RequestParam("name") String name, Model model) {
 model.addAttribute("name", name);
 return "hello-template";
 }
}
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>

http://localhost:8080/hello-mvc?name=spring!

 

API

@GetMapping("hello-string")
    @ResponseBody // ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ http ์‘๋‹ต body๋กœ ๋ณ€ํ™˜
    public String helloString(@RequestParam("name")String name) {
        return "hello" + name; // ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ์‘๋‹ต
    }
    
// ๋ฌธ์ž์˜ ๊ฒฝ์šฐ์—” ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹, ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๊ฒฝ์šฐ์—” API ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์ž

 

@ResponseBody๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ Json์œผ๋กœ ๋ฐ˜ํ™˜ ~ API๋ฐฉ์‹

์ถœ์ฒ˜ : ๊น€์˜ํ•œ ์Šคํ”„๋ง ์ž…๋ฌธ ๊ฐ•์˜

@ResponseBody ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ทฐ ๋ฆฌ์กธ๋ฒ„( viewResolver )๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋Œ€์‹ ์— HTTP์˜ BODY์— ๋ฌธ์ž ๋‚ด์šฉ์„ ์ง์ ‘ ๋ฐ˜ํ™˜(HTML BODY TAG๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜)

 

๋ทฐ ๋ฆฌ์กธ๋ฒ„ ๋Œ€์‹  HttpMessageConverter๊ฐ€ ๊ฐ์ฒด๋ฅผ ๋ฐ›๊ณ , String์˜ ๊ฒฝ์šฐ StringConverter, ๊ธฐ๋ณธ ๊ฐ์ฒด๋Š” JsonConverter(MappingJackson : ์Šคํ”„๋ง ๊ธฐ๋ณธ, Gson ๋“ฑ)๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ ํ›„ ์‘๋‹ต

 

+ ๋‚ด๋ถ€ ํด๋ž˜์Šค : ๋‚ด๋ถ€ ํด๋ž˜์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  ์ข…์†๋œ ์™ธ๋ถ€ ํด๋ž˜์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Static ๋‚ด๋ถ€ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์™ธ๋ถ€ ํด๋ž˜์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•˜์ง€ ์•Š์•„๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

( ์ ‘๊ทผ vs ํ˜ธ์ถœ??)

 

+ ์ž๋ฐ” ๋นˆ ๊ทœ์•ฝ? 

https://dololak.tistory.com/133

 

[JAVAEE] ์ž๋ฐ”๋นˆ(JavaBean) ์ด๋ž€? ์ž๋ฐ”๋นˆ ๊ทœ์•ฝ์— ๋Œ€ํ•ด

์ž๋ฐ”๋นˆ(JavaBean) ์ด๋ž€? ์ž๋ฐ”๋นˆ์ด๋ž€ ํŠน์ •ํ•œ ๊ธฐ๋Šฅ์„ ์ง€๋‹Œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์ž๋ฐ”๋นˆ ๊ทœ์•ฝ ๋˜๋Š” ์ž๋ฐ”๋นˆ ๊ด€๋ก€์— ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง„ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ”๋นˆ ์‚ฌ์šฉ ๋ฐฐ

dololak.tistory.com

+ ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ ๋ฐฉ์‹

728x90