목록BE (354)
오봉이와 함께하는 개발 블로그
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..
사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성한다. 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많아서 문제가 생긴다. 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면 어떻게 해야 할까 다양한 이유 JPA 직접 사용(EntityManager) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 등 Querydsl 사용 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } @RequiredArgsConstructor public class MemberReposito..
JPA Hint & Lock JPA Hint는 JPA 쿼리 힌트로, SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트다. 쿼리 힌트 사용 @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true")) Member findReadOnlyByUsername(String username); @Test public void queryHint() throws Exception { //given memberRepository.save(new Member("member1", 10)); em.flush(); em.clear(); //when Member member = memberRepository.findReadOnlyByUsern..
@EntityGraph 연관된 엔티티들을 SQL 한번에 조회하는 방법이다. @EntityGraph에 대하여 정확하게 이해하기 위해서는 패치조인에 대하여 알고 있어야한다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") // '일대다'관계에서 '다'가 연관관계 주인이 되어 FK를 가진다. private Team team; @Test public void findMemberLazy() throws Exception { // given Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); teamRepository.save(teamA); teamRepos..