인텔리제이 ctrl+shift+방향키: 블럭친 부분을 옮길수 있음
boardWrite에 만들었던 작성 틀을 받아 오기 위해서는 form 태그가 필요하다.
<!-- action : form 의 데이터를 어디로 보내 줄 것이냐-->
<form action="/board/writepro" method="post">
<input name="title" type="text">
<textarea name="content"></textarea>
<button type="submit">작성</button>
</form>
이렇게 form태그를 추가해주면 css에서 >라는 바로 하위태그에 적용이라는 그런 명령어 때문에 css 문이 적용이 되지 않는다 아래와 같이 삭제한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>게시물 작성폼</title>
</head>
<style>
.layout{
<!-- 크기는 500px-->
width : 500px;
<!-- 위아래 0 양옆은 자동으로-->
margin : 0 auto;
margin-top : 40px;
}
.layout input {
width : 100%;
box-sizing : border-box;
}
.layout textarea{
width:100%;
margin-top:10px;
min-height:100px;
}
</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>
</form>
</div>
</body>
</html>
form태그로 url /board/writepro로 post방식으로 데이터를 전달 할 것이라고 명시해주었다.
이제 BoardController로 가서 post매핑 방식으로 정의한 함수에서 form에서 데이터가 잘 넘어 왔는지 확인한다.
아래 코드 추가한다.
//이 url과 form 태그의 url이 일치해야한다.
@PostMapping("/board/writepro")
public String boardWritePro(String title, String content){
System.out.println("제목 : "+title);
System.out.println("내용 : "+content);
return "";
}
system.out.println()으로 값을 찍어본다. 에러가 뜨지만 콘솔창에 아래와 같이 잘 나오면 성공이다.
html파일에서 name으로 설정한 값 대로 받아오기 때문에 그 name값과 딱 맞아야한다.
넘어오는 값을 잘 확인했으니 이제 넘어온 값을 데이터베이스로 넘겨야한다.
controller 패키지를 생성해준 곳에 entity와 repository패키지도 생성해준다.
entity폴더는 실제 DB의 테이블과 매칭될 클래스들을 모아두는 폴더이다.
repository 폴더는 JPA에서 DB Layer에 접근자를 의미한다.
인터페이스 생성후 JpaRepository<Entity 클래스, PK 타입>를 상속 받았을때 자동으로 CRUD메소드가 생성된다.
CRUD : Create(생성), Read(읽기), Update(갱신), Delete(삭제)
save delete find
entity에는 데이터베이스와 구성이 같은 Board.java 파일을 생성해준다.
Board.java
package com.study.board.entity;
import lombok.Data;
import org.hibernate.annotations.GeneratorType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
@Data
public class Board {
//jpa가 읽어서 처리
@Id
//primary key
@GeneratedValue(strategy= GenerationType.IDENTITY)
//identity-> mysql,mariadb
//sequence -> oracle
//auto -> 알아서 지정
private Integer id;
private String title;
private String content;
}
@Entity는 테이블임을 명시해준다.
@Data는 @Getter/@Setter, @ToString,@EqualsAndHashCode,@RequiredArgsConstructor를 합쳐놓은 어노테이션이다.
@ToString : 자바의 toString 과 같이 String 객체의 값을 리턴해주는 역할을 한다.
@EqualsAndHashCode : 자바의 equals 메소드(2개의 객체가 동일한지 검사)와 hashCode메소드(heap에 저장된 객체의 메모리 주소를 반환하도록한다.)를 생성할 수 있다.
<!--어렵네-->
※ equals와 hashCode가 합쳐서 있는 이유
동일한 객체는 동일한 메모리 주소를 갖는다
equals를 오버라이딩하면 hashCode도 오버라이딩해야한다.
ex) 이것이 자바다 참고
import java.util.HashMap;
class Key{
public int number;
public Key(int number){
this.number=number;
}
public boolean equals(Object obj){
if(obj instanceof Key){
Key compareKey = (Key)obj;
if(this.number == compareKey.number){
return true;
}
}
return false;
}
public int hashCode(){
return number;
}
}
public class Exam {
public static void main(String[] args) {
HashMap<Key,String> hashMap = new HashMap<>();
hashMap.put(new Key(1),"홍길동");
String value = hashMap.get(new Key(1));
System.out.println("이름은 :"+ value);
}
}
hashCode()메소드를 실행해서 해시코드값이 다르면 다른 객체로 판단하고 같으면 equals 메소드로 다시 비교했을때 같으면 같은 객체 다르면 다른 객체가 된다.
@RequiredArgsConstructor : final이 붙거나 @NotNull이 붙은 필드의 생성자를 자동으로 생성해주는 어노테이션이다.
https://dreamcoding.tistory.com/83
@Id는 필드가 primary key임을 명시해준다.
@GeneratedValue는 PK의 키생성규칙을 정하는 어노테이션이다.
auto increment와 관련이 있다.
AUTO (default) - JPA 구현체(스프링 부트에서는 Hibernate)가 생성 방식을 결정한다.
IDENTITY - 사용하는 데이터베이스가 키 생성을 결정 MySQL이나 MariaDB의 경우 auto increment방식을 사용
SEQENCE - 데이터베이스의 sequencefmf 이용해서 키를 생성한다. @SequenceGenerator와 같이 사용한다.
TABLE - 키 생성 전용 테이블을 생성해서 키를 생성한다. @TableGenerator와 함께 사용한다.
여기서 필드는 테이블에 정의한 것과 같이 해준다
이제 테이블 속성들을 Board라는 클래스에서 관리해주니 BoardController 파일에서 테이블 속성들을 매개변수로 각각 받아줄 필요가 없다. 아래와 같이 매개변수를 Board라는 클래스로 받아와 사용한다
//이 url과 form 태그의 url이 일치해야한다.
@PostMapping("/board/writepro")
public String boardWritePro(Board board){
System.out.println("제목 : "+board.getTitle());
System.out.println("내용 : "+board.getContent());
return "";
}
폼에서 제목과 내용을 쓰고 작성을 누른다.
에러는 뜨지만 아래와 같이 내용이 뜨면 성공이다.
이제 repository를 생성하여 입력받은 데이터를 데이터베이스의 board스키마의 board테이블에 넣어야한다.
repository폴더에 인터페이스 파일인 boardRepository파일을 생성하여 아래와 같이 코드를 작성해준다.
package com.study.board.repository;
import com.study.board.entity.Board;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface BoardRepository extends JpaRepository<Board,Integer> {
//<>안에는 엔티티와 Board엔티티에서 primary key로 설정한 데이터 타입을 작성한다.
}
@Repository는 이 인터페이스가 repository임을 알려주는 어노테이션이다.
JpaRepository<Board,Integer>은 JpaRepository에 제네릭으로 Board라는 java파일의 PK의 데이터 타입이 Integer라고 알려준다.
이제 service 패키지를 만들어 그 안에 BoardService라는 파일을 만들어준다.
service는 repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시 controller에게 정보를 보내는 곳이다.
controller에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해 얻어가는 것은 정보 손실의 우려가 있기 때문에 정보변동에 대한 위험이 큰 로직은 여기서 진행한다.
BoardService파일은 아래와 같이 코드를 작성해준다.
package com.study.board.service;
import com.study.board.entity.Board;
import com.study.board.repository.BoardRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BoardService {
@Autowired
private BoardRepository boardRepository;
public void write(Board board){
boardRepository.save(board);
}
}
@Service는 이 java파일이 service임을 알려주는 어노테이션이다.
@Autowired는 의존성을 주입하는 것이다. BoardRepository는 인터페이스이므로 new 연산자를 통한 객체를 생성하지 못한다. 따라서 @Autowired를 통해 객체 생성을 해주는 것이다.
service의 write함수가 호출되면 boardRepository.save를 통해 매개변수로 받아온 튜플의 값이 데이터 베이스에 저장된다.
이제 BoardController에서도 입력값을 받아와 service에 그 값을 넘겨주어 Repository를 통해 데이터베이스로 전달되도록 해야한다.
아래와 같이 코드를 작성해준다.
package com.study.board.controller;
import com.study.board.entity.Board;
import com.study.board.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;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
@GetMapping("/board/write")//localhost:8080/board/write
public String boardWriteForm(){
return "boardWrite";
}
//이 url과 form 태그의 url이 일치해야한다.
@PostMapping("/board/writepro")
public String boardWritePro(Board board){
boardService.write(board);
return "";
}
}
@Autowired를 통해 BoardSevice의 객체를 생성해주는 변수를 하나 생성한다.
boardService변수를 통해 BoardService의 write 함수를 호출하여 form에서 전달받은 것을 매개변수로 전달해준다.
이제 실행 해보자 shift + F10
작성버튼을 눌렀을때 아래와 같이 오류가 나야 정상이다 /board/writepro에 해당하는 html파일이 없기 때문이다.
이제 데이터베이스에 들어갔는지 확인하기 위해서 MySQL workbench를 켜고 쿼리문을 작성해준다.
select * from board.board;
board스키마의 board테이블의 모든것을 검색한다.
이러한 결과가 나왔다면 성공!!
view , controller, service, repository, db의 관계
'spring boot를 이용한 게시판' 카테고리의 다른 글
게시글 접속 (0) | 2023.01.27 |
---|---|
게시글 리스트 (0) | 2023.01.27 |
게시글 작성 폼 (0) | 2023.01.26 |
maria db에 테이블 생성하기 (0) | 2023.01.25 |
spring boot 프로젝트 생성하기 (0) | 2023.01.25 |