사용자가 메인 페이지에서 글쓰기 버튼을 누르면 글 작성 페이지로 넘어가고 작성한 내용을 mysql 데이터베이스에 저장해봅시다. mysql 및 기본 프로젝트 설정은 이미 준비되어있다는 가정하에 진행합니다. 오늘의 포스팅은 JPA로 테이블 매핑만 해보도록 하겠습니다.
dependency
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'org.webjars:bootstrap:4.5.0'
}
제 dependencies입니다. h2의 경우 기본 설정 외에 파일로 저장하는 방법을 테스트해보려고 넣어뒀습니다. 이 포스팅에서는 불필요합니다. 중요한 부분들은 아무래도 jpa와 thymeleaf, web, lombok 등이 되겠습니다.
application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/스키마이름?serverTimezone=UTC&charaterEncoding=UTF-8
spring.datasource.username=유저네임
spring.datasource.password=비밀번호
데이터베이스 설계
거창한 소제목과는 달리 간단하게 데이터베이스 테이블을 구성해봅시다. 사용자가 작성한 글에 어떠한 내용들이 있으면 될까요?? 글 제목, 작성자, 글 내용 정도가 되겠네요. 추가로 기본키가 될 글 번호도 있으면 좋겠습니다. (글 작성 시점 등은 나중에 추가해보도록 하겠습니다.)
Board domain(entity)
package com.board.domain.entity;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
//import java.time.LocalDateTime;
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Board{
@Id
@GeneratedValue
private Long id;
@Column(length = 10,nullable = false)
private String author;
@Column(length = 100,nullable = false)
private String title;
@Column(columnDefinition = "TEXT",nullable = false)
private String content;
@Builder
public Board(Long id,String author,String title, String content) {
this.id = id;
this.author = author;
this.title = title;
this.content = content;
}
}
@Getter
Getter와 Setter는 Lombok에서 제공하는 어노테이션입니다. 말 그대로 Getter와 Setter 함수를 자동으로 생성해줍니다.
@Entity
JPA에 테이블 매핑을 해주는 어노테이션입니다. @Entity 어노테이션을 클래스에 선언하면 그 클래스는 JPA가 관리하게됩니다. Entity 클래스에는 몇 가지 제약사항이 있습니다.
1. 기본 생성자 필요
2. 필드에 final,enum,interface,class등은 사용 불가능
따로 name 속성을 지정해주지 않으면 '클래스의 이름 = 테이블 이름'으로 사용합니다.
@NoArgsConstructor
파라미터가 없는 기본 생성자를 생성해주는 어노테이션입니다.
@Id
JPA가 식별 가능하도록 기본키를 지정해주는 어노테이션입니다.
@GeneratedValue
이름처럼 JPA가 자동으로 값을 생성해줍니다. 게시글 번호가 생성순서대로 1부터 카운트되는 경우에 이 어노테이션이 적절합니다.
@Column
테이블 컬럼을 맵핑합니다.
@Column의 속성
1. name : 맵핑할 테이블의 컬럼 이름을 지정
2. insertable : 엔티티 저장시 선언된 필드도 같이 저장
3. updateable : 엔티티 수정시 이 필드를 함께 수정
4. table : 지정한 필드를 다른 테이블에 맵핑
5. nullable : NULL을 허용할지, 허용하지 않을지 결정
6. unique : 제약조건을 걸 때 사용
7. columnDefinition : DB 컬럼 정보를 직접적으로 지정할 때 사용
8. length : varchar의 길이를 조정합니다. 기본값으로 255가 입력
9. precsion, scale : BigInteger, BigDecimal 타입에서 사용, 각각 소수점 포함 자리수, 소수의 자리수를 의미
@Builder
생성자 대신에 사용한다고 합니다. 사실 아직은 사용하는 필요성을 크게 느끼지는 못하고 있습니다.
그러나 위의 글에서 이러한 방식으로 사용하기를 권장하고 있어서 @NoArgsConstructor와 함께 사용해봤습니다.
참고
'web > spring&spring boot' 카테고리의 다른 글
[Gradle] compile 대신 implementation을 쓰는 이유 (0) | 2021.04.15 |
---|---|
[spring boot] 스프링 부트 h2 데이터베이스 영구 저장 (0) | 2021.04.01 |
[spring boot] @SpringBootApplication 정리 (0) | 2021.03.24 |
[spring boot] H2 Database "mem:testdb" not found 오류 해결법 (1) | 2021.02.24 |
[spring] @Controller와 @GetMapping (2) | 2021.02.22 |