STUDY/SpringBoot

[Springboot] 게시판따라하기(1) - 게시글 작성폼생성·작성처리 ✔정리

ReCode.B 2022. 8. 9. 02:47
728x90

원본 영상 링크:

https://www.youtube.com/watch?v=Y7S1xXsKy_w&list=PLZzruF3-_clsWF2aULPsUPomgolJ-idGJ&index=8

게시글 작성폼 생성

templates > boardwrite.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>게시물작성폼</title>
</head>

<style>
    .layout{
        width : 500px;
        margin : 0 auto;
        margin-top: 40px;
    } /*layout 하위에 있는 input태그 스타일 설정*/
    .layout input{
        width: 100%;
        box-sizing: border-box;
    }
    .layout textarea{
        width: 100%;
        margin-top: 10px;
        min-height: 300px;
    }
</style>


<body>
    <div class="layout">
        <form>
            <textarea></textarea>
            <button>작성</button> 
        </form>
    </div>
</body>
</html>

controller > BoardController.java

package com.example.demo.contoller;

import com.example.demo.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class BoardContoller {

    @GetMapping("/board/write")  //localhost:8080/board/write
    public String boardWriteForm() {
        return "boardwrite";
    }

}

@GetMapping 어떤 url로 접근할 것인지 정해주는 어노테이션

 

shift + f10  = 재실행 단축키

@GetMapping("/") //사용자가 localhost:8080 주소로 들어왔을때 /을 붙였을때 (안붙여도 자동으로 브라우저 상에서 붙여짐)
@ResponseBody //ResponseBody 아래 글자를 그대로 띄워준다.
public String main() { return "Hello World"; }

 글 작성 처리

templates > boardwrite.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>게시물작성폼</title>
</head>

<style>
    .layout{
        width : 500px;
        margin : 0 auto;
        margin-top: 40px;
    } /*layout 하위에 있는 input태그 스타일 설정*/
    .layout input{
        width: 100%;
        box-sizing: border-box;
    }
    .layout textarea{
        width: 100%;
        margin-top: 10px;
        min-height: 300px;
    }
</style>


<body>
    <div class="layout">
        <!--action: 해당form 안의 데이터를어디로보내줄거냐-->
        <form action="/board/writepro" method="post">
        <input name="title" type="text"> <!--네임설정-->
            <textarea name="content"></textarea>
            <button type="submit">작성</button> 
            <!--버튼을눌렀을때(submit) form안에있는 데이터가 action에서 지정한 주소로 넘어간다-->
        </form>
    </div>
</body>
</html>

action 해당 form 안의 데이터를 어디로 보내줄것인지 정함

method = "post" 메소드는 포스트방식으로 

name 설정 →  name 설정한 값이 넘어감

button type = "submit" 

버튼을 눌렀을때 form안에 있는 데이터가 action에서 지정한 주소로 넘어간다

 

controller > BoardController.java

package com.example.demo.contoller;


import com.example.demo.entity.testboard;
import com.example.demo.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BoardContoller {

    @GetMapping("/board/write") //어떤 url로 접근할 것인지 정해주는 어노테이션 //localhost:8080/board/write
    public String boardWriteForm() {
        return "boardwrite";
    }
    //내용이 넘어오는 것을 확인
    @PostMapping("/board/writepro") //매개변수로 들어오는 것 작성
    public String boardWritePro(String title, String content){
    System.out.println("제목 : " + title);
    System.out.println("내용 : " + content);
    return "";
    }
}

내용이 잘넘어오는지 확인해보자 콘솔창에 뜨는 예외는 무시하고 (넘어갈 페이지를 안만들었으니)일단 문구만 확인하자

 

entity > testboard.java

package com.example.demo.entity;


import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;


@Entity
@Data
public class testboard {
    @Id                      	//오라클
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Integer id;
    private String title;
    private String content;
}

@Entity 엔티티는 아래 클래스가 DB에 있는 테이블을 의미한다는걸 의미

오라클 - @GeneratedValue(strategy = GenerationType.SEQUENCE) 

 

controller > BoardController.java

package com.example.demo.contoller;


import com.example.demo.entity.testboard;
import com.example.demo.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*shift + f10 재실행*/
@Controller
public class BoardContoller {

    @GetMapping("/board/write") 
    public String boardWriteForm() {
        return "boardwrite";
    }

    @PostMapping("/board/writepro")
    public String boardWritePro(testboard board){

        System.out.println(board.getTitle()); 
        //testboard에서 @Data 어노테이션을 사용해 get쓸수있음
        
        return "";
    }
}

리포지토리 생성

repository > BoardRepository.java

package com.example.demo.repository;

import com.example.demo.entity.testboard;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository                                         //어떤엔티티를 넣을것이냐, 엔티티의 id의 타입
public interface BoardRepository extends JpaRepository<testboard, Integer> {
}

@Repository

-Entity에 의해 생성된 DB에 접근하는 메서드(ex) findAll()) 들을 사용하기 위한 인터페이스이다. 위에서 엔티티를 선언함으로써 데이터베이스 구조를 만들었다면, 여기에 어떤 값을 넣거나, 넣어진 값을 조회하는 등의 CRUD(Create, Read, Update, Delete)를 해야 쓸모가 있는데, 이것을 어떻게 할 것인지 정의해주는 계층이라고 생각하면 된다.

JpaRepository를 상속받도록 함으로써 기본적인 동작이 모두 가능해진다! JpaRepository는 어떤 엔티티를 메서드의 대상으로 할지를 다음 키워드로 지정한다. JpaRepository<대상으로 지정할 엔티티, 해당 엔티티의 PK의 타입>.

이렇게 extends를 통해서 상속받고나면, 해당 레포지토리의 객체를 이용해서 기본적으로 제공되는 메서드(save(), findAll(), get()) 등을 사용할 수 있게 된다.


서비스 생성

service > BoardService.java

package com.example.demo.service;

import com.example.demo.entity.testboard;
import com.example.demo.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class BoardService {

    @Autowired //new를 써야하지만, 스프링부트가 알아서 읽어와서 주입을해준다.
    private BoardRepository boardRepository;
			
    public void write(testboard board){
    boardRepository.save(board);
    }
}

@Service

Service는  Repository에서 얻어온 정보를 바탕으로

자바 문법을 이용하여 가공 후 다시 Controller에게 정보를 보내는 곳입니다.

서비스 설명 출처 : https://velog.io/@seungho1216/Spring-BootController-Service-Repository%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC


@Autowired

자바에서 객체를 생성해줄때 new를 사용하지만 
스트링부트에서는 @Autowired를 사용하면 알아서 읽어와서 주입을 해준다.

 

controller > BoardController.java

package com.example.demo.contoller;


import com.example.demo.entity.testboard;
import com.example.demo.service.BoardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*shift + f10 재실행*/
@Controller
public class BoardContoller {

    @Autowired
    private BoardService boardService;

    @GetMapping("/board/write") //어떤 url로 접근할 것인지 정해주는 어노테이션 //localhost:8080/board/write
    public String boardWriteForm() {
        return "boardwrite";
    }

    @PostMapping("/board/writepro")
    public String boardWritePro(testboard board){

        boardService.write(board);

        return "";
    }
}

입력한 내용이 DB에 잘 들어간 것을 확인할 수 있다.

728x90