Part 2 게시판 CRUD 만들기 (3-5장)

ttt-1-2·2025년 9월 19일

3장 - 게시판 만들고 새 글 작성하기: Create

3.1

  • 폼 데이터(form data)는 HTML <form> 태그로 브라우저에서 서버로 전송되는 사용자 입력값이다
  • 서버 컨트롤러는 이 값을 DTO(Data Transfer Object)로 받아 처리한 뒤 최종적으로 DB에 저장한다

3.2 💡 실습: 폼 데어터를 DTO로 받기

  • Step 1: 입력 폼 만들기
  • Step 2: 컨트롤러 만들기
// AritcleController.java
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";
    }
}
  • Step 3:  품 데이터 전송하기
    • action 속성: 어디에 데이터 보낼지
    • method 속성: 어떻게 데이터 보낼지
//templates/articles/new.mustache
<form class="container" action="/articles/create" method="post">
  • Step 4:  품 데이터 받기

@PostMapping 만들기

    @PostMapping("articles/create")
    public String createArticle() {
        return "";
    }
  • Step 5: DTO 만들기
    • com.example.firstproject 에서 dto packege 생성

    • dto 패키지에 ArticleFrom 클래스 생성

      package com.example.firstproject.dto;
      
      public class ArticleForm {
          
          private String title;
          private String content;
      		
      		//전송받은 제목과 내용을 필드에 저장하는 생성자 추가
          public ArticleForm(String title, String content) {
              this.title = title;
              this.content = content;
          }
      	
      		//데이터를 잘 받았는지 확인할 toString() 메소드 추가
          @Override
          public String toString() {
              return "ArticleForm{" +
                      "title='" + title + '\'' +
                      ", content='" + content + '\'' +
                      '}';
          }
      }
  • Step 6: 품 데이터를 DTO에 담기
//ArticleController.java
  @PostMapping("articles/create")
  public String createArticle(ArticleForm form) {
      System.out.println(form.toString());
      return "";
  }
  • Step 7: 입력 폼과 DTO 필드 연결하기

3.3 DTO를 데이터베이스에 저장하기

데이터베이스와 JPA

  • JPA: JAVA ↔ DB 명령을 내리는 도구. JPA의 핵심 도구:
    • entity: 자바 객체를 DB가 이해할 수 있게 만든 것
    • repository: 엔티티가 DB속 테이블에 저장 및 관리하게 만든 것

DTO를 엔티티로 변환하기 && 리파지터리로 엔티티를 DB에 저장하기

[브라우저 폼 제출]
        │  POST /articles/create
        ▼
[Spring MVC]
  - 요청 파라미터 바인딩 → ArticleForm (DTO) 생성
        ▼
[Controller]
  - form.toEntity() 호출 → Article (Entity)로 변환
        ▼
[Repository (JPA)]
  - articleRepository.save(entity) → DB 저장
        ▼
[응답]
  - redirect 또는 뷰 렌더링
src/main/java/com/example/firstproject
├─ controller/
│  └─ ArticleController.java
├─ dto/
│  └─ ArticleForm.java        // DTO: 요청 데이터 운반
├─ entity/
│  └─ Article.java            // Entity: JPA 관리 객체
└─ repository/
   └─ ArticleRepository.java  // CRUD 인터페이스

DB 데이터 조회하기

  • H2 DB 접속하기
**Step 1:**

>application.properties
spring.application.name=firstproject
spring.h2.console.enabled=true

**Step 2: `run` tab에서 jdbc 검색**
Database available at 'jdbc:h2:mem:......'

**Step 3: `localhost:8080/h2-console` 접속**
JDBC URL:.... 
  • 데이터 조회하기

4장 - 롬복과 리팩터링

롬복(lombok): 코드 간단하게 만들어 주는 라이브러리

  • 코드 반복 최소화
  • 로깅 기능 지원

롬복을 활용해 리팩터링하기

  • 롬복 설치하기
dependencies {
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
//생략
}
  • DTO & Entity 리팩터링하기

    • @AllArgsConstructor : 모든 필드를 받는 생성자를 자동 생성
    • @ToString : 객체를 보기 좋게 문자열로 출력
  • 컨트롤러에 로그 남기기

    • import lombok.extern.slf4j.Slf4j; + 클래스에 @Slf4j

      System.out.println 대신 레벨별 로그 관리 가능(info/debug/warn/error), 운영환경에서 필터링 쉬움

5장 - 게시글 읽기: Read

데이터 조회 과정


단일 데이터 조회하기

[Client/Browser](1) GET /articles/{id}[Controller](2) 요청 파라미터(id) 해석 → 조회 지시
      ▼
[Repository](3) DB에 조회 질의
      ▼
[DB](4) 결과를 Entity로 반환
      ▼
[Model + View(템플릿)](5) Model에 담아 템플릿 렌더링
      ▼
[Client/Browser]
      (6) 최종 HTML 응답 표시

데이터 목록 조회하기

GET /articles 요청이 오면 DB에서 모든 Article을 조회 → 모델에 articleList로 담음 → articles/index 템플릿으로 목록 렌더링

@GetMapping("/articles")
    public String index(Model model) {
        // 1. 모든 데이터 가져오기
        ArrayList<Article> articleEntityList = articleRepository.findAll();
        // 2. 모델에 데이터 등록하기
        model.addAttribute("articleList", articleEntityList);
        // 3. 뷰 페이지 설정하기
        return "articles/index";

    }

0개의 댓글