ORM

아래 세가지 지원 기능은 제약이 커서 복잡한 실무 환경에서의 사용은 선택적으로! 1. 인터페이스 지원 - QuerydslPredicateExecutor Pageable, Sort 지원 // 리포지토리에 적용 public interface MemberRepository extends JpaRepository, CustomMemberRepository, QuerydslPredicateExecutor { ... } // 서비스에서 사용 Iterable result = memberRepository.findAll( member.age.between(10, 40) .and(member.username.eq("1"))); 한계 외부 조인 불가능 (묵시적 조인 가능) 클라이언트가 Querydsl 구현기술에 의존 2...
스프링 데이터 JPA 리포지토리로 변경 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } 테스트 @SpringBootTest @Transactional class MemberRepositoryTest { @Autowired EntityManager em; @Autowired MemberRepository memberRepository; @Test public void basicTest() { Member member = new Member("member1", 10); memberRepository.save(member); Member findMember = memberReposit..
순수 JPA 리포지토리와 Querydsl 스프링이 주입하는 em은 실제 동작 시점에 트랜잭션 단위로 진짜 엔티티 매니저를 찾아주는 프록시 엔티티 매니저임 JPAQueryFactory를 메인 어플리케이션 클래스에 Bean으로 등록하고, 리포지토리에서 주입받아도 됨 장점: @RequiredArgsConstructor 활용해 리포지토리 코드 짤 때 깔끔함 단점: 두 개를 주입받아야 하므로 테스트코드 짤 때 불편함 @Bean JPAQueryFactory jpaQueryFactory(EntityManager em) { return new JPAQueryFactory(em); } 리포지토리 @Repository public class MemberJpaRepository { private final EntityMan..
* F2: IntelliJ 오류난 곳으로 바로 이동 프로젝션과 결과 반환 - 기본 프로젝션: select 대상 지정 튜플은 querydsl 종속적인 자료형이기 때문에 repository 계층이 아닌 controller나 service 단에서는 사용 지양 다른 계층으로 넘길 때는 DTO 사용 권장 // 프로젝션 대상 하나 @Test public void simpleProjection() { List result = queryFactory .select(member.username) // 이름만 지정 .from(member) .fetch(); for (String s : result) { System.out.println("s = " + s); } } // 프로젝션 대상 여러개 @Test public voi..
기초 설정 스프링, Querydsl 버전에 따라 설정하는 법이 계속 바뀜 강의 수강 시점에서의 설정 방법: https://www.inflearn.com/chats/669477 Q파일은 gitignore Q타입 생성 확인 후 테스트 케이스로 실행 검증 h2 설치 및 설정 -> sql 로그 출력, 쿼리 파라미터 로그 출력(운영 단계에서는 성능 테스트하고 사용) # application.yml spring: profiles: active: local datasource: url: jdbc:h2:tcp://localhost/~/querydsl username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create proper..
경로 표현식 .(점)을 찍어 객체 그래프 탐색 상태 필드: 단순히 값을 저장하기 위한 필드 예: m.username 연관 필드: 연관관계를 위한 필드 단일 값 연관 필드: 대상이 엔티티, @ManyToOne, @OneToOne 예: m.team 컬렉션 값 연관 필드: 대상이 컬렉션, @OneToMany, @ManyToMany 예: m.orders 특징 상태 필드: 경로 탐색의 끝, 더 이상 탐색 불가 예: select m.username, m.age from Member m 단일 값 연관 경로: 묵시적 내부 조인 발생, 더 탐색 가능 예: select o.member from Order o 탐색 시 자바로는 .(점)만 찍으면 되기 때문에 편하지만 db에서는 조인이 일어나므로 사용 지양 컬렉션 값 연관 경..
다대일 (복습, 제일 중요!)단방향양방향일대다 (권장하지 않음)DB는 설계상 다 쪽에 외래키가 설정될 수 밖에 없다Member 객체에서 Team 객체를 탐색하는 것이 적어도 Member 쪽에 외래키 매핑하는 것을 권장(다대일 양방향 권장)@JoinColumn 사용하지 않으면 조인 테이블을 생성함 단방향// Team class@OneToMany@JoinColumn(name = "TEAM_ID")private List members = new ArrayList(); Member member = new Member();member.setUsername("member1");em.persist(member); // -> insert SQLTeam team = new Team();team.setName("TeamA..
JAVA 진영에서의 ORM 표준 기술인 JPA의 필요성은 여러 자료를 통해 머리로는 대충 알고 있었지만, 영한님 설명을 통해 좀 더 와닿게 되었다 1. 상속 Item 객체를 상속받은 Album 객체를 RDB에 저장할 때 앨범을 필드단위로 분해하여 우측의 ITEM, ALBUM 테이블에 각각 적절하게 저장해주기 위해 INSERT SQL문도 각각 작성하여 두번 날려야 한다 DB에서 ALBUM 객체를 조회할 때는 우측의 ITEM, ALBUM 테이블을 JOIN SQL문으로 묶어주고 그것을 다시 객체로 매핑해준 후 반환한다 이렇게 SQL 의존적이고 복잡한 과정을 피하기 위해 DB에 저장할 객체에는 상속관계를 사용하지 않게 된다고 한다 2. 연관관계 객체 지향적으로 모델링하는 경우에 저장할 때는 크게 문제가 없다 대..
가장 에러를 많이 만났던 주차였다. 스스로의 힘으로 리팩토링에 성공해서 원하는 결과물을 만들어냈고, 금요일부터는 새로운 팀원들과 팀플 및 개인공부를 진행중이다. 다음 주차부터는 지금까지 배운 것들을 토대로 실제 서비스와 같은 것들을 만들어 나갈텐데, 지금 내 수준 정도로 괜찮은건가? 싶기는 하지만 앞으로 계속 배워나가면 된다라며 스스로를 다독이고 있는 것 같다. 1. ORM(Object Relational Mapping) 애플리케이션의 객체와 RDB(relational database)를 연결(mapping)하는 것이다 자바는 객체로 구성하여 프로그래밍하고, RDB는 테이블로 이루어져 있으며, 애초에 이 둘은 호환을 염두에 두고 만들어진 것이 아니기 때문에 객체와 테이블을 매핑하는 것에 문제가 생길 수 ..
hjkim0502
'ORM' 태그의 글 목록