springframework 125

@CreationTimeStamp, @UpateTimestamp

하이버네이트 5.2 이상 부터 Entity 의 수정일과 등록일을 관리해주는 어노테이션을 제공한다. Java8 에서 지원하는 시간 클래스를 사용할 수 있게 끔 해주고 있다. @Entity @Getter @Setter public class Reply { @Id @GeneratedValue private Long id; private String subject; @Column(unique = true) private Long accountId; private String author; private String content; @CreationTimestamp private LocalDateTime registerDate; @UpdateTimestamp private LocalDateTime updateDa..

Spring Data JPA : Enumeration Mapping

엔티티 맵핑 시 Enum 타입 맵핑 방법 @Enumerated 사용 기본 값은 EnumType.ORDINAL , 즉 순번으로 맵핑 된다. Enum 타입의 순번이 바뀔 경우 참사가 일어난다. 그러므로 @Enmerated 의 속성은 EnumType.STRING 으로 하는 것이 아주아주 안전하다. public enum AccountStatus { BIRTH , LIVE , DIED } @Entity public class Account { @Id @GeneratedValue private Long id; private String username; private String password; private int age; @Enumerated(value = EnumType.STRING) private Acco..

Spring Data JPA : Auditing, Life Cycle Event

Auditing(감사) 엔티티 변경 시점에 언제 , 누가 변경 했는지 정보를 기술하는 기능이다. 스프링 부트의 자동설정 지원을 받지 않는다. 누가, 언제 @CreatedDate , @CreatedBy @LastModifiedDate , @LastModifiedBy 적용할 Entity 클래스에 @EntityListener 선언 @Entity @EntityListeners(AuditingEntityListener.class) public class Comment { @Id @GeneratedValue private Long id; private String title; private String comment; @ManyToOne(fetch = FetchType.LAZY) private Post post; ..

Spring Data JPA : Transaction

SimplaJpaRepository 에 @Transactional 이 명시되어 있기 때문에 해당 내용은 SpringFramework 의 @Transactional 어노테이션과 관련이 깊다. 개인적으로 알고 있는 내용이었는데, 다시 찾아보는 과정에서 책 2권정도 다시 펴보고 기록한다. 우선순위에 따라 클래스에 있는 @Transactional(readOnly = true) 보다 메서드에 선언된 @Transactional 의 설정이 우선시 된다. 결과적으로 select 쿼리를 사용하는 메서드에는 readOnly 속성이 true 잡히고, update insert delete 의 DML 에는 @Trasactional 의 readOnly 속성이 false 이므로 성능 상 이득을 가져다 주는 것으로 기억한다. @Re..

Spring Data JPA : Query By Example

계륵 같은 녀석으로 알고 있으면 좋을만한 기능 조건 조합을 유연하게 가져가지 못함 Example = Prove + ExampleMatcher Prove 는 도메인 객체를 의미함 ExampleMatcher 는 Prove 와 DB 데이터 매칭을 관리 기본적으로는 DB 데이터가 Entity 데이터와 정확히 일치해야한다. Example 의 정적메서드 of 로 Example 을 만든다. ExampleMatcher 를 이용해서 조건을 만든다. Entity 인 prove, ExampleMatcher 를 매개 값으로 Example 의 정적메서드 .of() 를 호출하여 Example 을 만든다. 사용할 리포지토리는 QueryByExampleExecutor 을 상속해야한다. public interface CommentRe..

Spring Data JPA : Specifications

Specifications QueryDSL 의 Predicate와 유사 함. 사용방법 다소 복잡. Pageable 사용가능, 원하는 조건 저장가능, Static Import 로 코드 가독성 상승 가능 적용방법 hibernate-jpa model generator 의존성 추가 org.hibernate hibernate-jpamodelgen 인텔리제이 기준 , Annotation Processor 설정란의 Processor 등록 란 > org.hibernate.jpamodelgen.JPAMetaModelEntityProcessor 등록 maven 을 통해 컴파일을 진행하면 generate-source 폴더에 Entity 에 대한 클래스가 생성 됨 (QueryDSL 과 같다.) maven package 시 문..

Spring Data JPA : Projection

Projection 이란 엔티티의 속성 중 원하는 속성만 select 해오는 기능 Closed Projecton , Open Projection 으로 나뉜다. Interface , Class 기반의 2가지 방법을 제공한다. 해당 코드는 Projection 미사용 시 모든 레코드를 조회 * 하고 있는 상황을 보여준다. public interface CommentRepository extends JpaRepository { List findByPost_Id(Long id); } @Test public void getComment(){ commentRepository.findByPost_Id(1L); } /// 모든 레코드를 다 가져옴 Hibernate: select comment0_.id as id1_1_,..

Spring Data JPA : Entity Graph

Entity Graph 란. Fetch 전략을 유연하게 설정할 수 있게 해준다. 현재 Entity 의 주인은 Comment , N 으로서 @ManyToOne , 기본 FETCH 전략은 EAGER @Entity public class Comment { @Id @GeneratedValue private Long id; private String title; private String comment; @ManyToOne private Post post; public Post getPost() { return post; } public void setPost(Post post) { this.post = post; } public Long getId() { return id; } public void setId(..

Spring Data JPA : Update 쿼리

강의 수강 중 궁금했던 Update 쿼리에 대해 배운다. DirtyChecking + WriteBehind 에 의한 Persistent 상태의 Entity 에 변화가 일어났으며, find()를 호출해야하는 상황이 오면 Update 문이 자동으로 실행 save() 호출 시 Entity 상태에 따른 EntityManager 의 persist() , merge() 사용으로 인한 Persistent 상태 전환 에서 사용되는 Update 문 find, count, delete 메서드는 제공하는데 update는 열심히 찾아보아도 없더라. 사실 제공기능을 공부하다보니 필요할까 라는 생각도 들었었다. 메서드로 제공되지 않는 이유 Persistent 상태의 Entity 변화를 감지(DirtyChecking) 후 변경이 ..

Spring Data JPA : Named Parameter , SpEL

NamedParameter @Query 에 선언하던 파라미터들을 ?1 등의 체번으로 가리키지 않게 된다. :Name 을 사용하며 정의는 @Param 어노테이션에서 한다. Mybatis 에서 보았던 @Param 비슷하게 해당 NamedParam 이 Mapper.xml 에서 사용되는 것과 거의 같은 구조를 보이고 있다. @Param < org.springframework.data.repository.query.Param 으로 NamedParameter 정의 @Query 에서 :Name 의 형식으로 사용 public interface CommentRepository extends JpaRepository { @Query("SELECT c, c.title as cTitle FROM Comment as c WHE..