[SpringBoot] 2 - 게시판 CRUD 만들기(작성)

2024. 8. 27. 01:04· 공부/Spring
반응형

2 - 게시판 CRUD 만들기 (작성)

게시글 작성 - CRUD(CREATE)

1 - 폼 데이터란?

  • 폼 데이터(form data)
    • <form> 태그에 실려 서버로 전송되는 데이터

 

  • DTO(Data Transfer Object)
    • <form> 태그에 실어 보낸 데이터는 서버의 컨트롤러가 객체에 담아 받음
    • 이 객체를 DTO(Data Transfer Object)라고 함

 

2 - 폼 데이터를 DTO로 받기

  1. 입력 폼 만들기
  2. 컨트롤러 만들기
  3. DTO 만들기
  4. 폼 데이터를 DTO에 담기

 

1. 입력 폼 만들기

<form action="/articles/create" method="post">
    <div>
        <label>제목</label>
        <input type="text" name="title">
    </div>
    <div>
        <label>내용</label>
        <textarea rows="3" name="content"></textarea>
    </div>
    <button type="submit">Submit</button>
</form>

 

2. 컨트롤러 만들기

@Controller
public class ArticleController {

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

 

 

3. DTO 만들기

public class ArticleForm {
    private String title; // 폼 제목을 받는 필드
    private String content; // 폼 내용을 받는 필드

    public ArticleForm(String title, String content) {
        this.title = title;
        this.content = content;
    }

	  @Override
    public String toString() {
        return "ArticleForm{" +
                "title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}
  • toString() 메서드 : 폼 데이터 잘 받았는지 확인 용도

 

4. 폼 데이터 DTO에 담기

  • dto 클래스 이름이 ArticleForm 이므로 ArticleForm 타입의 form 객체를 매개변수로 선언
    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
        System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드
        return "articles/new"; // 다시 작성게시글로 이동시킴
    }
  • DTO 필드명과 폼 태그에 동일한 이름의 name 속성 값을 써주면 프론트엔드 → 서버 로 받은 데이터가 자동으로 DTO의 해당 필드에 값이 들어갑니다.

 

 

요약

 

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

  • 데이터베이스
    • 데이터를 관리하는 창고
    • 모든 데이터를 행과 열로 구성된 테이블에 저장
    • 사용 언어 : SQL
  • DBMS : MySQL, 오라클, MariaDB, H2 DB
  • H2 DB
    • 자바로 작성된 RDBMS
    • 인메모리형 관계형 DB
    • 데이터를 애플리케이션 자체 내부에 저장.
    • 앱을 재실행하면 데이터 초기화
    • 간편하게 사용하기 좋아 개발 시 테스트 용도로 많이 사용
    • 실제 서비스에는 사용하지 않음.

 

ORM(Object-Relational Mapping)

  • 자바의 객체와 데이터베이스를 연결하는 프로그래밍 기법
  • DB 값을 객체처럼 사용할 수 있어 SQL 없이 자바로 데이터베이스를 조작할 수 있음

→ 자바 언어로 DB에 명령을 내리는 도구

  • ORM 여러 종류 중 자바에서는 JPA를 표준으로 사용함

 

장점 : 자바언어로 SQL 없이 DB를 다룰 수 있다.

 

JPA(Java Persistence API)

  • 자바에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 자바 객체와 DB를 연결해 데이터를 관리
  • 실제 사용을 위해서는 추가로 ORM 프레임워크를 선택해야 함 → 하이버네이트

 

ORM 프레임워크 - 하이버네이트(hibernate)

  • JPA 인터페이스를 구현한 구현체
  • 구현체마다 회사 이름이나 프레임워크 이름이 다름. 그 중 가장 유명한 것이 Hibernate임
  • 내부적으로 JDBC API 사용
  • 목표 : 자바 객체를 통해 DB 종류에 상관 없이 DB를 자유롭게 사용하는 것

 

JPA의 핵심 도구

  • 엔티티(entity)와 리파지터리(repository)
  • 엔티티
    • 자바 객체를 DB가 이해할 수 있게 만든 것.
    • 이를 기반으로 테이블이 만들어짐

 

  • 리파지터리
    • 엔티티가 DB 속 테이블에 저장 및 관리될 수 있게 하는 인터페이스

 

실습

  1. DTO를 엔티티로 변환하기
  1. 리파지터리 인터페이스를 이용해 엔티티를 DB에 저장하기

 

1 - DTO를 엔티티로 변환하기

