Back-end/JPA
-
JPA - JpaRepository.save()Back-end/JPA 2020. 6. 30. 17:29
엔티티 저장하기 내부적으로 save()는 객체가 새로운 객체인지 다른 객체인지 판단을 합니다. Transient(새로운) 상태의 객체라면 EntityManager.persist() Detached(이미있는) 상태의 객체라면 EntityManager.merge() 위 두 가지의 상태를 구분하여 insert 혹은 update를 판단하게 됩니다. Transient와 Detached의 상태 판단은? 엔티티의 @Id 프로퍼티를 찾아서 해당 프로퍼티가 null이면 Transient 상태로 판단하고 id가 null이 아니면 Detached 상태로 판단합니다. 엔티티가 Persistable 인터페이스를 구현하고 있다면 isNew() 메소드에 위임합니다. JpaRepositoryFactory를 상속받는 클래스를 만들고 ..
-
JPA - JpaRepositoryBack-end/JPA 2020. 6. 30. 17:20
스프링 데이터 JPA Repository @EnableJpaRepositories JPA Repository를 사용하기 위해서는 Spring Framework 에서는 @EnableJpaRepositories 애노테이션을 사용해야 JpaRepository 인터페이스를 상속받은 Repository 인터페이스 타입의 Proxy 빈들을 등록해줍니다. 하지만 스프링 부트 사용할 때는 사용하지 않아도 자동 설정이 되므로 따로 세팅하지 않아도 됩니다. 스프링 부트를 사용하지 않을 때는 @Configuration과 같이 사용합니다. @Repository @Repository애노테이션은 JpaRepository의 기본 구현체인 SimpleJpaRepository가 가지고 있기 떄문에 또 사용하지 않아도 됩니다. Simp..
-
JPA - Common Pageable, SortBack-end/JPA 2020. 6. 30. 17:19
스프링 MVC HandlerMethodArgumentResolver 스프링 MVC 핸들러 메소드의 매개변수로 받을 수 있는 객체를 확장하고 싶을 때 사용하는 인터페이스로 이번에 실습해볼 Pageable과 Sort를 매개변수로 사용할 수 있습니다. 참고자료 : 레퍼런스 페이징과 정렬 관련 매개변수 page: 0부터 시작. size: 기본값 20. sort: property,property(,ASC|DESC) 예) sort=created,desc&sort=title (asc가 기본값) Pageable, Sort @RestController public class PostController { @Autowired private PostRepository postRepository; @GetMapping("/p..
-
JPA - Common DomainClassConverterBack-end/JPA 2020. 6. 30. 17:18
DomainClassConverter 하나의 타입을 다른 타입으로 변환하는 인터페이스로서 엔티티 혹은 ID를 각각의 타입으로 자동으로 변환해줍니다. 컨버팅에는 2가지 종류가 있습니다. ToEntityConverter: 어떠한 Entity의 Id를 받아서 그 Entity 타입으로 변환하는 Converter입니다. ToIdConverter: Entity를 그 Entity의 Id 타입으로 변환하는 Converter입니다. 침고자료 : 레퍼런스 Entity, Repository, Controller 생성 @RestController public class PostController { @Autowired private PostRepository postRepository; @GetMapping("/posts/{..
-
JPA - Common QueryDSLBack-end/JPA 2020. 6. 30. 17:16
QueryDSL(Domain Specific Language) JPA를 사용하다보면 메소드 이름을 통해 자동으로 쿼리를 생성했었습니다. findByFirstNameIngoreCaseAndLastNameStartsWithIgnoreCase(String firstName, String lastName) 위와 같은 네임을 가지고 있다면 가독성이 너무 떨어질 뿐더러 쿼리가 추가될 때마다 여러 조건들이 추가될 것입니다. 하지만 QueryDSL을 사용하게 되면 타입세이프하게 쿼리를 만들어 사용할 수 있습니다. 홈페이지 : querydsl 연동 방법 기본 리포지토리 커스터마이징 안 했을 때 먼저 Account 엔티티와 JpaRepository를 상속받는 Repository를 생성합니다. 그리고 빈 주입 테스트를 하기..
-
JPA - Common BasicRepositoryBack-end/JPA 2020. 6. 30. 17:14
BasicRepository 모든 리포지토리에 공통적으로 추가하고 싶은 기능이 있거나 덮어쓰고 싶은 기능이 있을 때 사용합니다. 구현하는 방법은 아래와 같습니다. JpaRepository를 상속 받는 인터페이스 정의하기 @NoRepositoryBean 기본 구현체를 상속 받는 커스텀 구현체 만들기 @EnableJpaRepositories에 설정하기 repositoryBaseClass 1. JpaRepository를 상속 받는 인터페이스 정의하기 @NoRepositoryBean public interface MyRepository extends JpaRepository { boolean contains(T entity); } 우선 공통으로 사용할 리파지토리를 생성하고 JpaRepository를 상속받습니다..
-
JPA - Common CustomRepositoryBack-end/JPA 2020. 6. 30. 17:12
CustomRepository 쿼리 메소드(쿼리 생성과 쿼리 찾아쓰기)로 해결이 되지 않는 경우 직접 코딩으로 구현 가능하도록 하는 방법입니다. 구현 방법의 순서는 아래와 같습니다. 커스텀 리포지토리 인터페이스 정의하기 인터페이스 구현 클래스 만들기 (기본 접미어는 Impl) 엔티티 리포지토리에 커스텀 리포지토리 인터페이스 추가하기 1. 커스텀 리포지토리 인터페이스 정의하기 Post Entity와 PostRepository를 생성합니다. jUnit4를 활용하여 의존성 주입이 잘 됐는지 확인하고 잘 되었다면 이상없이 테스트가 통과 될 것입니다. spring.jpa.properties.hibernate.format_sql=true logging.level.org.hibernate.type.descriptor..
-
JPA - Common QueryBack-end/JPA 2020. 6. 30. 17:10
Query 데이터를 다룰 때 사용할 쿼리를 메소드에 적용하는 방법에 대해 학습해보겠습니다. 총 3가지 방법이 있습니다. 직접 쿼리 작성하는 방법 메소드 이름 분석 위 두가지를 합친 방법 쿼리 만드는 방법 1. 메소드 이름을 분석해서 쿼리 만들기 (CREATE) 메소드 이름을 분석해서 스프링 데이터 JPA(Common)가 자동으로 쿼리를 만들어 줍니다. public interface CommentRepository extends MyRepository{ /* Comment title에 Keyword가 들어있는 모든 Comment를 찾아주는 메소드 */ List findByCommentContains(String Keyword); } 메소드 이름을 JPA가 지원하는 방식에 맞게 작성하면 자동으로 쿼리를 ..