본문 바로가기

Java

(47)
QueryDSL 기능 QueryDSL의 **Predicate** 인터페이스로 조건문을 여러개를 구성하여 따로 관리할 수 있다. findOne(Predicate), findAll(Predicate) 주로 이 2개 메소드가 사용된다. findOne = Optional 리턴 findAll = List | Page | Iterable | Slice 리턴 Type Safe 기능 조건문 구성시에 사용되는 객체, 필드 조건이 실제 타입과 일치한지 체크해준다. 장점 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다. 자동 완성 등 IDE의 도움을 받을 수 있다. 동적인 쿼리 작성이 편리하다. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다. 원리 QueryDSL 의존성을 추가..
정렬 컬럼값으로 정렬하기 sort class사용 Sort sort1 = Sort.by("name").descending(); // 내림차순 Sort sort2 = Sort.by("password").ascending(); // 오름차순 Sort sortAll = sort1.and(sort2); // 2개이상 다중정렬도 가능하다 Pageable pageable = PageRequest.of(0, 10, sortAll); // pageable 생성시 추가 컬럼이 아닌 값으로 정렬 // 아래와 같이 AS user_password 로 Alias(AS) 를 걸어주면 @Query("SELECT u, u.password AS user_password FROM user u WHERE u.username = ?1") List..
원하는 값만 쿼리로 가져오기 이전에 jpql로 원하는 값만 가져왔었는데, 다음과 같은 방법도 가능하다. @Repository @Transactional public class MyRepositoryImpl implements MyRepository { @Autowired EntityManager entityManager; @Override public List findNameAll() { return entityManager.createQuery("SELECT u.username FROM User AS u", String.class).getResultList(); } }
delete() 메서드 최적화 Spring data jpa의 delete() 메서드는 바로 삭제 쿼리를 날리지 않고 cascade, orphanRemoval 에 의한 자식도 삭제가 누락되지 않도록 영속성 상태인지 확인해서 영속성 컨텍스트에 없다면(!em.contains(entity)) 엔티티를 조회해서 영속성 상태로 바꾼다. 때문에 JpaRepository 의 delete() 는 해당 엔티티를 바로 삭제하지 않고, remove() 메소드를 통해 remove 상태로 바꾼다. 데이터를 영속 상태로 바꾸지 않고 바로 삭제 쿼리를 날리고 싶으면 다음과 같이 써주면 된다. @Repository @Transactional public class MyRepositoryImpl implements MyRepository { @Autowired En..
Repository 기능 제한 1.@RepositoryDefinition 을 인터페이스에 붙이는법 @RepositoryDefinition(domainClass = Comment.class, idClass = Long.class) public interface CommentRepository { Comment save(Comment comment); List findAll(); } 2.@NoRepositoryBean 인터페이스로 한번더 감싸는법 @NoRepositoryBean public interface MyRepository extends Repository { E save(E entity); List findAll(); } 일반적으로 1번 방법을 더 많이 쓴다고 한다.
Cascade와 orphanRemoval Cascade 사용 위치 연관관계의 주인 반대편 - 부모 엔티티(다대일에서 일) 즉, @OneToMany 가 있는 쪽 또는 @OneToOne 도 가능 예를들어, 게시글과 첨부파일이라면 일에 해당하는 게시글에 설정한다. 사용 조건 양쪽 엔티티의 라이프사이클이 동일하거나 비슷해야한다. 예를들어, 게시글이 삭제되면 첨부파일도 같이 삭제 되어야 한다. 대상 엔티티로의 영속성 전이는 현재 엔티티에서만 전이 되어야 한다. (다른곳에서 또 걸면 안됨) 예를들어, 첨부파일을 게시글이 아닌 다른곳에서 영속성 전이를 하면 안된다. 옵션 종류 ALL : 전체 상태 전이 PERSIST : 저장 상태 전이 REMOVE : 삭제 상태 전이 MERGE : 업데이트 상태 전이 REFERESH : 갱신 상태 전이 DETACH : 비영..
복합키 사용하기 Spring jpa에서 복합키를 사용하기 위한 방법은 두가지가 있다. 1. @Idclass 사용 UserChannel.java @Entity @IdClass(UserChannelId.class) public class UserChannel { .... @Id @ManyToOne @JoinColumn(name = "user_id") User user; @Id @ManyToOne @JoinColumn(name = "channel_id") Channel channel; ... } UserChannelId.java @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class UserChannelId implements Serializable {..
Exception 의 종류 예외 클래스 (Checked Exception vs Unchecked Exception) Trowable을 상속받는 클래스는 Error와 Exception이 있다. Error는 시스템 레벨의 심각한 수준의 에러이기 때문에 시스템에 변화를 주어 문제를 처리해야 하는 경우가 일반적이다. Exception은 개발자가 로직을 추가하여 처리할 수 있다. Exception은 RuntimeException 과 같은 수많은 자식클래스를 가지고 있다. RuntimeException은 CheckedException과 UncheckedException을 구분하는 기준이다. Exception의 자식 클래스 중 RuntimeException을 제외한 모든 클래스는 CheckedException이며, RuntimeExceptio..
Transaction 트랜잭션은 데이터베이스에서 데이터에 대한 하나의 논리적 실행단계 이며 ACID (원자성, 일관성, 고립성, 지속성)는 데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어이다. 출처 - https://ko.wikipedia.org/wiki/ACID 즉, 트랜잭션은 하나의 최소 단위의 작업에 여러가지 데이터 변경을 넣으면, 모두 저장되거나, 아무 것도 저장되지 않거나를 보장한다. 만약, A계좌에서 B계좌로 20만원을 보낸다고 가정했을때, A 계좌 잔고 200,000 원 이상 확인 A 계좌 잔고: 1,000,000 원 A 계좌 잔고 200,000 원 금액 감소 A 계좌 잔고: 800,000 원 (1,000,000 원 - 200,000 원) B 계좌 잔고 200,000 원 금액 ..
정규화 정규화의 목적은 중복 데이터를 없애고 관계를 단순하게 가지게 하는 것이다. 제1정규화: 원자성 원자성은 테이블의 컬럼이 원자값, 즉 하나의 값만 갖도록 테이블을 분해하는 것이다. 제2정규화: 완전 함수적 종속 (부분 종속 제거) 제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미한다. 완전 함수 종속이란 것을 봤을때 용어만 놓고 보면 이해가 되지 않는다. 일단 완전 함수적 종속은 기본키가 복합키일때 적용해야하는 것으로 이해하고 표를 그려보았다. 사이트 영화이름 장르 평점 네이버 아바타:물의 길 SF 8.8 다음 아바타:물의 길 SF 7.9 다음 영웅 드라마 8.9..