TIL_220728_강의용 게시판 프로젝트 4

창고·2022년 7월 29일
0

들어가기에 앞서
실제 프로젝트 진행했던 코드 내용 및 세부 내용은 일부만 업로드하였습니다.

8. 데이터베이스 접근 로직 테스트 정의

(2) DB 세팅 테스트 진행

  • 테스트 오류 발생, data.sql 삭제 (빈 내용이 있으면 안됨)
  • 테스트 돌렸으나 또 Build 옵션이 default값이 gradle로 되어 있어 오류 발생하였음
    -> IntelliJ로 변경하여 정상 테스트 완료... 이 부분은 무조건 발생하는 오류인가? 수동으로 고쳐야 하는지?
    -> 찾아보니까 대부분 다 일일이 수동으로 고쳐야하는 것 같음...

(3) Entity 생성

  • 이전에 Push가 안됐으므로 전부 Unstaged로 옮긴 후 Push
  • ERD 수정 후 fetch 한 후 pull forward fast
  • @Getter, @ToString, @Table
@Table(indexes = {
        @Index(columnList = "title"),
        @Index(columnList = "hashtag"),
        @Index(columnList = "createdAt"),
        @Index(columnList = "createdBy")
})
  • @Setter는 전체 클래스에 걸지 않으며 필요한 필드에만 검
    (외부에서 변경되지 말아야 할 필드도 Setter로 변경할 수 있으므로)
  • JPA Auditing 검색하여 따로 공부해보자
  • config package 생성 (앞으로 config 관련은 여기에)
  • JpaConfig 생성, @EnableJpaAuditing, @Configuration
  • meta data에 대한 Annotation 구현
  • 다만 생성/수정일자는 시스템적으로 자동 저장이 가능하겠으나, 생성자/수정자 정보는 현 시점에서 자동으로 받아낼 수가 없음 (Spring Security를 아직 안 쓰고 있음)
  • 따라서 이를 위해 JpaConfig 수정
    • 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을 생성하려면 위의 매개값이 필요하다는 가이드
  • 추후 list, collection 에 사용할 시 동질성 / 동등성 확인 기능을 위한 처리
    • Generate > equals() and hashCode()
    • id만 체크 (PRIMARY KEY 이므로 이미 id만으로도 entity 구분이 됨. id가 같다면 동일한 객체), nonnull도 체크
    • 생성 후 article 클릭, Pattern Variable로 변경 (ctrl + enter)
    • id가 null 일 때(=영속화가 되지 않았을 때)의 처리를 해야 하므로
      returnid != 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);
    }
profile
공부했던 내용들을 모아둔 창고입니다.

0개의 댓글