Programming-[Backend] (417) 썸네일형 리스트형 [spring data JPA] 3. 확장 : Auditing, Paging - @CreatedAt, @PageableDefault 등 1. 사용자 정의 레포지토리 구현 JpaRepository를 상속받는 Repository를 사용해야되는 경우, 내가 정의하는 메소드 외에 기본적으로 Spring Data JPA에서 제공하는 모든 메서드를 구현해야되서 사용이 힘들다. 따라서 내가 정의한 메서드만 Override 할 수 있도록 사용자 정의 레포지토리를 작성할 수 있다. 인터페이스를 MemberRepository 라고 하고, 그에 맞는 구현체는 MemberRepositoryImpl이라고 작성해주면, 스프링 부트가 알아서 사용자 정의 구현체임을 식별하여 Spring data JPA의 기능을 활용할 수 있도록 처리해준다. [인터페이스 이름 + Impl] 이라는 규칙을 적용해야되는 것을 기억하자. xml 이나 JavaConfig에서 설정을 바꾸어 .. [spring data JPA] 2. 페이징과 정렬, 벌크 연산 @EntityGraph, JPA Hint Lock 1. 순수 JPA 페이징 JPA만 사용해서 페이징을 하는 방법은, JPQL문을 작성해서 setFirstResult, setMaxResults를 넣어주면 된다. Repository 파일에 다음과 같이 작성한다. 이미 API 상 setFirstResult, setMaxResults가 주어져서 상당히 편하다. setFirstResult는 어디부터 시작할지 결정하는, 말 그대로 offset이고, limit은 offset부터 몇개까지 결과를 반환할지를 결정한다. totalCount 메서드로 총 갯수를 구해서 구 메서드의 합계 결과를 바탕으로 Page 결과를 도출할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 public List findByPage(int age, int offset, int .. [TIL][작성중] 자바 일급 객체로 소프트웨어 안정성 높이기, 한계점 https://jojoldu.tistory.com/412 일급 컬렉션 (First Class Collection)의 소개와 써야할 이유 최근 클린코드 & TDD 강의의 리뷰어로 참가하면서 많은 분들이 공통적으로 어려워 하는 개념 한가지를 발견하게 되었습니다. 바로 일급 컬렉션인데요. 왜 객체지향적으로, 리팩토링하기 쉬운 코 jojoldu.tistory.com 일급객체 만들기 : 객체를 클래스로 Wrapping하고 객체에 add나 set을 할 수 없게 막는다. 1. 불변으로 만들 수 있다. Setter, Getter를 만들지 않고, validation하는 코드를 넣어놓으면 외부에서 다른 사람이 파라미터로 받아오는 객체를 마음대로 수정할 수 없다. 2. 하나의 기능을 온전히 표현한다. 각 필드값을 마음대로 .. [TIL][TDD] TDD 4편. 자바 Reflection 의 원리와 활용, Spring의 ReflectionTestUtils.invokeMethod 1. Reflection의 정의와 원리 자바의 Reflection은 어떤 클래스의 구현 내용을 모를 때, 해당 내용들을 조회할 수 있도록 자바에서 제공하는 API라고 한다. 이것은 참조 2에 따르면, 자바는 클래스 파일을 바이트 코드로 컴파일하여 static 영역에 위치하게 되므로 여기서 해당 클래스의 정보를 가져올 수 있는 것이라고 한다. 가져올 수 있는 정보는 아래와 같다. ClassName Class Modifiers Package Info Superclass Implemented interfaces Constructors MethodsFields Annotations 2. Reflection 사용해보기 TestClassForReflection라는 클래스를 임시로 만들고 .class 뒤에 .을 붙이.. [TIL] 자바 리스트 2개 이상 stream으로 순차적으로 비교 처리하기 : LongStream, IntStream for문을 안쓰고 길이가 같은 리스트의 정보들을 순차적으로 처리할려면, stream 문법으로 LongStream 또는 IntStream을 사용하면 된다. for(int i = 0; ...) 을 쓰지 않는 방법이다. 1 2 3 4 5 6 7 8 9 10 int size = AList.size(); List result = IntStream.range(0, size).boxed().map(i -> { ADto aDto = AList.get(i); BDto bDto = BList.get(i); //필요한 로직 처리... //ex) aDto.setName(bDto.getName()); return aDto }).collect(Collectors.toList()); Colored by Color Scripter cs [TIL][TDD] TDD 3편. 인터페이스 분리로 테스트는 분리, 서비스는 트랜잭션으로 묶기 TDD 2편에서는 서비스 메서드를 기능(의미)적으로 분리해가며 작성하는 것이 TDD 방식의 기본이라고 기록했다. 이번 글에서는 이것을 각 인터페이스로 분리해서 설계하는 방법에 대해 정리한다. 정확한 정보는 아닐 수 있으니 이 글을 발견하시는 분이 있다면 참조만 하시길. TDD 2편 [TIL][TDD] 테스트 코드 기반으로 짜되, service 코드에서 의미적으로(기능적으로) 분리해가며 작성하기 1. 문제점 1-1. 메서드를 분리하면 트랜잭션 하나로 묶이지 않는다. 다른 사용자가 실행 순서를 기억해야한다. 2편에서 다룬 것처럼 서비스 코드를 메서드별로 분리하면서 테스트하면 좋다. 그런데, 분리만 하다보면 모든 서비스 코드가 개별 트랜잭션으로 분리되고, Controller에서 각 service 메서드들을 불.. [spring data JPA] 1. 초기 설정 및 Data Jpa 기본 1. 초기 세팅 이전 강의와 거의 동일하게 프로젝트를 만들고 환경 설정을 해준다. application.yml 파일은 다음과 같다. 환경 설정에서 띄어쓰기, 오타 등의 실수는 치명적이다. 정확히 써야한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 spring: datasource: url: jdbc:h2:tcp://localhost/~/datajpa username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show-sql: true format_sql: true logging.level: org.hibernate.S.. [JPA활용-1] 3. 도메인 개발 : Unique 제약 조건, main/test 환경 설정 분리, JPQL 동적 쿼리 등 스프링의 @Repository에 JPA의 @PersistenceContext 추가 그냥 스프링만 이용할 때는 @Repository 어노테이션을 추가하여 @Component 로서 Component Scan이 되게 하였다. 여기에 @PersistenceContext 어노테이션으로 EntityManager를 불러오면, 스프링이 EntityManager를 만들어서 Repository에 주입해주게 된다. Member 객체와 관련한 기본적인 기능을 갖는 MemberRepository를 보면, EntityManager를 @PersistenceContext 어노테이션과 함께 작성한 것을 확인할 수 있다. 추가로, 엔티티 자체를 들고 와야하거나 특정 파라미터를 추가해야된다면, 기본편에서 배운 JPQL 문법을 사용해야 한.. 이전 1 ··· 34 35 36 37 38 39 40 ··· 53 다음