본문 바로가기

분류 전체보기

(147)
Querydsl 중급 프로젝션: select의 대상 지정 (차원이 줄어듬) List result = quertFactory.select(member.username).from(member).fetch(); 프로젝션 대상이 둘이상이면 튜플(가급적 리포지토리 계층안에서만 사용)이나 DTO로 조회(권장) List result = quertFactory.select(member.username, member.age).from(member).fetch(); 프로젝션과 결과반환 - DTO 순수 JPA에서 DTO 조회할때는 new 명령어로 패키지 명까지 적어줘야함(귀찮음) Querydsl 빈생성 방식 -프로퍼티 접근(setter) List result = queryFactory .select(Projections.bean(MemberDt..
Querydls 기본 use_sql_comments: true 추가시 Querydls이 어떻게 JPQL로 바뀌는지 주석으로 확인 가능 검색 조건 쿼리 member.username.eq("member1") // username = 'member1' member.username.ne("member1") // username != 'member1' member.username.isNotNull() // 이름이 is not null member.age.in(10, 20) // age in (10, 20) member.age.notIn(10, 20) // age not in (10, 20) member.age.between(10, 30) // between 10, 30 member.age.goe(30) // age >= 30(grea..
스프링 데이터 JPA 메소드 이름만으로 쿼리 생성 기능(강력함): 간단한 쿼리들 해결가능 findByLastnameAndFisrtname -> where x.lastname = ?1 and x.fisrtname = ?2 findByFirstname(Is) -> where x.fisrtname = ?1 findByStartDateBetween -> where x.startDate between ?1 and ?2 findByAgeGreaterThanEqual -> where x.age >= ?1 findByFirstnameLike -> where x.firstname like ?1 findByFirstnameContaining -> where x.firstname like ?1 ('%member%') findByAgeOrderB..
JPA 활용(2) 팁 정리 @ResponseBody 데이터 자체를 Json으로 보냄 @Valid 엔티티를 검증함 엔티티가 바뀌면 API 스펙도 같이 바껴버림 -> 엔티티를 바로 쓰는것이 아니라 API 스펙에 맞춰서 별도의 DTO 클래스로 해결 -> 안정적인 운영가능 엔티티는 노출이 안되는 방향으로 설계 해야함 의존관계는 Controller -> Service -> Repository 이런식으로 한방향으로 흘러야함(단방향) Repository는 가급적 순수한 엔티티를 다루는 용 복잡한 api 화면처리는 따로 QueryRepository화 시켜서 클래스로 만듬(구별) -> 유지, 보수 DTO 안에서도 엔티티가 있으면 그것까지 DTO로 바꾸어야함 (겉과 속이 같이) 일대다(컬렉션)를 페치 조인 하는 순간 페이징이 불가함(데이터가 뻥튀기..
JPA 활용(1) 팁 정리 build.gradle 에 implementation 'org.springframework.boot:spring-boot-devtools' 추가시 리컴파일만 다시해주면 서버다시 띄울필요없이 새로고침 가능 처음 프로젝트를 만들때 Execution failed for task ':test'. ctrl+alt+s를 눌러 settings에 들어가서 테스트구동을 Gradle -> intellij로 바꿔줘야 함 @Transactional 이 테스트에 있으면 롤백됨 롤백 안되게 하려면 @RollBack(false) 쿼리의 (?, ?)을 보고싶을때 일단 yml 파일을 수정 추적 가능 org.hibernate.type : trace 아예 (?, ?)를 속성으로 대체하고 싶을때(파라미터 바인딩): 개발중에 눈에 안보이면 ..
객체 지향 쿼리 언어_중급 경로 표현식 -점을 찍어 객체 그래프를 탐색하는 것 select m.username (상태 필드) from Member m join m.team t (단일 값 연관 필드) join m.orders o (컬렉션 값 연관 필드) where t.name = '팀A' -상태 필드(state field): 단순히 값을 저장하기 위한 필드 -연관 필드(association field): 연관관계를 위한 필드 -단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 -컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 경로 표현식 특징 -상태 필드: 경로 탐색의 끝, 탐색 못함 -단일 값 연관 경로: 묵시적 내부 조인(inner join) 발생, 탐색 O -묵시적은..
객체 지향 쿼리 언어_기본 JPQL -JPA를 사용하면 엔티티 객체를 중심으로 개발 -문제는 검색 쿼리 -모든 데이터를 객체로 변환해서 검색하는것은 불가능 -검색 조건이 포함된 SQL이 필요 -JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어 제공 -JPQL은 엔티티 객체를 대상으로 쿼리 -SQL을 추상화해서 특정 데이터베이스 SQL에 의존X -동적 쿼리를 위해 QueryDSL 사용 JDBC 직접사용 하거나 SpringJdbcTemplate 사용 -JPA를 사용하면서 JDBC 커넥션을 직접 사용하거나, 스프링 JdbcTemplate, 마이바티스등을 함께 사용가능 -단, 영속성 컨텍스트를 적절한 시점에 강제로 플러시 필요(JPA와 관련이 없기 때문임) JPQL 문법 select_문 :: = select_절 from_절 [..
기본값 타입, 임베디드 타입 JPA의 데이터 타입 분류 -엔티티 타입 -@Entity로 정의하는 객체 -데이터가 변해도 식별자로 지속해서 추적가능 -값 타입 -int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본타입이나 객체 -식별자 없으므로 변경시 추적 불가 값 타입 분류 -자바 기본타입(int, double) -래퍼 클래스(Integer, Long) -String -임베디드 타입(embedded type, 복합 값타입) e.g. 좌표등 커스텀 데이터 -컬렉션 값타입(자바 컬렉션) 기본값 타입 -생명주기를 엔티티에 의존 (e.g. 회원 삭제시 싹다 삭제됨) -값 타입은 공유 X 임베디드 타입 -새로운 값타입을 직접 정의 -주로 기본값타입을 모아서 만들어서 복합값 타입 값 타입 사용법 -@Embeddable:..