JPA - 권한에 맞는 화면 구성 및 API 호출
2022. 9. 13. 00:11
JPA
Admin 권한을 가진 User가 게시글 삭제 가능한 기능 추가 삭제 버튼 추가 취소 삭제 확인 Thymeleaf sec role 기능 사용 취소 삭제 확인
JPA - Jpa로 조회방법(FetchType) 설정하기
2022. 9. 12. 20:15
JPA
N+1 문제 User 를 조회 시 board 도 함께 조회가 된다. @OneToMany(mappedBy = "user", fetch = FetchType.EAGER) @JsonIgnore private List boards = new ArrayList(); Hibernate: select user0_.id as id1_2_, user0_.enabled as enabled2_2_, user0_.password as password3_2_, user0_.username as username4_2_ from user user0_ Hibernate: select boards0_.user_id as user_id4_0_0_, boards0_.id as id1_0_0_, boards0_.id as id1_0_1_,..
JPA - Jpa를 이용하여 @OneToMany 관계 설정하기
2022. 9. 11. 18:59
JPA
연관관계 설정 board 테이블에 user_id 컬럼 생성 후 user 테이블의 외래키로 설정 Board.java package com.toy.board.domain; import lombok.Data; import javax.persistence.*; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Entity @Data public class Board { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull @Size(min=2, max=30, message = "제목은 2자이상 30자 이하입니다."..
JPA - 다대다 관계 한계 극복
2022. 9. 11. 11:57
JPA
package com.toy.board.domain; import lombok.Data; import javax.persistence.*; import java.util.List; @Data @Entity public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany(mappedBy = "roles") private List users; } package com.toy.board.domain; import lombok.Data; import javax.persistence.*; import java.util.ArrayList; import ja..
JPA - Spring Security를 이용한 로그인 처리
2022. 9. 10. 19:15
JPA
로그인 기능 만들기 spring.io 에서 의존성 복사 https://spring.io/guides/gs/securing-web/ Securing a Web Application this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team spring.io implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-sec..
JPA - Jpa를 이용한 페이지 처리 및 검색
2022. 9. 9. 12:17
JPA
Bootstrap 에서 페이지 UI 복사 https://getbootstrap.com/docs/5.2/components/pagination/#overview Pagination Documentation and examples for showing pagination to indicate a series of related content exists across multiple pages. getbootstrap.com Previous 1 2 3 Next 페이징 코드 추가 PagingAndSortingRepository repository = // … get access to a bean Page users = repository.findAll(PageRequest.of(1, 20)); BoardCont..
JPA - Jpa를 이용한 RESTful API 만들기
2022. 9. 8. 17:39
JPA
guide에서 카피 해오기 https://spring.io/guides/tutorials/rest/ Building REST services with Spring this tutorial is designed to be completed in 2-3 hours, it provides deeper, in-context explorations of enterprise application development topics, leaving you ready to implement real-world solutions. spring.io BoardApiController.java package com.toy.board.web; import java.util.List; import com.toy.board.dom..
JPA - Pageable
2022. 9. 2. 15:09
JPA
PageRequest of of() 설명 PageRequest.of(int page, int size) 페이지 번호(0부터 시작), 페이지당 데이터의수 PageRequest.of (int page, int size, Sort.Direction direction, String ...props) 페이지 번호, 페이지당 데이터의 수, 정렬 방향, 속성(칼럼)들 PageRequest.of(int page, int size, Sort sort) 페이지 번호, 페이지당 데이터의 수, 정렬방향 Page 객체 구성 메소드 설명 int getNumber() 현재 페이지의 정보 int getSize() 한 페이지의 크기 int getTotalPages 전체 페이지의 수 int getNumberOfElements() 결과 ..
JPA - Paging
2022. 9. 1. 20:13
JPA
JPA Paging 이란? DB에 저장된 Entity들을 페이지로 나누는 것이다. 예를들어, DB에 책이 20권 저장되어있다. 프론트에서 "DB에 있는 책을 5권씩 분류해서, 두 번째 파트를 줘!" 라고 요청한다. 그러면 백엔드에서는 5권씩 분류하고, 분류된 책들의 두 번째 파트를 프론트에게 넘겨준다. 위 상황과 같이, 일정 갯수만큼 분류하고, 분류된 부분들 중 어떤 부분을 보내주는 것이 JPA Paging이다. 사용법 사용법은 매우 간단하다. repository의 findAll 메서드의 parameter에 Pageable 또는 Pageable의 구현체인 PageRequest를 넣어주면 된다. 인터넷을 찾아보면 Controller에서 Pageable을 받아서 사용하는 코드들이 있는데 따라서 해보니 안된다..
TypedQuery, Query
2022. 8. 29. 15:16
JPA/JPQL
TypedQuery, Query 작성한 JPQL을 실행시키기 위해 만드는 쿼리 객체이다. JPQL이 반환할 타입을 명확하게 지정할 수 있으면 TypedQuery를 사용하고, 명확하게 지정할 수 없으면 Query를 사용하면 된다. // 조회대상이 정확히 Member 엔티티이므로 TypedQuery 사용 가능 TypedQuery query = em.createQuery("SELECT m FROM Member m", Member.class); // 조회대상이 String, Integer로 명확하지 않으므로 Query 사용 Query query = em.createQuery("SELECT m.username, m.age FROM Member m"); TypedQuery로 실행된 쿼리는 두번쨰 인자로 주어진 클래..
네이티브 쿼리
2022. 7. 23. 16:50
JPA/JPA-Spring Data
가급적 네이티브 쿼리는 사용하지 않는게 좋음, 정말 어쩔 수 없을 때 사용 최근에 나온 궁극의 방법 스프링 데이터 Projections 활용 스프링 데이터 JPA 기반 네이티브 쿼리 페이징 지원 반환 타입 Object[] Tuple DTO(스프링 데이터 인터페이스 Projections 지원) 제약 Sort 파라미터를 통한 정렬이 정상 동작하지 않을 수 있음(믿지 말고 직접 처리) JPQL처럼 애플리케이션 로딩 시점에 문법 확인 불가 동적 쿼리 불가 JPA 네이티브 SQL 지원 public interface MemberRepository extends JpaRepository { @Query(value = "select * from member where username = ?", nativeQuery =..
Projections
2022. 7. 23. 16:24
JPA/JPA-Spring Data
엔티티 대신에 DTO를 편리하게 조회할 때 사용 전체 엔티티가 아니라 만약 회원 이름만 딱 조회하고 싶으면? public interface UsernameOnly { String getUsername(); } 조회할 엔티티의 필드를 getter 형식으로 지정하면 해당 필드만 선택해서 조회(Projection) public interface MemberRepository ... { List findProjectionsByUsername(String username); } 메서드 이름은 자유, 반환 타입으로 인지 @Test public void projections() throws Exception { //given Team teamA = new Team("teamA"); em.persist(teamA); ..
새로운 엔티티를 구별하는 방법
2022. 7. 23. 04:35
JPA/JPA-Spring Data
새로운 엔티티를 판단하는 기본 전략 식별자가 객체일 때 null 로 판단 식별자가 자바 기본 타입일 때 0 으로 판단 Persistable 인터페이스를 구현해서 판단 로직 변경 가능 package org.springframework.data.domain; public interface Persistable { ID getId(); boolean isNew(); } 참고: JPA 식별자 생성 전략이 @GenerateValue 면 save() 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 정상 동작한다. 그런데 JPA 식별자 생성 전략이 @Id 만 사용해서 직접 할당이면 이미 식별자 값이 있는 상태로 save() 를 호출한다. 따라서 이 경우 merge() 가 호출된다. merge() 는 우선 DB..
스프링 데이터 JPA 구현체 분석
2022. 7. 22. 15:12
JPA/JPA-Spring Data
스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleJpaRepository 리스트 12.31 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 확장 - 페이징과 정렬
2022. 7. 22. 13:51
JPA/JPA-Spring Data
스프링 데이터가 제공하는 페이징과 정렬 기능을 스프링 MVC에서 편리하게 사용할 수 있다. 페이징과 정렬 예제 @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } 파라미터로 Pageable 을 받을 수 있다. Pageable 은 인터페이스, 실제는 org.springframework.data.domain.PageRequest 객체 생성 요청 파라미터 예) /members?page=0&size=3&sort=id,desc&sort=username,desc page: 현재 페이지, 0부터 시작한다. size: 한 페이지에 노출할 데이터 건수..
Web 확장 - 도메인 클래스 컨버터
2022. 7. 22. 02:11
JPA/JPA-Spring Data
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(); } } 도메인 클래스 컨버터 사용 후 @RestController @RequiredArgsC..
Auditing
2022. 7. 21. 22:12
JPA/JPA-Spring Data
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? 등록일 수정일 등록자 수정자 순수 JPA 사용 우선 등록일, 수정일 적용 package study.datajpa.entity; @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now(); createdDate = now; updatedDate = now; } @PreUpdate public ..
사용자 정의 리포지토리 구현
2022. 7. 21. 20:33
JPA/JPA-Spring Data
스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? JPA 직접 사용( EntityManager ) 스프링 JDBC Template 사용 MyBatis 사용 데이터베이스 커넥션 직접 사용 등등... Querydsl 사용 사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 인터페이스 구현 클래스 @RequiredArgsConstructor public class MemberRepositoryImpl implements M..
JPA Hint & Lock
2022. 7. 21. 20:08
JPA/JPA-Spring Data
JPA Hint JPA 쿼리 힌트(SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트) @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true")) Member findReadOnlyByUsername(String username); Lock @Lock(LockModeType.PESSIMISTIC_WRITE) List findByUsername(String name); org.springframework.data.jpa.repository.Lock 어노테이션을 사용 JPA가 제공하는 락은 JPA 책 16.1 트랜잭션과 락 절을 참고 출처 : 김영한 JPA 스프링 데이터 강의
@EntityGraph
2022. 7. 21. 15:07
JPA/JPA-Spring Data
//공통 메서드 오버라이드 @Override @EntityGraph(attributePaths = {"team"}) List findAll(); //JPQL + 엔티티 그래프 @EntityGraph(attributePaths = {"team"}) @Query("select m from Member m") List findMemberEntityGraph(); //메서드 이름으로 쿼리에서 특히 편리하다. @EntityGraph(attributePaths = {"team"}) List findByUsername(String username) EntityGraph 정리 사실상 페치 조인(FETCH JOIN)의 간편 버전 LEFT OUTER JOIN 사용 NamedEntityGraph 사용 방법 @NamedEnt..