미니 프로젝트/게시판

[Java] 게시판 ② DB구성

웹개발자(진) 2024. 5. 16. 17:24
반응형
잡담

게시판 미니프로젝트를 실행할 때 가장 먼저 구상한 것은 DB에 어떤 데이터를 담을 것인가입니다. 후에 제대로 된 프로젝트를 진행한다면 다양한 데이터를 담겠지만 지금은 기능을 구현하는데 집중하려고 했기 때문에 최대한 간단하게 구성하려고 하였습니다. 기본적으로 게시판에 들어가는 제목, 내용, 작성자, 작성날짜등이 들어가도록 구성하였습니다. 


 

1. Board

package org.zerock.b01.domain;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Board extends BaseEntity{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long bno;

    @Column(length=500, nullable=false)
    private String title;
    @Column(length=2000, nullable=false)
    private String content;
    @Column(length=500, nullable=false)
    private String writer;

    public void change(String title, String content){
        this.title = title;
        this.content = content;
    }
}

@Entity

Java Persistence API (JPA)에서 사용되는 주석(annotation)으로, 클래스를 엔티티로 표시하는 데 사용됩니다. 엔티티는 데이터베이스 테이블에 매핑되는 Java 객체를 나타냅니다. @Entity로 클래스를 표시하면 해당 클래스의 인스턴스가 데이터베이스 테이블에 매핑되어야 함을 JPA에 알리는 것입니다.

@Getter / builder / ToString

기본적으로 데이터를 가져오기위한 getter, 생성자를 생성하기 위한 builder, 값을 출력하기 위한 ToString 정도를 Annotation으로 두고 사용합니다.

@AllArgsConstructor / NoArgsConstructor

생성자의 매개변수를 default 생성자 혹은 전체 매개변수를 가지는 생성자를 선언해주는 역할을 합니다.

@Id

해당 Annotaiond은 Entity의 기본키를 의미합니다. DB에서 테이블을 생성할때 primary-key로 지정하는 것과 같은 방법이라고 생각하면 됩니다.

@Column

변수선언을 통해서 column명과 기본타입을 지정해 주었지만 좀 더 자세한 속성을 지정해 주기 위해 사용되는 Annotation입니다. 기본적인 예로 length는 문자길이, nullable는 입력값으로 null값이 들어와돼 되는지를 확인합니다.

change 메서드는 나중에 글을 수정할 때 사용하기 위해 미리 만들어 둡니다.

 


 

2. BaseEntity

기본적으로 Board 그러니까 Entity가 있는 클래스에 같이 변수로 선언하고 사용해도 됩니다. 따로 분리해 놓는 이유는 계속해서 데이터를 변경하는 경우에 오류가 나는 것을 방지하고 공통된 속성들을 묶어놓아 가독성과 재사용성을 높일 수 있습니다.

따로 수정하는 데이터가 없는 경우에도 수정한 날짜는 바뀌게 되는데 이를 Board 클래스 안에 같이 두면 데이터가 꼬이거나 하는 일이 생길 수 있기 때문에 미리 따로 분리해 놓고 수정이 이루어진다 해도 Board안에 데이터들은 건들지 않는 방법입니다.

아래는 BaseEntity에 대한 예제 코드입니다.

package org.zerock.b01.domain;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass
@EntityListeners(value={AuditingEntityListener.class})
@Getter
public class BaseEntity {

    @CreatedDate
    @Column(name="regdate",updatable=false)
    private LocalDateTime regDate;

    @LastModifiedDate
    @Column(name="moddate")
    private LocalDateTime modDate;
}

@MappedSuperClass

해당클래스에 매핑되는 게 아닌 자식클래스 즉 아까 만들어놓은 Board 클래스에 매핑되어 정보를 제공합니다. 스스로 테이블을 생성하지는 않지만 Board에서는 BaseEntity의 정보를 가지고 테이블을 생성하게 됩니다.

@EntityListeners(value={AuditingEntityListener.class})

EntityListeners는 이벤트에 대한 리스너를 등록할 수 있는 Annotation입니다. Entity에 대한 이벤트인데 기본적으로 데이터가 수정, 삭제, 추가 등등의 이벤트가 발생하면 지켜보고 있다가 동작하게 됩니다.

위의 코드에서는 AuditingEntityListener를 사용해서 이벤트를 수신하고 관리하고 있습니다.

Board에서 테이블이 생성될 때 또는 수정될 때

@CreateDate / LastModifiedDate

영어해석 그대로 처음 날짜를 생성 / 마지막으로 수정할 날짜를 기입하게 됩니다. 기본적으로 데이터베이스에 올라가는 시간을 저장하게 되고 updatable = false를 통해 보통 생성일시나 기타 변경 불가능한 정보를 나타내는 칼럼에 이 속성을 사용합니다.

 


 

3. application.properties

데이터베이스 연결에 앞서서 데이터 베이스 연결 설정들이 필요합니다. 기본적으로 어떤 데이터 베이스를 사용할 것인지 사용한다면 해당 데이터베이스의 IP주소나 데이터베이스명, 사용자명, 비밀번호 등을 사전적으로 기입해주어야 합니다.

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

: 데이터베이스 드라이버 클래스를 지정합니다. 저는 MariaDB를 사용하고 있으며, 이 클래스를 통해 Spring Boot는 MariaDB에 연결합니다.

spring.datasource.url=jdbc:mariadb://localhost:3309/webdb
spring.datasource.username=webuser
spring.datasource.password=webuser

: 데이터베이스의 url을 지정합니다 MariaDB는 기본적 localhost에 있는 3306 포트를 사용하지만 저는 해당포틀 이미 사용 중이었기 때문에 3309 롤 지정하였습니다. username은 webuser / password도 webuser로 지정해 주었습니다.

spring.jpa.hibernate.ddl-auto=update

: Hibernate가 데이터베이스 스키마를 자동으로 생성 또는 업데이트하는 방식을 설정합니다. 여기서는 update로 설정되어 있으므로, 애플리케이션을 실행할 때 Hibernate가 데이터베이스 스키마를 자동으로 생성하거나 최신 상태로 유지합니다.

spring.jpa.properties.hibernate.format_sql=true

: Hibernate가 생성하는 SQL 쿼리를 포맷팅 하여 읽기 쉽게 만듭니다.

spring.jpa.show-sql=true

: 실행되는 SQL 쿼리를 콘솔에 출력합니다. 개발 및 디버깅 목적으로 사용됩니다.

위의 코드는 Hibernate를 통해 SQL 쿼리를 실행하고 결과를 콘솔에 표시합니다.

 


 

4. 출력

데이터 베이스에 테이블 및 Column이 생성된 것을 확인할 수 있습니다.

 


 

글을 마치며

오늘은 게시판을 만드는데 필요한 DB를 구성하였습니다. 메인 Entity를 Board로 구성하고 자주 수정되고 속성이 비슷한 칼럼은 MappedSuperClass를 통해 따로 분리하여 Board에서 테이블이 생성되려고 할 때 지켜보고 있던 Listener가 해당 이벤트를 확인하고 데이터를 board에 전달하여 테이블을 구성하게 됩니다. 

반응형