본문 바로가기

Server Development/Data API

(11)
mappedBy, Cascade 단방향 : 한쪽 엔터티만 반대쪽을 아는 것. 양방향 : 서로 아는 것, 서로 참조하는 관계. -> 조회나 수정을 각각 하는가 한번에 가능한가 차이. mappedBy 배경 보통 RDBMS에서는 조인관계에 대해서 방향을 따지지 않는다. 이는 외래키를 통해 두 관계에 서로 접근이 가능하기 때문이다. 객체 관계에서는 @ManyToOne, @OneToMany @OneToOne 등을 이용해 관계를 정해서 매핑한다. (하지만 이것만 적용하면 단방향 관계가 된다.) 예를 들어, 학교-학생 관계가 있다고 가정하자. DBMS에서는 학생은 학교 아이디를 자신이 가지고 있고 이를 통해 학교에 대한 정보를 확인할 수 있다. 반대로, 학교는 학생 테이블에서 자신의 학교 아이디를 갖는 학생들을 조회할 수 있다. 하지만 객체에서는 ..
JPA - Query DSL Method Query DSL의 메서드를 정리해보고자 한다. Entity Mangager를 사용하기에 메서드가 동일하다 1. Basic Structure QUser user = QUser.user; User result = queryFactory // Select .select(user) .from(user) .where(user.userName.eq("name")) .fetchOne(); // Update .update(user) .set(user.name, "name_changed") .where(user.userName.eq("name")) .execute(); // Delete .delete(user) .where(user.userName.eq("name")) .execute(); - Delete Join은 ..
JPA - Query DSL Query DSL - SQL(관계형 DB 언어, 테이블을 대상으로 함.), JPQL(Spring과 DB를 매핑하는 Spring형 관계형 DB 언어, 객체를 대상으로 함.) 를 대신하여 JPA를 코드로 작성하는 방법 - Spring내의 객체와 매핑되는 QClass라는 객체를 생성하여 이를 기반으로 쿼리를 실행. (쉽게 생각하면 QClass는 @Entity의 복사본, 컴파일시 만들어진다.) 장점 - 컴파일시 오류를 발견 가능 (Native Query를 사용하는 경우와 JPA를 사용하는 경우는 결과적으로 SQL문을 직접 작성하는 경우가 생기거나 적어도 칼럼명 등 개발자가 작성하는 부분이 생기는데 컴파일 시 오류가 나는지 알 수 없어서 나중에 오류가 발생할 경우가 크다. 하지만 Query DSL은 오류를 컴파일..
JPA - Join 이번에는 Spring JPA에서 테이블을 조인하는 방법과 이 후 데이터를 조회하는 방법에 대해서 정리해보고자한다. 현재, 만들고 있는 API를 예시로 들어 작성해보고자 한다. 먼저, 조인을 위해서는 두 테이블의 관계를 고려하는 것이 중요하다. 단방향 : 한쪽 테이블은 한쪽 테이블을 알지만 다른 쪽 테이블은 모르는 것. 양방향 : 서로 아는 구조 양방향의 문제점 ToString, hashcode, equals 등 사용시 무한 루프로 인한 StackOverFlow의 가능성 데이터 정합성 문제 : 업데이트시 양쪽 모두 업데이트 해야한다. -> 이러한 문제를 해결하기 위해 양방향 설정시 MappedBy를 통해 관계의 주인을 설정하고 일련의 규칙을 만들어준다. 객체의 두 관계 중 하나를 연관관계의 주인으로 지정합..
Cache - Redis 백엔드에서는 여러 스레드를 통해 이미 생성된 인스턴스들로 다양한 데이터를 CRUD를 한다. 하지만 항상 모든 데이터에 대해서 데이터베이스에서 가져오는 것은 데이터베이스에 큰 부하가되며 이어져 서버에도 많은 부하를 줄 수 있다. 또한 이런 현상은 서버의 전반적인 속도를 늦추는 문제가 생긴다. 이럴 때 사용하는 것이 캐시이다. Cache - 자주 사용하는 데이터를 미리 보관해둔 임시 저장소 - 저장 공간이 적고 비용이 좀 비쌈. - 빠른 I/O 가 가능하다. 캐시를 사용하는 사례 - 자주 호출되지만 프로그램 도중에 잘 변경되지 않는 데이터 Spring boot의 캐시 - JSR(Java Specification Requests) : 자바로 만들어진 플랫폼에 대한 규격을 제안하거나 기술한 것. - JSR-10..
JPA - @Query with Spring JPA 우리는 항상 쿼리메서드를 통해서나 JPARepository에서 제공해주는 기본 메서드를 사용해 모든 데이터를 처리하기에는 한계가 있다. 데이터베이스가 복잡해질 수록 정리할 데이터가 많아질수록 또 여러가지 서비스를 하면서 결국에는 쿼리문을 작성해야하는 경우가 생긴다. 다만, MyBatis보단 기본적으로 많은 양의 쿼리문을 지원해주기에 좀 더 낫기도 하면서 결국에는 쿼리문 대신 메서드를 다 숙지해야한다는 점에서 상속 관계에 속한다. 아무튼, 이번에는 이런 경우를 대비해 JPA에서 쿼리문을 작성하는법을 적어보려고 한다. @Query - JPQL로 쿼리를 작성하는 방법 - Native Query로 작성하는 것도 지원해줌. - Spring Data JPA에서 제공 - JPQL 문법은 SQL과 유사하며 객체지향적인..
JPA - Query Method with Spring JPA 지금까지 Spring Data JPA의 JpaRepository의 기본 메서드(save() 등)를 사용하거나 JPA의 기본 메서드(persist() 등)을 사용해 DB에 CRUD를 했다. 항상 이렇게 사용하는데는 어디까지는 한계가 있다. 따라서 직접 필요한 경우에 한하여 쿼리문을 생성하는 방법에 대해서 알아보려고 한다. JPQL - Java Persistence Query Language - 테이블이 아닌 엔터티를 대상으로 하는 객체지향 쿼리 - JPA는 JPQL을 베이스로 함. - JPA가 작성하는 쿼리문을 JPQL이라고 생각하면 쉽고 이를 설정들을 통해서 각 DB에 맞는 쿼리로 변경해주는 형태임. Query Method - Spring Data JPA에서 제공 - 여전히 쿼리를 직접 짜는 것이 아닌 ..
JPA - Auditing JPA를 사용하면서 한가지 항상 해야할 것이 있다. 항상 DTO를 Entity로 바꿔주는 일이다. 이러한 과정을 거칠 때면 한가지 상황이 생길 수 있다. 예를들어 DTO는 아이디, 비밀번호로 구성이 되어있고 Entity는 아이디, 비밀번호, 생성일자, 최근 수정일자, 생성한 사람, 수정한 사람의 프로퍼티로 구성되어있다고 가정하자. MappedSuperClass 이 때, 추가적인 정보들에 대해서 또한 자주 다른 Entity 생성시에도 저런 정보가 계속 추가된다면, 하나로 묶어놓고 항상 자동으로 생성해 삽입된다면 굉장히 편할 것이다. JPA Auditing 사전적인 의미로는 감사, 감시라는 의미이다. 리스너처럼 JPA의 상황을 주시하다가 특정 동작을 수행(누가, 언제 이 엔터티에 접근했는지 변경했는지)하는 ..