Back-end/JPA
-
JPA - Common NullBack-end/JPA 2020. 6. 30. 17:07
Null 처리 Null을 처리하는 방법에 대해서 학습해봅시다. 여기서 학습할 것은 두 방법입니다. 자바 8, 스프링 데이터 2.0 부터 지원하는 Optioanl 스프링 5.0부터 지원하는 Null관련 어노테이션 이전 사용했던 코드들을 계속 사용하기 때문에 Common Interface포스팅을 참고해주시면 되겠습니다. Optional 자바 8버전 부터 지원된 기능으로 단일 값을 사용하는 경우 사용합니다. Null을 체크하는 것이 아닌 Optional 인스턴스를 체크하게 됩니다. 최신 트렌디한 방법으로 사용되고 있습니다. Optional 기능 isPresent() : 값이 있는지 없는지 확인합니다. orElse : 없는 경우 다른 대체적인 인스턴스를 리턴하게 할 수도 있습니다. orElseThrow : 없는..
-
JPA - Common InterfaceBack-end/JPA 2020. 6. 30. 17:05
Interface JpaRepository에서 자동으로 지원되는 기능들을 사용하지 않고 직접 자신이 만든 메소드를 만들고 싶을 때 두 가지 방법을 활용하여 사용합니다. 각 엔티티 클래스의 각 Repository를 생성(@RepositoryDefinition) 통일된 Repository를 생성한 후 상속(@NoRepositoryBean) 위 두 방법을 학습하기 위해선 기존 Comment 엔티티 클래스와 Repository를 활용할 것이므로 엔티티 상태 포스팅을 참고해주시면 되겠습니다. @RepositoryDefinition 내가 원하는 엔티티 클래스에 직접 메소드를 적용시킬 때 사용합니다. 클래스와 Id의 타입을 선언하면 됩니다. @RepositoryDefinition(domainClass = Commen..
-
JPA - Common RepositoryBack-end/JPA 2020. 6. 30. 17:03
Repository Repository에는 4가지의 종류가 있습니다. Common Repository : 일반적인 Marker CrudRepository : CRUD 오퍼레이션 제공 PagingAndSortingRepository : 페이지와 정렬 JPA JpaRepository : Jpa 활용시 사용 이중 Common에 해당되는 Repository를 학습해보겠습니다. 기존 Post 엔티티 클래스와 Repository를 활용할 것이므로 이전 포스팅, JPA 원리 포스팅을 참고해주시면 되겠습니다. Repository 테스트 임베디드 DB 추가 com.h2database h2 test 로컬 데이터에 간섭하지 않고 테스트를 하기 위해 테스트 H2를 추가합니다. Test 클래스 @RunWith(SpringRun..
-
JPA - JPA의 원리Back-end/JPA 2020. 6. 30. 17:01
JPA의 원리 JPA가 동작하는 원리에 대해서 학습해보겠습니다. JpaRepository 인터페이스 위 인터페이스를 사용하면 기본적인 CRUD 기능을 포함한 내장 API를 사용할 수 있습니다. @Repository가 없어도 빈으로 등록해 줍니다. JpaRepository가 없을 때 로직 @Repository @Transactional public class PostRepository { @PersistenceContext EntityManager entityManager; public Post add(Post post) { entityManager.persist(post); return post; } public void delete(Post post) { entityManager.remove(post)..
-
JPA - Query(쿼리)Back-end/JPA 2020. 6. 30. 16:59
Query JPA, Hibernate를 사용할 때는 항상 무슨 쿼리를 발생시키는지 그게 의도한 것인지 확인해야합니다. 이런 쿼리를 어떻게 적용시키는지 알아보는 시간을 가지겠습니다. JPQL (HQL) 데이터베이스 테이블이 아닌, 엔티티 객체 모델 기반으로 쿼리를 작성합니다. JPA 또는 하이버네이트가 해당 쿼리를 SQL로 변환해서 실행합니다. 참고자료 : 하이버네이트 공식문서 Post 클래스 title toString 추가 @Override public String toString() { return "Post{" + "title='" + title + '\'' + '}'; } title만 포함된 toString을 만듭니다. JpaRunner 클래스 @Override public void run(Appl..
-
JPA - FETCHBack-end/JPA 2020. 6. 30. 16:57
FETCH 연관 관계의 엔티티의 정보를 지금(Eager)혹은 나중에(Lazy) 가져올지 설정하는 기능입니다. @OneToMany : 기본값은 Lazy입니다. 매핑한 정보가 얼마나 많을지 모르기 때문입니다. @ManyToOne : 기본값은 Eager입니다. 매핑한 정보를 함께 가져옵니다. Eager Eager가 적용된 Entity 정보를 미리 다 가져와서 불필요한 조회를 더이상 하지 않습니다. Post 클래스 @OneToMany(mappedBy = "post", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, fetch = FetchType.EAGER) private Set comments = new HashSet(); 기존값은 Lazy지만 Fetch를 주어 ..
-
JPA - 엔티티 상태, CascadeBack-end/JPA 2020. 6. 30. 16:54
엔티티 상태 엔티티 상태에 따라서 데이터베이스에 반영되는 상태가 달라집니다. 상태의 종류와 그 상태를 전파하는 Cascade를 학습해보겠습니다. 엔티티 상태의 종류 Transient JPA가 모르는 상태입니다. 즉 관리하고 있는 대상이 아닙니다. new Object() 처럼 객체만 생성했을 때를 나타냅니다. Persistent JPA가 관리중인 상태입니다. Persistent 상태에서 관리하고 있던 객체가 데이터베이스에 넣는 시점에 데이터를 저장합니다. Transient상태에서 Session.save()를 통해 Persistent 상태로 넘어옵니다. Session.get(), Session.load(), Query.iterate() 등의 함수를 사용합니다. 1차 캐시 Persistent Context(E..
-
JPA - Relation Mapping(관계 매핑)Back-end/JPA 2020. 6. 30. 16:52
관계 매핑 관계 매핑에선 항상 두 엔티티가 존재해야합니다. 주종관계를 가지고 있으며 반대쪽 레퍼런스를 가진쪽이 주인 관계가 됩니다. 두 엔티티 클래스가 필요하기 때문에 기존 Account 클래스, 추가적으로 Study 클래스를 생성합니다. 여기서 Study는 Account가 Study를 다수로 생성할 수 있는 개념입니다. @Entity public class Study { @Id @GeneratedValue private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public vo..