@RequestParam ์—์„œ @ModelAttribute๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๊นŒ์ง€์˜ ๋ณ€ํ™”๋ฅผ ์•Œ์•„๋ณด์ž

 

 

 

1.@RequestParam ์„ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ง์ ‘ ๋ฐ›๊ธฐ

 

@PostMapping("/add")
public String addItemV1(@RequestParam String itemName,
                        @RequestParam int price,
                        @RequestParam Integer quantity,
                        Model model) {
    Item item = new Item();
    item.setItemName(itemName);
    item.setPrice(price);
    item.setQuantity(quantity);
    itemRepository.save(item);
    model.addAttribute("item", item);
    return "basic/item";
}

 

ํ•ด๋‹น ๋ณ€์ˆ˜ ์ด๋ฆ„์— ๋งž๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง์ ‘ ๋ฐ›๊ณ  itemRepository์— ์ €์žฅํ•œ๋‹ค.

ํ•ด๋‹น item ๊ฐ์ฒด๋ฅผ ๋ชจ๋ธ์— ์ „๋‹ฌํ•œ๋‹ค.

 

 

2.@ModelAttribute๋ฅผ ํ†ตํ•œ ์ฃผ์ž…

 

@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item, Model model) {
    itemRepository.save(item);
    //model.addAttribute("item", item); //์ž๋™ ์ถ”๊ฐ€, ์ƒ๋žต ๊ฐ€๋Šฅ
    return "basic/item";
}

 

@RequestParam ์„ ์ƒ๋žตํ•ด๋„ @ModelAttribute๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑ์ž๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์ด๋ ‡๊ฒŒ ๋„˜์–ด์˜จ item ๊ฐ’์„ ์ž๋™์œผ๋กœ ๋ชจ๋ธ์— ๋„˜๊ฒจ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— 

model.addAttribute ์ฝ”๋“œ๋ฅผ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ๋‹ค.

๋งŒ์•ฝ @ModelAttribute("item2")๋ผ๊ณ  ์ž…๋ ฅํ•ด์ค€๋‹ค๋ฉด, ๋ชจ๋ธ์— "item2"๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

 

3.@ModelAttribute์˜ ์ด๋ฆ„ ์ƒ๋žต

 

@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
    itemRepository.save(item);
    return "basic/item";
}

 

@ModelAttribute์˜ ์ด๋ฆ„์„ ์ƒ๋žตํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.

์ด ๊ฒฝ์šฐ item ํด๋ž˜์Šค์˜ Item์„ ์•ž ๊ธ€์ž๋งŒ ์†Œ๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ ํ›„ ๋ชจ๋ธ ์ด๋ฆ„์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

 

model.addAttribute("item",item);

 

4. @ModelAttribute๊นŒ์ง€ ์ƒ๋žต

 

@PostMapping("/add")
public String addItemV4(Item item) {
    itemRepository.save(item);
    return "basic/item";
}

 

@ModelAttribute ๊นŒ์ง€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ด ๊ฒฝ์šฐ์—๋„ ์œ„์™€ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ง๊ด€์„ฑ์ด ๋„ˆ๋ฌด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์„ ๊ถŒํ•˜์ง€ ์•Š๋Š”๋‹ค.

"Redirect๋ฅผ ์™œ ํ•„์š”ํ• ๊นŒ?"

 

PRG๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์ „์— ๋จผ์ € Rediect์˜ ํ•„์š”์„ฑ์„ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ƒํ’ˆ์„ ์ˆ˜์ •, ๊ฐœ๋ฐœํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž 

 

@PostMapping("/addForm")
public String addCafe(@ModelAttribute Cafe cafe){
    cafeRepository.save(cafe);
    return "basicCafe/cafe";
}

์นดํŽ˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ถ”๊ฐ€๋ฅผ ์™„๋ฃŒํ•œ ๋’ค ์ƒˆ๋กœ ๊ณ ์นจ์„ ๋ˆ„๋ฅด๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

๋˜‘๊ฐ™์€ ์ •๋ณด๋“ค์ด ๊ณ„์†ํ•ด์„œ ์ž…๋ ฅ๋  ๊ฒƒ์ด๋‹ค.

์ด๋Š” Redirect๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ, ์ด๋ ‡๊ฒŒ๋˜๋ฉด ๋งˆ์ง€๋ง‰์œผ๋กœ ์„œ๋ฒ„์— ์ „์†กํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ณ„์† ์‹คํ–‰์‹œํ‚จ๋‹ค.

POST, Redirect Get

 

PRG๋Š” ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋˜‘๊ฐ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ง‰์•„์ค€๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ ๊ฒฝ๋กœ๋ฅผ ์šฐํšŒํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

๋ฉ”์„œ๋“œ ์‹คํ–‰ ์™„๋ฃŒ ํ›„ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํ˜ธ์ถœํ•ด์คŒ์œผ๋กœ์จ ์„œ๋ฒ„๋Š” ๋” ์ด์ƒ ๋˜‘๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ˜๋ณตํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค!

 

 

๊ทธ๋Ÿผ ์ด์ œ ์œ„์—์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋˜ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์ž

 

@PostMapping("/addForm")
public String addCafe(@ModelAttribute Cafe cafe){
    cafeRepository.save(cafe);
    return "redirect:/basicCafe/cafes"+ cafe.getId();
}

 ์ด๋ ‡๊ฒŒ ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ์ ์šฉ์‹œํ‚ด์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ

"cafe.getId() ์ฒ˜๋Ÿผ URL์— ๋ณ€์ˆ˜๋ฅผ ๋”ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ URL ์ธ์ฝ”๋”ฉ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•˜๋‹ค."

