728x90

JPA 48

(JPA) Error attempting to apply AttributeConverter 에러 관련 글(feat. @Converter 사용시)

컬럼에서 DB에 데이터를 변환하는 @Converter 어노테이션을 쓰다가 아래와 같은 에러와 마주치게 되었다. JpaSystemException: Error attempting to apply AttributeConverter 이를 해결하기 위해 Converter를 구현하는 인터페이스를 살펴보기로 했다. JpaAttributeConverter 인터페이스와 구현체 JpaAttributeConverterImpl 는 JpaAttributeConverter 인터페이스의 표준 구현체이다. attributeConverterBean 이라는 멤버변수에 AttributeConverter인터페이스를 구현한 커스텀 컨버터들을 가지고 있다가 경우에 따라서 관계형 값을 도메인 값으로, 도메인 값을 관계형 값으로 변환을 해준다...

JPA 2022.03.26

JPA에서 pageable을 통해 Paging 간단하게 구현하는 법

Paging 구현하기 가장 먼저 Controller API 에서 Pageable 인터페이스 타입으로 파라미터를 받으면 되는데요. Pageable는 어떤 인터페이스인지 내부 메소드를 간단하게 보고 가겠습니다. 인터페이스가 가진 메소드를 보면 여러가지가 있지만 getPageNumber(), getPageSize(), getOffset() 처럼 페이징을 구현할 때 필요한 값들을 편하게 구할 수 있는 메소드들을 추상화 시켜놓은 것을 볼 수 있습니다. 그래서 이제 시도해보려는 방법은 Spring Data JPA에서 메소드 이름으로 쿼리를 만들 때 페이징을 추가하는 법 입니다. 바로 고고싱! Repository 구현하기 public interface PostRepository extends JpaRepository..

JPA 2022.03.22

(스프링 시큐리티)UserDetailsService, UserDetail

UserDetailsService UserDetailService 인터페이스는 DB에서 회원 정보를 가져오는 역할을 담당 loadUserByUsername() 메소드가 존재하며, 회원 정보를 조회하여 사용자의 정보와 권한을 갖는 UserDetails 인터페이스를 반환한다. 스프링 시큐리티에서 UserDetailService를 구현하고 있는 클래스를 통해 로그인 기능을 구현한다고 생각하면 된다. UserDetail 스프링 시큐리티에서 회원의 정보를 담기 위해서 사용하는 인터페이스는 UserDetails 이다. 이 인터페이스를 직접 구현하거나 스프링 시큐리티에서 제공하는 User클래스를 사용합니다. User 클래스는 UserDetails 인터페이스를 구현하고 있는 클래스이다. @Service @Transac..

JPA 2022.02.17

(스프링 데이터 JPA) 페이징과 정렬

스프링 데이터 JPA 페이징과 정렬 페이징과 정렬 파라미터 org.springframework.data.domain.Sort : 정렬 기능 org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함) 특별한 반환 타입 org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징 org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능합니다(내부적으로 limit + 1조회함). Page 사용 예제 코드 검색 조건: 나이가 20살 정렬 조건: 이름으로 오름차순 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 Page 사용 ..

JPA 2022.02.15

(Spring data JPA) 쿼리 메소드란?

스프링 데이터 JPA의 예 스프링 데이터 JPA는 메소드 이름을 분석해서 JPQL을 생성하고 실행(코드량이 줄어들어 효율성 증가) public interface MemberRepository extends JpaRepository { List findByUsernameAndAgeGreaterThan(String username, int age); } 위와 같이, 메소드 이름으로 쿼리를 생성하는 기능을 쿼리 메소드라고 하며 기능은 Spring 공식 홈페이지에 정리되어 있으며 간단히 정리하면 아래와 같습니다. 스프링 공식문서 참고 - https://docs.spring.io/spring-data/jpa/docs/current/reference/html/ 조회: find…By ,read…By ,query…By..

JPA 2022.02.15

스프링 데이터 JPA 란?

스프링 데이터 JPA 란? Spring framework에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트입니다. CRUD 처리를 위한 공통 인터페이스가 제공됩니다. repository 개발 시, 인터페이스만 작성하면 실행 시점에 스프링 데이터 JPA가 구현체를 동적으로 생성해서 주입시켜 줍니다. 따라서, 구현 클래스 없이 인터페이스만 작성해도 개발을 완료할 수 있습니다. 스프링 데이터 JPA 없이 Repository 개발한 예 @Repository @RequiredArgsConstructor public class MemberRepository { private final EntityManager em; public void save(Member member) { em.persist(member..

JPA 2022.02.15

QueryDSL 소개

QueryDSL 소개 정적 타입을 이용해서 SQL과 같은 쿼리를 생성할 수 있도록 해 주는 프레임워크입니다. 문자열로 작성하거나 XML 파일에 쿼리를 작성하는 대신, Querydsl이 제공하는 플루언트(Fluent) API를 이용해서 쿼리를 생성할 수 있습니다. IDE의 코드 자동 완성 기능 사용 가능 문법적으로 잘못된 쿼리를 허용하지 않음(오류 체크) 도메인 타입과 프로퍼티를 안전하게 참조할 수 있음 등 의 특징을 가집니다. //member, order 테이블에서 OrderStatus의 상태와 MemberName의 이름에 따라 값을 조회 public List findAll(OrderSearch orderSearch) { QOrder order = QOrder.order; QMember member = ..

JPA 2022.02.15

페치 조인(fetch join) 의 활용

(JPA) 페치 조인(fetch join) 의 활용 JPQL에서 성능 최적화를 위해 제공하는기능입니다. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능입니다. join fetch 명령어를 사용합니다. 페치 조인 예(v1(안쓴 버전), v2(쓴 버전) 비교) /** * V1. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) * - 단점: 지연로딩으로 쿼리 N번 호출 */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List orders = orderRepository.findAll(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(t..

JPA 2022.02.14

회원등록 API v1, v2 차이

회원등록 API v1, v2 차이 비교 회원등록 V1: 요청 값으로 Member 엔티티를 직접 받습니다. 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가됩니다. 엔티티에 API 검증을 위한 로직이 들어갑니다. (@NotEmpty 등등) 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵습니다. 엔티티가 변경되면 API 스펙이 변합니다. 결론 - API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 따로 생성하여 받는것이 좋습니다. @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){..

JPA 2022.02.14

변경 감지(dirty check)와 병합(merge)

(JPA)변경 감지와 병합(merge) 엔티티를 수정하는 2가지 방법으로 변경 감지(dirty checking)와 병합(merge)이 있습니다. 변경 감지 기능 사용 영속성 컨텍스트에서 엔티티를 다시 조회한 후에 데이터를 수정하는 방법입니다. 트랜잭션 안에서 엔티티를 다시 조회, 변경할 값 선택 트랜잭션 커밋 시점에 변경 감지(Dirty Checking) 이 동작해서 데이터베이스에 UPDATE SQL 실행합니다. @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.setP..

JPA 2022.02.14
728x90