[JPA] Entity 를 구성하는 필드를 다루는 방법

민지·2023년 9월 2일
0

Java

목록 보기
19/21

ex) 게시글(Article) 도메인

@Getter
@ToString
@Table(indexes = {
        @Index(columnList = "title"),
        @Index(columnList = "hashtag"),
        @Index(columnList = "createAt"),
        @Index(columnList = "createBy")
})
@Entity
public class Article {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Setter @Column(nullable = false) private String title;
    @Setter @Column(nullable = false, length = 10000) private String content;

    @Setter private String hashtag; // optional

    @CreatedDate @Column(nullable = false) private LocalDateTime createAt;
    @CreatedBy @Column(nullable = false, length = 100) private String createBy;
    @LastModifiedDate @Column(nullable = false) private LocalDateTime modifiedAt;
    @LastModifiedBy @Column(nullable = false, length = 100) private String modifiedBy;
}
  • @Getter
    모든 필드는 접근이 가능하게 한다.

  • @Setter
    도메인에서 수정이 가능하게 한다.
    클래스에 안붙이고 필드에 각각 붙여준 이유는
    id 는 jpa 영속성 컨텍스트가 영속화를 할 때 자동(autoincrement)으로 고유 번호를 부여해주는데
    사용자가 이 id 나 메타데이터(생성일시, 생성자) 같은 특정 필드들을 임의로 수정할 수 없게 막고 싶어서 필드에 각각 붙여주었다.

  • @Tostring
    모든 필드를 쉽게 출력해준다.

  • @Table(indexes = {@Index(columnList = "필드명")})
    제목, 해시태그, 생성일시, 생성자를 빠르게 검색할 수 있게 한다.
    게시글의 본문(content 객체)은 사이즈가 크기때문에 사이즈 제한이 있는 인덱스를 걸지 않았다. 본문 검색을 원하면 MySQL 엔진이 지원하는 Full-Text Search 를 이용하거나 따로 elasticsearch 의 도움을 받아도 된다.

  • @Entity
    엔티티 명시

  • @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    자동으로 autoincrement 를 해준다.

  • @Column(nullable = false)
    nullable = true 는 기본값이기 때문에 생략 가능하다.
    @Column 애노테이션은 아무 옵션이 없을 땐 생략해도 된다.
    @Entity 가 붙은 클래스에 있는 모든 필드는 @Transient 같은 설정을 따로 해주지 않는 이상 모두 컬럼으로 간주한다. 그래서 @Column 애노테이션이 붙어있다고 봐도된다.

  • @CreateDate, @CreatedBy, @LastModifiedDate, @LastModifiedBy
    생성일시, 생성자, 수정일시, 수정자 이렇게 식별자 같은 필드들에 자동으로 값을 넣어준다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update 를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit 을 이용하면 자동으로 시간을 매핑하여 DB 테이블에 넣어주게 된다.


auditing 할 때 생성자 이름을 넣어주기 위한 config 파일

@EnableJpaAuditing
@Configuration
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.of("ming");
    }
}

수동으로 스프링 컨테이너에 빈을 등록하는 방법이다.
@Configuration 안에서 @Bean을 사용해야 싱글톤을 보장받을 수 있으므로 @Bean 어노테이션은 반드시 @Configuration과 함께 사용해주어야 한다.

profile
개발일지

0개의 댓글