[SpringBoot] 2. 데이터 생성하기 ( form과 JPA )

HJ·2022년 6월 27일
0

스프링부트, 입문!

목록 보기
2/10

홍팍 님의 스프링 부트, 입문! 강의를 보고 작성한 내용이며 이미지 또한 강의에 나오는 이미지를 따라 만들었습니다.
https://www.youtube.com/watch?v=Ym7cAtE2jQs&list=PLyebPLlVYXCiYdYaWRKgCqvnCFrLEANXt&index=29


7. 폼 데이터 주고 받기

7-1. CRUD

  • Create : 사용자의 입력이 DB에 저장되는 과정

  • Read

  • Update

  • Delete


7-2. Form

  • form 데이터 : HTML 문서의 form 태그에 담긴 데이터

  • 어디로 보낼지, 어떻게 보낼지에 대한 정보가 필요

  • form 데이터는 Controller에게 전달

  • Controller는 form 데이터를 DTO라는 객체에 담아서 받는다


7-3. 동작 흐름


7-4. 입력 폼 만들기 & 데이터 전송

<form class="container" action = "articles/create" method="post">
  • templates/articles/new.mustache 생성

  • 어디로 보낼지는 form 태그의 action 속성에 적어준다

  • 어떻게 보낼지는 form 태그의 method 속성에 적어준다

    • 보내는 방식은 post방식과 get 방식이 존재

7-5. 컨트롤러 만들기 & 데이터 받기

@PostMapping("/articles/create")
public String createArticle() {
    return "";
}
  • View page를 반환하는 Controller에 새로운 메소드 정의

  • @PostMapping("articles/create")

    • method에서 post 방식으로 정보를 보낸다고 했으니 PostMapping 어노테이션 사용

    • url은 action 속성에 적힌 url 사용

  • 새로운 view 페이지를 생성했기 때문에 이를 보여주는 Controller가 필요


7-6. 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 + '\'' +
               '}';
   }
}

7-7. DTO 사용하기

@PostMapping("/articles/create")
public String createArticle(ArticleForm form) {
    System.out.println(form.toString());
    return "";
}
  • 기본 패키지에 dto 패키지 생성 및 java class 파일 생성

  • 생성한 파일은 form 데이터를 받아올 그릇이 됨

  • 데이터를 보낸 수만큼의 field가 필요

  • 생성한 DTO를 폼 데이터를 받는 메소드의 파라미터로 넣어준다


7-8. 입력 값 이름 주기

  • mustache의 입력 태그들 안에 name 속성을 작성

  • 이 때 name 속성의 이름은 DTO의 필드명과 동일하게 작성해야 함




8. 데이터 생성 with JPA

8-1. JPA 란?

  • 자바 언어를 DB가 이해할 수 있게 해주며, 데이터 관리에 편리한 여러 기능을 제공

  • Entity : 자바 객체(DTO)를 DB 가 이해할 수 있도록 규격화된 데이터

  • Repository : Entity는 Repository를 통해 DB에 전달되고 처리됨 (DB속 table에 관리)


8-2. 동작 흐름

  • 입력 폼을 보여주는 Controller에서 DTO 객체가 전달되면 수행

  • DTO를 Entity로 변환

  • Repository가 Entity를 DB안에 저장하게 함


8-3. Entity로 변환

8-3-1. Entity 작성

@Entity // DB가 해당 객체를 인식 가능
public class Article {

    @Id // 대푯값을 지정
    @GeneratedValue // 자동 생성을 위한 어노테이션
    private Long id;

    @Column
    private String title;

    @Column
    private String content;

    public Article(Long id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}
  • 기본패키지/entity에 클래스 생성

  • @Entity : DB에서 Entity라는 것을 인식할 수 있도록 Entity 어노테이션 필요

  • @Column : DB 테이블의 열에 해당하는 정보

  • @Id : 대푯값을 지정

  • @GeneratedValue : 자동 생성을 위한 어노테이션


8-3-2. (DTO에) 변환 메소드 추가

    // Article(Entity) 객체를 반환
    public Article toEntity() {
        // 생성자 호출
        // id는 null값, title과 content는 DTO의 title, content를 사용
        return new Article(null, title, content);
    }

8-4. 데이터 저장하기

8-4.1. Repository 작성

// JPA에서 제공하는 CRUDRepository 인터페이스를 활용
public interface ArticleRepository extends CrudRepository<Article, Long> {

}
  • 기본패키지/repository에 인터페이스 생성

  • 첫 번째 : 관리 대상 Entity

  • 두 번째 : 관리 대상 Entity의 대푯값(기본키)의 타입


8-4-2. (Controller에) 객체 주입하기 (DI)

@Autowired
private ArticleRepository articleRepository;
  • @Autowired : 스프링부트가 미리 생성해놓은 객체를 가져다가 자동으로 연결

  • 위 어노테이션이 있기 때문에 repository에 해당하는 객체를 생성하지 않아도 됨


8-5. Controller 코드

@Controller
public class ArticleController {

    @Autowired // 스프링부트가 미리 생성해놓은 객체를 가져다가 자동으로 연결
    private ArticleRepository articleRepository;

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

    @PostMapping("/articles/create")
    public String createArticle(ArticleForm form) {
        System.out.println(form.toString());

        //1. DTO를 Entity로 변환
        Article article = form.toEntity();
        System.out.println(article);

        //2. Repository가 Entity를 DB안에 저장하게 함
        // save()는 CRUDrepository에 기본적으로 정의되어 있음
        Article saved = articleRepository.save(article);
        System.out.println(saved.toString());

        return "";
    }
}



9. DB 테이블과 SQL

9-1. H2 DB 접속 설정

spring.h2.console.enabled=true
  • main/resources/application.propertoes에 작성

  • h2 DB, 웹 콘솔 접속 허용


9-2. H2 DB 접속

  • localhost:8080/h2-console에 접속

  • JDBC URL : 데이터베이스 접근 주소, 값이 매번 변화

  • 서버를 실행한 결과창에서 jdbc를 검색한 후 해당 주소로 접속

0개의 댓글