들어가기에 앞서
실제 프로젝트 진행했던 코드 내용 및 세부 내용은 일부만 업로드하였습니다.
data.sql
삭제 (빈 내용이 있으면 안됨)Build
옵션이 default값이 gradle
로 되어 있어 오류 발생하였음IntelliJ
로 변경하여 정상 테스트 완료... 이 부분은 무조건 발생하는 오류인가? 수동으로 고쳐야 하는지?@Getter
, @ToString
, @Table
@Table(indexes = {
@Index(columnList = "title"),
@Index(columnList = "hashtag"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@Setter
는 전체 클래스에 걸지 않으며 필요한 필드에만 검Setter
로 변경할 수 있으므로)JPA Auditing
검색하여 따로 공부해보자@EnableJpaAuditing
, @Configuration
Annotation
구현Spring Security
를 아직 안 쓰고 있음)Security
인증 기능 구현 이전까지는 강제로 생성/수정자의 이름을 지정해서 넣어줌Security
추가 시 접속한 정보를 가져올 수 있어 아이디/닉네임명 가져오기가 가능해짐)import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import java.util.Optional;
@EnableJpaAuditing
@Configuration
public class JpaConfig {
@Bean
public AuditorAware<String> auditorAware() {
return () -> Optional.of("hahaha"); // TODO : 스프링 시큐리티로 인증 기능을 붙일 때 수정 필요
// (지금은 hahaha로 생성/수정자의 이름이 세팅됨)
}
}
@Column
사용 및 NOT NULL
값 구분, length
로 길이 제한import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import javax.persistence.*;
import java.time.LocalDateTime;
@Getter
//@Setter : 클래스 전체적으로 걸면 안됨 -> (id) 등을 setter로 변경해버릴 수 있음
//물론 case by case로 전체적으로 거는 경우도 있음
@ToString
// 본문을 index로 하기엔 너무 큼 (MySQL 자체 기능이나 ElasticSearch 등의 검색 엔진 사용)
@Table(indexes = {
@Index(columnList = "title"),
@Index(columnList = "hashtag"),
@Index(columnList = "createdAt"),
@Index(columnList = "createdBy")
})
@Entity
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto_increment
private Long id;
@Setter @Column(nullable = false) private String title; // 제목
@Setter @Column(nullable = false, length = 10000) private String content; // 본문
@Setter private String hashtag; // 해시태그
// @Transient 언급이 없는 이상 @Column 적용된 것으로 인식 (nullable = true)
// meta data
// JPA Auditing
@CreatedDate @Column(nullable = false) private LocalDateTime createdAt; // 생성일시
@CreatedBy @Column(nullable = false, length = 100) private String createdBy; // 생성자
@LastModifiedDate @Column(nullable = false) private LocalDateTime modifiedAt; // 수정일시
@LastModifiedBy @Column(nullable = false, length = 100) private String modifiedBy; // 수정자
}
// Entity로서의 기본 기능 추가
// Hibernate 구현체 기준으로 기본 생성자가 필요 (외부에서는 사용하지 못하도록 해야 함)
protected Article() {} // private는 안됨
private Article(String title, String content, String hashtag) {
this.title = title;
this.content = content;
this.hashtag = hashtag;
}
public static Article of(String title, String content, String hashtag) {
return new Article(title, content, hashtag);
}
// 도메인 Article을 생성하려면 위의 매개값이 필요하다는 가이드
Generate > equals() and hashCode()
PRIMARY KEY
이므로 이미 id만으로도 entity 구분이 됨. id가 같다면 동일한 객체), nonnull도 체크Pattern Variable
로 변경 (ctrl + enter
)return
에 id != null &&
조건 추가 @Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Article article)) return false;
// article을 pattern variable로 수정
return id != null && id.equals(article.id);
// 영속화가 되었는지를 id ! = null로 확인
}
@Override
public int hashCode() {
return Objects.hash(id);
}