[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #2. Create

2024. 11. 23. 00:40ยท๐Ÿ–ฅ๏ธdevelop/Backend

ํ”„๋กœ์ ํŠธ ๋ฒ„์ „ ๋ณ€๊ฒฝ

Spring Initializr์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋•Œ 3.4.0 ๋ฒ„์ „์œผ๋กœ ์ƒ์„ฑํ•˜์˜€๋Š”๋ฐ, ๊ต์žฌ๋Š” 3.1.0 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์›ํ™œํ•œ ์ง„ํ–‰์„ ์œ„ํ•ด ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง๋ถ€ํŠธ ๋ฒ„์ „์€ build.gradle ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

 

์œ„ ๋ถ€๋ถ„์„ 3.1.0์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ์˜†์— ๋‚˜ํƒ€๋‚˜๋Š” ์ฝ”๋ผ๋ฆฌ ์•„์ด์ฝ˜์„ ํด๋ฆญํ•˜๋ฉด ๋ฒ„์ „ ๋ณ€๊ฒฝ ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค. 

 

์ฝ”๋ผ๋ฆฌ ๋ฒ„ํŠผ

 

 


ํผ ๋ฐ์ดํ„ฐ

HTML ์š”์†Œ์ธ <form> ํƒœ๊ทธ์— ์‹ค๋ ค ์ „์†ก๋˜๋Š” ๋ฐ์ดํ„ฐ

 

<form> ํƒœ๊ทธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ด๋””๋กœ(where), ์–ด๋–ป๊ฒŒ(how) ๋ณด๋‚ผ์ง€ ๋“ฑ์„ ์ ์–ด์„œ, ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

DTO

Data Transfer Object, ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฐ์ฒด

ํƒœ๊ทธ์— ์‹ค์–ด ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ๋Š” ์„œ๋ฒ„์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฐ›๋Š”๋ฐ, ์ด ๊ฐ์ฒด๋ฅผ DTO๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. DTO๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

 


์ž…๋ ฅ ํผ ์‹ค์Šต

1. ํผ ํŽ˜์ด์ง€ ์ƒ์„ฑ

resource > templates > articles ํ•˜์œ„์— new.mustache ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ณ , ํผ ์ž‘์„ฑ

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Document</title>
</head>
<body>
    <form>
        <input type = "text">
        <textarea></textarea>
        <button type = "submit" >Submit</button>
    </form>
</body>
</html>

 

java > ํ”„๋กœ์ ํŠธ๋ช… ํด๋” > controller ํ•˜์œ„์— ArticlesController ํด๋ž˜์Šค ์ƒ์„ฑํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑ

package com.example.firstproject.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class ArticleController {
    @GetMapping("/articles/new")
    public String newArticleForm() {
        return "articles/new";
    }
}

 

localhost8080:/articles/new ์ ‘์†ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

์ผ๋‹จ ์Šคํƒ€์ผ๋ง์€ ์ƒ๋žตํ•˜๊ณ , ํผ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธฐ๋Šฅ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2. ํผ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธฐ๋Šฅ

๋งŒ๋“  ํผ์—๋Š” ์ž…๋ ฅ ์ฐฝ๊ณผ, ๋ฒ„ํŠผ์ด ์žˆ์ง€๋งŒ ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋ฒ„ํŠผ์„ ์•„๋ฌด๋ฆฌ ๋ˆŒ๋Ÿฌ๋ดค์ž ์•„๋ฌด๋Ÿฐ ๋™์ž‘๋„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅํ•œ ํ…์ŠคํŠธ๋“ค์„ ์ „์†กํ•˜๋ ค๋ฉด, action, method ์†์„ฑ์„ ์„ค์ •ํ•˜์—ฌ ์ „์†ก ์ฃผ์†Œ์™€ ์ „์†ก ๋ฐฉ์‹์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋จผ์ € ํผ ํƒœ๊ทธ์— action, method ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

  <form action="/articles/create" method = "post">

 

๊ทธ๋ฆฌ๊ณ , controller๋ฅผ ์ˆ˜์ •ํ•ด์ค๋‹ˆ๋‹ค.

@Controller
public class ArticleController {
    @GetMapping("/articles/new")
    public String newArticleForm() {
        return "articles/new";
    }

    @PostMapping("/articles/create")
    public String createArticle() {
        return "";
    }
}

 

@PostMapping()์„ ์‚ฌ์šฉํ•˜์—ฌ URL ์š”์ฒญ์„ ๋ฐ›๊ณ , ์ด์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

3. DTO ์ƒ์„ฑ

์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋Š” ํผ ๋ฐ์ดํ„ฐ๋ฅผ DTO์— ๋‹ด์•„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์—, DTO๋ฅผ ์ƒ์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

ํ”„๋กœ์ ํŠธ๋ช… ํด๋” > dto ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ArticleForm ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

package com.example.firstproject.dto;

public class ArticleForm {
    private String title;
    private String content;

    //title, content๋ฅผ ํ•„๋“œ์— ์ €์žฅํ•˜๋Š” ์ƒ์„ฑ์ž
    public ArticleForm(String title, String content) {
        this.title = title;
        this.content = content;
    }

    @Override
    public String toString() {
        return "ArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}

 

4. ํผ ๋ฐ์ดํ„ฐ DTO์— ๋‹ด๊ณ ,  ์ž…๋ ฅํผ๊ณผ ์—ฐ๊ฒฐํ•˜๊ธฐ

 public String createArticle(ArticleForm form) {
        System.out.println(form.toString());
        return "";
    }

 

ArticleForm์˜ form ๊ฐ์ฒด๋ฅผ creatArticle()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๋ ฅ ํผ์—์„œ ๋ฐ์ดํ„ฐ ํ•„๋“œ(title, content)๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ž…๋ ฅ ํผ๊ณผ DTO ํ•„๋“œ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค๋‹ˆ๋‹ค.

 

 <form action="/articles/create" method = "post">
        <input type = "text" name = "title">
        <textarea name = "content"></textarea>
        <button type = "submit" >Submit</button>
 </form>

 

 

์ž…๋ ฅ ํผ์— ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ , [Submit]์„ ๋ˆ„๋ฅด๋ฉด, IntelliJ์˜ ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 


์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ DTO์— ๋‹ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์‹ค์Šต์ด์ง€๋งŒ, form, controller, DTO๊ฐ„ ๊ด€๊ณ„ ๋•Œ๋ฌธ์— ์กฐ๊ธˆ ๋” ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค...

'๐Ÿ–ฅ๏ธdevelop > Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[NestJS] NestJS ์ž…๋ฌธ : ๊ตฌ์กฐ์  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ๐Ÿš€  (1) 2025.04.17
[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #3. Create(์—”ํ‹ฐํ‹ฐ๋กœ DB ์ €์žฅํ•˜๊ธฐ)  (2) 2025.01.11
[Springboot] ํ‡ด๊ทผ๊ธธ ๋ฒ„์Šค์•ˆ์—์„œ ํ˜ธ๋‹ค๋‹ฅ ๊ณต๋ถ€ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ-๋„๊ตฌ ์ด์ƒํ˜• ์›”๋“œ์ปต  (3) 2024.12.07
[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #1. ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ  (2) 2024.11.22
'๐Ÿ–ฅ๏ธdevelop/Backend' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [NestJS] NestJS ์ž…๋ฌธ : ๊ตฌ์กฐ์  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ์ฒซ๊ฑธ์Œ๐Ÿš€
  • [Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #3. Create(์—”ํ‹ฐํ‹ฐ๋กœ DB ์ €์žฅํ•˜๊ธฐ)
  • [Springboot] ํ‡ด๊ทผ๊ธธ ๋ฒ„์Šค์•ˆ์—์„œ ํ˜ธ๋‹ค๋‹ฅ ๊ณต๋ถ€ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ-๋„๊ตฌ ์ด์ƒํ˜• ์›”๋“œ์ปต
  • [Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #1. ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ
ํ‚ํ‚์ž‰
ํ‚ํ‚์ž‰
๋ฟŒ๋ก ํŠธ ๊ฐœ๋ฐœ์ž(์ง€๋ง์ƒ)์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž ๋„์ „๊ธฐ
  • ํ‚ํ‚์ž‰
    monicx.dev
    ํ‚ํ‚์ž‰
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (128)
      • ๐Ÿ–ฅ๏ธdevelop (11)
        • Github (2)
        • Frontend (4)
        • Backend (5)
        • Mobile (0)
        • CS (0)
        • Three.js (0)
        • Docker (0)
      • ๐Ÿ“šbook (2)
        • npm Deep Dive (4)
      • ๐Ÿ“•review (4)
        • ์ฑ… (12)
        • ํ–‰์‚ฌ (0)
        • ํšŒ๊ณ  (2)
      • โญproject (5)
        • petiary (2)
        • ๆšŽ่ฉ  (0)
        • ์ธํ„ด (2)
      • ๐Ÿ˜ถ‍๐ŸŒซ๏ธalgorithm (0)
      • ๐Ÿ’กtips (1)
      • ๐Ÿ˜Ždaily (10)
      • ๐Ÿ•น๏ธgame (0)
      • ๐Ÿ•Š๏ธํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ๋ฐ๋ธŒ์ฝ”์Šค (72) N
        • TIL (48) N
        • ํ”„๋กœ์ ํŠธ (16)
        • ํšŒ๊ณ  (8)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

    • ๋ฒจ๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
ํ‚ํ‚์ž‰
[Springboot] 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ๋„์ „๊ธฐ #2. Create
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”