  1. Article 엔티티 클래스 생성
  1. toEntity( ) 메소드 추가
    • DTO인 form 객체를 엔티티 객체로 변환하는 역할

 

ArticleDto.class

public Article toEntity() {
// Article 클래스 생성자 형식에 맞게 작성함. id 정보는 없으므로 null
	return new Article(null, title, content);
}

 

ArticleEntity.class

@Entity
@Table(name="BoardArticle") // 테이블 명 명시 지정
public class Article {
    @Id // Primary Key 지정
    @GeneratedValue // 자동 생성 기능(시퀀스, 오토인큐리먼트)
    private Long Id;

    @Column(name="title") // title 필드 선언, DB 테이블의 title 열과 연결됨
    private String title;

    @Column(name="content") // content 필드 선언, DB 테이블의 content 열과 연결됨
    private String content;

 

  1. 리파지터리로 엔티티를 DB에 저장하기1. 리파지터리 만들기 : 엔티티가 DB속 테이블에 저장 및 관리될 수 있게 하는 인터페이스
    • CrudRepository<T, ID> 의 제네릭 요소 T, ID 지정
      • T : 관리 대상 엔티티의 클래스 타입 지정
      • ID : 관리 대상 엔티티의 기본키 타입 지정
  2. // SQL를 대신하는 메서드가 있을건데 이미 다 인터페이스로 되어 있는데 그걸 상속만 받으려고 interface로 명명 public interface ArticleRepository extends CrudRepository<Article, Long> { // <엔티티 명,기본키 타입> }

 

※. 리파지터리

  • JPA에서 제공하는 리파지터리 인터페이스를 활용해 만들 수 있음.
    • JPA의 구현체인 Hibernate를 이용하기 위한 여러 API 제공함
  • JpaRepository 나 CrudRepository를 상속 받아 사용
    • DB 에 CRUD 기본 동작을 추가 코드로 구현할 필요 없이 CruidRepository에서 상속받아 사용할 수 있음.

 

  • 단순한 CRUD 작업만한다면 : CrudRepository 상속
  • CRUD 작업 + 페이지 처리 + 정렬 : JpaRepository 상속

 

  • Repository가 최상위 인터페이스

 

JpaRepository 메서드

  • insert와 update 메서드가 동일하게 save임
    • 내부적으로 값들이 일치하는지 확인하고 수정 되었으면 UPDATE, 없으면 INSERT

 

  1. 리파지터리 객체 주입 및 엔티티 DB 저장

 

ArticleController.class

public class ArticleController {
    @Autowired // 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입
    private ArticleRepository articleRepository; // articleRepository 객체 선언
    
    ....
    
    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
        System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드

        // Dto를 Entity로 변환
        Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.

        // Entity를 DB에 저장
        Article saved = articleRepository.save(article);


        return "new"; // 다시 작성게시글로 이동시킴
    }
 }
  • 의존성 주입(DI, dependency Injection)이란?
    • 외부에서 만들어진 객체를 필요한 곳으로 가져오는 기법
    • 스프링 부트에서는 @Autowired 어노테이션으로 의존성 주입

 

 

  1. DB 저장 확인
public class ArticleController {
    @Autowired // 스프링부트가 미리 생성해 놓은 리파지터리 객체 주입(DI) = 의존성 주입
    private ArticleRepository articleRepository; // articleRepository 객체 선언
    
    .....
    
    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) { // 매개변수로 form 데이터를 DTO에 넣는다.
        System.out.println(form.toString()); // DTO에 담긴 form 데이터를 print하는 메소드

        // Dto를 Entity로 변환
        Article article = form.toEntity(); // 받은 데이터를 Dto로 변환하고 다시 Entity로 변환한다.
        
        // Entity를 DB에 저장
        Article saved = articleRepository.save(article);
        
				System.out.println(saved.toString()); //article이 DB에 저장 확인

 

  1. DB 데이터 조회
  • id, title, content 3개의 열로 구성됨

 

4.1 H2 DB 접속하기

  • src > main > resources > application.properties 파일
  • H2 DB에 웹 콘솔로 접근할 수 있도록 허용 설정
  • 서버 재시작 → localhost:8080/h2-console 접속

 

  • JDBC URL에 서버가 구동되면서 터미널 창에 쓰여진 주소로 접속한다.
  • 서버 시작 시 매번 달라짐

 

어노테이션

@Entity

  • 엔티티 클래스임을 선언하기 위해 JPA에서 제공하는 어노테이션
  • 이 클래스를 기반으로 DB에 테이블이 생성됨
  • 테이블 이름은 클래스 이름과 동일하게 지정됨(Article)
  • 별도의 테이블 이름을 주고 싶으면 @Table(name=“테이블명“)으로 지정

 

@ Id

  • Primary Key(기본키) 선언 어노테이션
  • @GeneratedValue 자동생성되는 번호
  • @GeneratedValue(strategy = GenerationType.IDENTITY) 키생성 전략
  • MySQL이나 MariaDB의 ‘auto increment’ 로 처리됨

 

@GeneratedValue(strategy = GenerationType.키생성전략)

 

@Column

  • 해당 필드가 db 테이블의 각 열(column)과 연결
  • nullable, name, length 등 다양한 속성으로 필요한 정보 제공 가능
  • 예) @Column(length=200, nullable=false)
  • columnDefination 속성으로 기본값 지정 가능
  • 예) @Column(columnDefinition=“varchar(255) default ‘yes’”)

 

@Transient