์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ๋ณ€์ˆ˜์— ๋„์›Œ์“ฐ๊ธฐ๋‚˜ ํ•œ๊ธ€์ด ํฌํ•จ๋  ๊ฒฝ์šฐ ์„œ๋ฒ„๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ url์ธ์ฝ”๋”ฉ์„ ํ•ด์ฃผ์–ด์•ผํ•˜๋Š”๋ฐ 

์ด๊ฒƒ์ด ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ฒฐ๊ตญ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‘๊ฐ€์ง€ ํ•ด๊ฒฐ์ฑ…์ด ์ œ์‹œ๋˜์—ˆ๋‹ค.

 

์ฒซ๋ฒˆ์งธ, @PathVariable ์‚ฌ์šฉ

 

@PostMapping("/edit/{cafeId}")
public String edit(@PathVariable Long cafeId,@ModelAttribute Cafe cafe){
    cafeRepository.update(cafeId,cafe);
    return "redirect:/basic/items/{cafeId}";
}

 

@PathVariable ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ปจํŠธ๋กค๋Ÿฌ์— ๋งคํ•‘๋œ ๊ฐ’๋„ Redirect ๊ฐ’์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋‘๋ฒˆ์งธ, RedirectAttributes ์‚ฌ์šฉ

 

@PostMapping("/addForm")
public String addCafe(@ModelAttribute Cafe cafe, RedirectAttributes redirectAttributes){
    Cafe savedCafe = cafeRepository.save(cafe);
    redirectAttributes.addAttribute("cafeId",savedCafe.getId());
    redirectAttributes.addAttribute("status",true);
    return "redirect:/basicCafe/items/{cafeId}";
}

 

RedirectAttributes ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, URL ์ธ์ฝ”๋”ฉ๋„ ํ•ด์ฃผ๊ณ , pathVarible , ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋Š” 

localhost:8080/basic/cafes/3?status=true

๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.

 

๊ตณ์ด PathVariable์„ ์“ธ ํ•„์š”๋„ ์—†๊ณ  url ์ธ์ฝ”๋”ฉ ๊ฑฑ์ •๋„ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 

๊ฒŒ๋‹ค๊ฐ€ status ํŒŒ๋ผ๋ฏธํ„ฐ๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค !! (๋ฐ”์ธ๋”ฉ ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ)

ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํƒ€์ž„๋ฆฌํ”„ ๋ฌธ๋ฒ•์—์„œ ${param.status}๋กœ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

 

์‹ค๋ฌด์—์„œ๋Š” printLn ์ด ์•„๋‹Œ ๋กœ๊น…์„ ํ†ตํ•˜์—ฌ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค.

 


@RestController
public class LogTestController {
    private final Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/log-test")
    public String logTest(){
        String name = "spring";

        log.trace("trace log = {}", name);
        log.debug("debug log = {}", name);
        log.info("info log = {}", name);
        log.warn("warn log = {}", name);
        log.error("error log = {}", name);

        log.debug("debug log={}",name);

        return "ok";
        
    }

 

๋จผ์ € ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— ๋ถ™์€ @RestController ์—๋…ธํ…Œ์ด์…˜์€ ๋ฆฌํ„ด ๊ฐ’์„ Http ๋ฐ”๋””์— ๋ฐ”๋กœ ์ž…๋ ฅํ•ด์ค€๋‹ค.

(@Controller ๋Š” ๋ฐ˜ํ™˜๊ฐ’์„ ๋ทฐ ์ด๋ฆ„์œผ๋กœ ์ธ์‹ํ•œ๋‹ค.)

 

@Slf4j
@RestController
public class LogTestController {
    //private final Logger log = LoggerFactory.getLogger(getClass());

๋˜ํ•œ @sLf4j ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋กœ๊ทธ ์„ ์–ธ์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

 

๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด trace์™€ debug ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐ, ์ด๋Š” application.properties ์˜ ๊ธฐ๋ณธ ์„ค์ •๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค.

 

# ๊ธฐ๋ณธ ์„ค์ •
logging.level.root=info
#debug ์ดํ•˜์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.
logging.level.hello.springmvc=debug

 

์ด๋ ‡๊ฒŒ ์„ค์ •์„ ํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๊ทธ๋ฅผ ์ฐ์–ด๋ณด์ž

 

์ด๋Ÿฐ์‹์œผ๋กœ ๋กœ๊ทธ ์ถœ๋ ฅ ๋‹จ๊ณ„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

(TRACE > DEBUG > INFO > WARN > ERROR)

 

log.debug("debug log={}"+name);

์ฐธ๊ณ ๋กœ ์ด์™€ ๊ฐ™์€ ์ถœ๋ ฅ ํ˜•์‹์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ถœ๋ ฅ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ๋ฌธ์ž์—ด + ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋” ๋งŽ์€ ๊ธฐ๋Šฅ์€?

SLF4J

 

SLF4J

Simple Logging Facade for Java (SLF4J) The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framewor

www.slf4j.org

Logback Home (qos.ch)

 

Logback Home

Logback Project Logback is intended as a successor to the popular log4j project, picking up where log4j 1.x leaves off. Logback's architecture is quite generic so as to apply under different circumstances. At present time, logback is divided into three mod

logback.qos.ch

Core Features (spring.io)

 

Core Features

Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use a variety of external configuration sources, include Java properties files, YAML files, environment variables, an

docs.spring.io

 

application.properties ์— ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค.

 

logging.level.org.apache.coyote.http11=debug

 

์ ์šฉ ์ „
์ ์šฉ ํ›„

์šด์˜ ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ์š”์ฒญ ์ •๋ณด๋ฅผ ๋‚จ๊ธฐ๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋งŒ ํ™œ์šฉํ•˜๋„๋ก ํ•˜์ž!

+ Recent posts