목록분류 전체보기 (572)
오봉이와 함께하는 개발 블로그
새로운 엔티티를 구별하는 방법 save() 메소드 새로운 엔티티면 저장(persist) 새로운 엔티티가 아니면 병합(merge) 새로운 엔티티를 판단하는 기본 전략 식별자가 객체일 때 null인지 아닌지 여부로 판단 식별자가 자바 기본 타입일 때 0인지 아닌지 여부로 판단 Persistable 인터페이스를 구현해서 판단 로직 변경 가능 package org.springframework.data.domain; public interface Persistable { ID getId(); boolean isNew(); } JPA 식별자 생성 전략이 @GenerateValue면 save() 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 정상 동작한다. 그런데 JPA 식별자 생성 전략이 @Id만 사용해서..
스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); return entity; } else { return em.merge(entity); } } // ......... } @Repository 적용 : JPA 예외를 스프링이..
Web 확장 - 페이징과 정렬 스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다. 페이징과 정렬 예제 @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } 파라미터로 Pageable을 받을 수 있다. Pageable은 인터페이스다. 실제는 org.springframework.data.domain.PageRequest 객체 생성 { ......................... { "createdDate": "2022-09-14T01:54:54.034161", "lastModifiedDate": "2..
Web 확장 - 도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩 도메인 클래스 컨버터 사용 전 @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } @PostConstruct public void i..
Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? 등록일 수정일 등록자 수정자 순수 JPA 사용 우선 등록일, 수정일을 적용해보자. @MappedSuperclass // 상속 관계가 아니라 속성만 내려줘서 데이터를 같이 사용할 수 있게 할 수 있다. @Getter public class JpaBaseEntity { @Column(updatable = false) // createdDate는 update가 불가능하게 설정. private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist // persist 하기 전에 이벤트를 자동 발생시킴. public void prePersist() { Lo..