  • 데이터베이스 테이블에는 컬럼으로 생성되지 않는 필드

 

4 - 롬복과 리팩터링

롬복(lombok)

  • 코드를 간소화해 주는 라이브러리
  • 필수 코드 간편하게 작성 + 로깅(logging)

 

  • 코드 반복 최소화
    • getter(), setter(), constructor(), toString() 필수 메서드 반복 간소화
  • 로깅(logging)
    • 프로그램의 수행 과정을 기록으로 남기는 것

 

롬복으로 코드 리팩터링(refactoring)

  • 코드의 기능에는 변함이 없이 코드의 구조 또는 성능을 개선하는 작업

 

  1. 롬복 설치하기
    • build.gradle에 롬복 추가 코드 입력
    dependencies {
    	compileOnly 'org.projectlombok:lombok'
    	annotationProcessor 'org.projectlombok:lombok'
    	....
    	}

    1. DTO 리팩터링하기
      • dto > ArticleForm.java 생성자 삭제하여 리팩터링
      • @AllArgsConstructor : 클래스 안쪽의 모든 필드를 매개변수로 하는 생성자를 만드는 어노테이션
      • @NoArgsConstructor : 매개변수가 없는 생성자를 만드는 어노테이션
      • @ToString : toString() 메서드를 사용한 것과 똑같은 효과를 내는 어노테이션
      ⬇️⬇️⬇️⬇️⬇️
    1. 엔티티 리팩터링하기
      • entity > Article.java의 생성자와 toString() 도 리팩터링하기
  1. 컨트롤러에 로그 남기기
    • controller > ArticleController.java 로그 남기기
    • println() 문으로 데이터 검증을 하면 생기는 문제점
      • 데이터 바로 출력해 볼 수 있지만 기록에 남지 않아 나중에 찾아볼수 없음
      • 서버의 성능에 악영향
      → 로깅으로 대체 : @Slf4j
    •  
    • @Slf4j(Simple Logging Facade for Java) 어노테이션
      • 로깅할 때 사용하는 어노테이션
      • 로그를 찍을 때는 log.info() 문 사용
    public class ArticleController {
    	....
    	
    	System.out.println("form 데이터 : " + form.toString());
    	// println 대신 log.info로 대체
    	
    	log.info("form 데이터 : " + form.toString());
    • 저장된 데이터와 시간도 확인 가능
반응형
저작자표시 비영리 (새창열림)
'공부/Spring' 카테고리의 다른 글
  • [SpringBoot] 1 - 스프링부트 개요
  • [Spring]JWT
  • [Spring]JPA살펴보기
  • [Spring]Thymeleaf
Future0_
Future0_
rm -rf /
Future0_
Luna Developer Blog
Future0_
전체
오늘
어제
  • 분류 전체보기 (112)
    • 프로그래밍 (4)
      • 알고리즘 (4)
    • 보안 (14)
      • Dreamhack (4)
      • Hackthebox (1)
      • Webhacking (9)
    • 프로젝트 (4)
    • 공부 (80)
      • Database (2)
      • Python (11)
      • System (4)
      • Java (13)
      • JSP (13)
      • Spring (11)
      • Kotlin (16)
      • 자료구조 (10)
      • 기계학습 (0)
    • Docker (4)
    • Github (2)
    • Tip (1)
    • 잡담 (2)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • spring
  • shared preference
  • android studio 삭제
  • 디버깅키해시
  • 프로그래밍
  • 키 해시
  • React
  • Computer science
  • native app
  • dreamhack
  • docker
  • 보안
  • SpringBoot
  • Java
  • Database
  • 코틀린기본문법
  • api 통신
  • jsp
  • Python
  • 상속
  • cs
  • Android Studio
  • 1.9.22
  • 알고리즘
  • 자료구조
  • webhacking
  • Kotlin
  • ViewModel
  • 자바빈즈
  • 컴퓨터

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
Future0_
[SpringBoot] 2 - 게시판 CRUD 만들기(작성)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.