본문 바로가기

반응형

분류 전체보기

(133)
[Query Dsl][JPQL] 서브쿼리 주의사항 (from문에서는 불가능) JPQL에서는 from절에서 서브쿼리를 지원하지 않는다. 따라서, Query DSL에서도 From 절에서는 서브쿼리를 사용하지 못한다. 그럼 어떻게? 서브 쿼리 ➡️ join 으로 변경 쿼리를 분리해서 2번 실행 ( 1번이 안되면) nativeSQL 사용 (2번이 안되면) Tip DB에서 데이터를 가져올 때, 딱 맞는 데이터를 짜서 데이터를 가져오기보다는 적당히 정제해서 가져오고, 애플리케이션에서 로직으로 해결하는 게 더 효율적일 수 있다. ( 굳이, 서브쿼리로 복잡하게 지지고 볶을 필요는 없다!) 출처 https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84 (김영한님 querydsl 강의)
[JPA+Spring] 개발 할 때, 신경써야할 체크리스트 1. 컨트롤러에서 요청과 응답은 Dto로 빼주자. 엔티티를 직접 노출 X 꼭 DTO를 만들어서 반환해주자. 2. 페치 조인을 활용하자 Lazy Fetch로 설계된 엔티티들을 Eager Fetch로 수정하지말고, 페치 조인을 써서 한방 쿼리로 최적화 시켜주자. N+1도 해결된다. 쿼리문에서 쿼리용 Dto로 필요한 데이터들만 명시해주면, 불필요한 데이터들은 가져오지 않아, 조금 더 최적화 시켜줄 수 있다. 3. 1 대 다 페치 조인에서는 페이징을 쓰면 안된다. ".setFirstResult(n1)" , ".setMaxResults(n2)"와 같은 페이징은 쓰면 안된다. - DB에서 가져온 뻥튀기된 데이터들이 메모리에 올라가 메모리가 가득 찰 수도 있다. 1 대 다 컬렉션 조회 시, 페이징 구현하는 방법 먼저..
[WAS] 서블렛이란? 스프링 MVC 강의를 다시 복습해보며, 정리시작... 서블릿? WAS에서 들어오는 요청에 대해 적절한 로직을 실행 후, 응답해주는 작은 프로그램(클래스) 서블릿들은 서블릿 컨테이너에서 서블릿의 생성 + 호출 + 생명주기 관리가 된다. 서블릿 객체들은 싱글톤으로 관리 (하나의 객체로 계속 재사용) 공유 변수 사용 주의! (생성 후, 모든 요청에 대해 계속 재사용하니까...) 동시 요청을 위한 멀티 쓰레드 처리를 지원 (서블렛 컨테이너에서 지원) 서블릿 컨테이너? 서블릿 컨테이너에서 서블릿의 생성 + 호출 + 생명주기 관리. 요청이 오면, 쓰레드가 적합한 서블릿을 연결시켜준다. WAS의 동작 예시 웹 브라우저 ➡️ localhost:8080/req... 로 요청 요청에서 온 데이터로 request 객체 생성..
[JPA] Named Query - 쿼리를 함수처럼 만들어보자 Named Query 쿼리에 이름을 붙일 수 있는 기능 정적인 쿼리 어노테이션 혹은 XML에 정의 애플리케이션 로딩 시점에 초기화 후 재사용함 ➡️ ‼️ 애플리케이션 로딩 시점에 쿼리를 검증할 수 있음 ‼️ 사용 예시 @Entity @NamedQuery( name = "Member.findByUsername", // 쿼리의 이름 query = "select m from Member m where m.username = :username" // 실행할 쿼리문 ) public class Member { ... } //main ... // em.createNamedQuery로 호출 List resultList = em.createNamedQuery("Member.findByUsername", Member.cl..
[JPA] 경로 표현 경로 표현식 SELECT m.username ➡️ 상태 필드 FROM Member m JOIN m.team t ➡️ 단일 값 연관 필드 JOIN m.orders o ➡️ 컬렉션 값 연관 필드 WEHRE t.name = "팀A" 상태 필드 단순히 값을 저장하기 위한 필드 연관 필드 연관관계를 위한 필드 단일 값 연관 필드 연관 관계 대상이 엔티티 컬렉션 값 연관 필드 연관 관계 대상이 컬렉션 각 경로 표현식의 특징들! 상태 필드 경로 탐색의 끝 더 이상 탐색이 안된다. 단일 값 연관 경로 묵시적 내부 조인 발생 더 깊이 탐색이 가능하다. 컬렉션 값 연관 경로 묵시적 내부 조인 발생 더 이상 탐색이 안된다. ! 중요 ! 묵시적 내부 조인의 발생을 피하는 방향으로 만들자. 왜? ➡️ 프로젝트의 크기가 커지면,..
조건식 (case, coalesce, nullif) 기본 CASE 식 case로 열고, end로 닫음 Select case when m.age = 60 then "경로요금" else "일반요금" end from Member m 단순 CASE 식 case 앞에 변수 명시 가능 select case t.name when '팀a' then '인센티브추가' when '팀b' then '인센티브감소' else '인센유지' end from Team t COALESCE 하나씩 조회 후, NULL이 아니면 반환 //m.username이 null ➡️ "이름 없는 회원"이 반환 //m.username이 not null ➡️ m.username 값 반환 SELECT COALESCE(m.username, '이름 없는 회원') FROM Member m ------REUSLT-..
즉시로딩(EAGER Loading)과 지연로딩(LAZY LOADING) 만약, 멤버 클래스와 팀 클래스가 연관관계로 매핑되어 있다고 가정하자. 이때, 조회는 아래와 같이 3가지의 경우의 수가 있다. 멤버만 조회 팀만 조회 멤버와 팀 모두 조회 //1.멤버와 팀 다 가져옴. Member member = em.find(Member.class, 1L); //2.이때도, 멤버와 팀 다 가져옴. Team team = em.find(Team.class, 2L); 지연 로딩 Lazy Loading 근데 만약, 멤버 혹은 팀 하나만 가져오고 싶다면? ➡️ 지연로딩 Lazy Loading을 사용하자! //Member class @Entity public class Member{ ... @ManyToOne(fetch = FetchType.LAZY) // 이 부분! @JoinColumn(nam..
프록시 만약, 멤버 클래스와 팀 클래스가 연관관계로 매핑되어 있다고 가정하자. 이때, 조회는 아래와 같이 3가지의 경우의 수가 있다. 멤버만 조회 팀만 조회 멤버와 팀 모두 조회 하지만, 팀과 멤버는 연관관계 매핑이 되어있어, 우리는 멤버 혹은 팀 하나만 조회하고 싶은데, 항상 한번에 양 쪽을 모두 select 쿼리를 날려 가져온다. //1. member 생성 후, 저장 Team team = new Team(); Member member = new Mmeber(); member.setName("son"); member.setTeam(team); em.persist(member); em.flush(); em.clear(); //2. member만 조회 Member member = em.find(Member.cla..