2022. 5. 25. 12:16ㆍJava/Spring
- 일단 시작하기 전에 패키지를 아래와 같이 나누도록 하겠습니다.
- domain 패키지: 엔티티 및 리포지토리 클래스가 있는 패키지
- controller 패키지: 컨트롤러 클래스가 있는 패키지
- dto 패키지: DTO 클래스가 있는 패키지
오늘은 엔티티 및 리포지토리 클래스를 만들도록 하겠습니다.
1. 유저 (Users)
엔티티 클래스에는 기본적으로 @Entity와 @Getter, 그리고 NoArgsconstructor 어노테이션을 사용합니다.
- @Entity: 이 클래스가 엔티티임을 정의함
- @Getter: 말 그대로 getter 메소드를 정의함
- @NoArgscontructor: 기본 생성자인데, 엔티티 클래스에서는 기본적으로 꼭 필요하다.
User 클래스
package com.example.board.web.domain.user;
import com.example.board.web.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Getter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String email;
@Column
private String picture;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private Role role;
@Builder
public User(String name, String email, String picture, Role role) {
this.name = name;
this.email = email;
this.picture = picture;
this.role = role;
}
public String getRoleKey() {
return this.role.getKey();
}
}
@Builder는 객체 생성에서 주입하는 방식이다.
흔하게는 Constructor (생성자)를 사용해서 객체를 생성하는데, 생성자를 사용하면 파라미터에 대한 정확성, 오류를 찾기가 힘듭니다.
왜 그런지는 후에 코드를 짜며 알려주도록 하겠습니다.
Role 클래스
package com.example.board.web.domain.user;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter
@RequiredArgsConstructor
public enum Role {
GUEST("ROLE_GUEST", "손님"),
USER("ROLE_USER", "일반 사용자");
private final String key;
private final String title;
}
게스트인지, 유저인지 Role이라는 열거형 클래스를 사용하여 구분하도록 하겠습니다.
BaseTimeEntity 클래스
package com.example.board.web.domain;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
- @MappedSuperclass: 필드들을 column으로 인식하기 위해서 사용합니다.
- @EntityListeners: BaseTimeEntity 클래스에 Auditing 기능을 포함시킵니다.
BaseTimeEntity라는 추상 클래스를 만드는 이유는 유저, 게시물 엔티티들의 createdDate, modifiedDate를 자동으로 관리하기 위해서 사용합니다.
이 BaseTimeEntity는 User 클래스에서 상속받고, Post 클래스에도 상속받아야합니다.
그리고 EntityListeners의 AuditingEntityListener를 사용하기 위해서는 메인 클래스에 어노테이션 하나를 추가해줘야 합니다.
User 클래스에 BaseTimeEntity 상속
package com.example.board.web.domain.user;
import com.example.board.web.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Getter
@NoArgsConstructor
public class User extends BaseTimeEntity {
}
@EnableJpaAuditing을 사용해 Auditing 기능 활성화
package com.example.board;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@SpringBootApplication
@EnableJpaAuditing
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
2. Post (게시물)
Post 클래스
package com.example.board.web.domain.post;
import com.example.board.web.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@Entity
public class Post extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(length = 500, nullable = false)
private String title;
@Column(columnDefinition = "TEXT", nullable = false)
private String content;
private String author;
@Builder
public Post(Long id, String title, String content, String author) {
this.id = id;
this.title = title;
this.content = content;
this.author = author;
}
}
columnDefinition = "TEXT"라는 문장이 있는데, 이는 이 필드가 데이터베이스에서 TEXT형식이라는 것을 의미합니다. TEXT는 varchar와 달리 길이 제한이 없습니다.
3. Repository
리포지토리는 엔티티에 의해서 생성된 데이터베이스에 접근하는 메소드를 사용하기 위한 인터페이스입니다.
예를 들면 findAll(), findById() 등등이 있습니다.
user 패키지에 UserRepository 인터페이스를, post 패키기에 PostRepository를 만들도록 하겠습니다.
UserRepository 인터페이스
package com.example.board.web.domain.user;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
PostRepository 인터페이스
package com.example.board.web.domain.post;
import org.springframework.data.jpa.repository.JpaRepository;
public interface PostRepository extends JpaRepository<Post, Long> {
}
JpaRepository<엔티티 클래스, PK 타입>는 JPA 관련 특화 기능들을 추가할 수 있게 해준다. 그리고 CrudRepository와 PagingAndSortingRepository의 기능들도 기본적으로 가지고 있다.
정리해보면
- CrudRepository: CRUD 관련 기능들 제공
- PagingAndSortingRepository: 페이징 및 정렬 관련 기능들 제공
- JpaRepository: JPA 관련 특화 기능들 제공 + CrudRepository와 PagingAndSortingRepository기능 제공
단순하게 CRUD만 할 것이면 CrudRepository만 사용해도 무방하고, 그 외에 기능들을 사용하고 싶다면 JpaRepository를 사용하는 것을 추천합니다.
그리고 따로 @Repository를 사용하지 않아도 됩니다.
이제 한번 애플리케이션을 실행해보도록 하겠습니다.
실행하였을시에 이렇게 나온다면 데이터베이스에 엔티티들이 잘 들어갔다는 뜻입니다.
'Java > Spring' 카테고리의 다른 글
Spring boot를 이용한 게시판 만들기 - 등록, 수정, 조회 API 만들기(3) (1) | 2022.06.06 |
---|---|
Spring boot를 이용한 게시판 만들기 - JPA를 이용하여 데이터베이스 연결(1) (2) | 2022.05.17 |
Spring boot에서 Controller가 먹지 않는 에러 (0) | 2022.03.24 |
Spring boot 엔티티 매핑 (0) | 2022.03.21 |
Spring boot를 이용한 게시판 구현하기 - 데이터베이스 연결하기(1) (0) | 2022.03.10 |