본문 바로가기
개발진행목록/게시판 서비스

[JPA로 게시판 만들기] 설계 및 엔티티 생성

by o3oppp 2025. 1. 16.
프로젝트 설계

엔티티

  • 한명의 Member가 여러개의 Post를 작성할 수 있기에 1:N 관계 설정(단방향)
  • Value Type 사용을 위해 Address 추가
  • Enum Type 사용을 위해 PostStatus(게시글 상태값) 추가
    • CREATE : 생성
    • DELETE : 삭제(실무에서 실제 데이터 삭제가 아닌 상태값 변경으로 처리하는 경우가 많음)
    • MODIFY : 수정
  • 추후 엔티티를 추가하여 기능을 확장할 예정

기능

  1. 회원 가입 - 완료
  2. 게시글 목록 조회 - 완료
  3. 게시글 등록 - 완료
  4. 게시글 수정 - 완료
  5. 게시글 삭제 - 완료
  6. 게시글 검색 - 완료
  7. 게시글 페이징
  8. 로그인/로그아웃(모든 기능 개발을 마친 후 가장 마지막에 진행 예정)

엔티티 생성

디렉토리 구조

  • domain 패키지 내 엔티티 생성

Member.java

package project.post.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Getter
@Setter
public class Member {

    @Id
    @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded
    private Address address;
}
  • @Entity : 해당 어노테이션이 붙은 클래스는 JPA가 관리하는 것으로 엔티티라고 불림
    • 기본 생성자 필수
    • public, protected만 가능
    • final 클래스, enum, interface, inner 클래스에 사용 불가
    • 자바는 기본적으로 기본생성자를 만들어주기 때문에 코드 상 생략 가능
  • @Id : 엔티티의 PK를 매핑하는 어노테이션
  • @GeneratedValue : JPA가 Sequence를 사용하여 id값을 설정하도록 함
    • 여러 전략이 존재하며 자세한 내용은 여기에서 확인
  • @Column : 클래스 내의 필드와 테이블 컬럼을 매핑해줌
    • @Column(name = "테이블에서 매핑될 컬럼 명")
  • @Embedded : 임베디드 타입(복합 값 타입)을 사용하는 곳에 표시

Post.java

package project.post.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
public class Post {

    @Id
    @GeneratedValue
    @Column(name = "post_id")
    private Long id;

    private String title;
    private String content;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @Enumerated(EnumType.STRING)
    private postStatus status;
    private LocalDateTime postDate;
}
  • @ManyToOne : 다대일 관계를 표현하며 Post와 Member는 N : 1 으로 단방향으로 연결된 것을 표현
  • @JoinColumn : 엔티티의 연관관계에서 외래 키(FK)를 매핑하기 위해 사용
    • '다' 관계에 선언
    • 외래 키가 존재하는 곳이 연관관계의 주인
    • 주인은 mappedBy 속성을 사용하지 않음(자세한 내용은 여기)
  • @Enumerated : enum 타입 매핑
    • default는 ORDINAL로 enum 클래스 필드의 순서를 저장(CREATE => 0, DELETE => 1, MODIFY => 2, ...)
    • STRING 속성으로 지정 시 Enum 타입의 이름으로 저장

Address.java

package project.post.domain;

import jakarta.persistence.Embeddable;
import jakarta.persistence.Embedded;
import lombok.Getter;

@Embeddable
@Getter
public class Address {

    private String city;
    private String zip;
    private String street;

    
    public Address() {
    }

    public Address(String city, String zip, String street) {
        this.city = city;
        this.zip = zip;
        this.street = street;
    }
}
  • @Embeddable : 임베디드 타입(복합 값 타입)을 정의하는 곳에 표시
    • 기본 생성자 필수

PostStatus.java

package project.post.domain;

public enum PostStatus {
    CREATE, // 생성
    DELETE, // 삭제
    MODIFY // 수정
}

전체 코드

 

to_post/src/main/java/project/post/domain at main · pparkcoder/to_post

[Side Project] SpringBoot + JPA를 활용한 게시판 만들기. Contribute to pparkcoder/to_post development by creating an account on GitHub.

github.com