프로젝트 설계
엔티티
- 한명의 Member가 여러개의 Post를 작성할 수 있기에 1:N 관계 설정(단방향)
- Value Type 사용을 위해 Address 추가
- Enum Type 사용을 위해 PostStatus(게시글 상태값) 추가
- CREATE : 생성
- DELETE : 삭제(실무에서 실제 데이터 삭제가 아닌 상태값 변경으로 처리하는 경우가 많음)
- MODIFY : 수정
- 추후 엔티티를 추가하여 기능을 확장할 예정
기능
- 회원 가입 - 완료
- 게시글 목록 조회 - 완료
- 게시글 등록 - 완료
- 게시글 수정 - 완료
- 게시글 삭제 - 완료
- 게시글 검색 - 완료
- 게시글 페이징
- 로그인/로그아웃(모든 기능 개발을 마친 후 가장 마지막에 진행 예정)
엔티티 생성
디렉토리 구조
- 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
'개발진행목록 > 게시판 서비스' 카테고리의 다른 글
[JPA로 게시판 만들기] API 개발 (0) | 2025.02.05 |
---|---|
[JPA로 게시판 만들기] 테스트 코드 작성 (0) | 2025.01.23 |
[JPA로 게시판 만들기] TDD, BDD 란 (1) | 2025.01.23 |
[JPA로 게시판 만들기] 서비스, 레포지토리 개발 (0) | 2025.01.18 |
[JPA로 게시판 만들기] 프로젝트 환경 설정 및 DB 연동 (1) | 2025.01.16 |