1. 게시판 : 글쓰기 v1

송민경's avatar
Mar 12, 2024
1. 게시판 : 글쓰기 v1

1.View 확인하기

notion image
notion image
 

2. 익명 게시판이기에 save-form에 username 추가하기

{{> /layout/header}} <div class="container p-5"> <!-- 요청을 하면 localhost:8080/board/save POST로 요청됨 title=사용자입력값&content=사용자값 --> <div class="card"> <div class="card-header"><b>글쓰기 화면입니다</b></div> <div class="card-body"> <form action="/board/save" method="post" enctype="application/x-www-form-urlencoded"> <div class="mb-3"><!--username 추가--> <input type="text" class="form-control" placeholder="Enter username" name="username"> </div> <div class="mb-3"> <input type="text" class="form-control" placeholder="Enter title" name="title"> </div> <div class="mb-3"> <textarea class="form-control" rows="5" name="content"></textarea> </div> <button type="submit" class="btn btn-primary form-control">글쓰기완료</button> </form> </div> </div> </div> {{> /layout/footer}}
notion image
 

3. BoardController에 save() 만들기

  • 컨트롤러에 책임 확인하기
  • PostMappingdmfh Post 요청하기
  • 작성후 main 페이지로 이동하기
  • DTO 없이 구현
매개변수에 바로 집어넣기
package shop.mtcoding.blog.board; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @Controller public class BoardController { @GetMapping( "/" ) public String index() { return "index"; } @PostMapping("/board/save") public String save(String username, String title, String content){ // DTO 없이 구현 // 꼭 출력해보기 System.out.println("username : " + username); System.out.println("username : " + title); System.out.println("username : " + content); return "redirect:/"; } @GetMapping("/board/save-form") public String saveForm() { return "board/save-form"; } @GetMapping("/board/{id}") public String detail(@PathVariable Integer id) { // Integer : 없으면 null, int : 0 return "board/detail"; } }
notion image
notion image
notion image
 

4. board_tb 만들기

  • 생성자 : 최초의 값을 설정하는 것
  • setter : 시간이 흐르면서 변경되는 것
ex) 게시글 수정시 제목과 내용만 바꿀 경우
package shop.mtcoding.blog.board; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import lombok.Getter; import java.sql.Timestamp; @Getter // 변경되는 데이터에만 setter가 필요함 @Table(name = "board_tb") @Entity public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String title; private String content; private String username; private Timestamp createdAt; // 게시글 바꿀 때 뭘 수정할 것인가? // public void update() { // this.title = title; // this.content = content; } }
  • 클래스명.class를 자동 파싱해 줄 때 어떤 생성자로 작동하나?
빈 생성자를 때려서 reflection으로 private 필드에 직접 접근하여 값을 설정할 수 있음
notion image
 

5. 데이터를 DB에 넣기

5-1. yml 설정하기

  • H2 사용 가능
server: servlet: encoding: charset: utf-8 force: true # port: 8080 기본 셋팅이 8080 spring: mustache: servlet: expose-session-attributes: true expose-request-attributes: true datasource: driver-class-name: org.h2.Driver url: jdbc:h2:mem:test;MODE=MySQL username: sa password: h2: console: enabled: true # sql: # init: # data-locations: # - classpath:db/data.sql jpa: hibernate: ddl-auto: create show-sql: true properties: hibernate: format_sql: true # defer-datasource-initialization: true

5-2. BoardNativeRepository 만들기

- 나중에 안 쓰고 새로운 레파지토리를 쓸 예정임
package shop.mtcoding.blog.board; import jakarta.persistence.EntityManager; import jakarta.persistence.Query; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; // 나중에 안쓰고 새로운 레파지토리를 쓰고 이건 버릴거임 @RequiredArgsConstructor @Repository public class BoardNativeRepository { private final EntityManager em; @Transactional public void save(String title, String content, String username){ Query query = em.createNativeQuery("insert into board_tb (title, content, username, created_at) values (?,?,?,now())"); query.setParameter(1, title); query.setParameter(2, content); query.setParameter(3, username); query.executeUpdate(); } }

5-3. BoardController 설정하기

  • Integer : 없으면 null
  • int : 0
package shop.mtcoding.blog.board; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @RequiredArgsConstructor @Controller public class BoardController { private final BoardNativeRepository boardNativeRepository; @GetMapping("/") public String index() { return "index"; } @PostMapping("/board/save") public String save(String title, String content, String username) { // DTO 없이 구현 boardNativeRepository.save(title, content, username); return "redirect:/"; } @GetMapping("/board/save-form") public String saveForm() { return "board/save-form"; } @GetMapping("/board/{id}") public String detail(@PathVariable Integer id) { // Integer : 없으면 null, int : 0 return "board/detail"; } }
notion image
notion image
Share article
RSSPowered by inblog