Language`(93)
-
[JPA] 조건식
1. 타입 표현 JPQL에서 타입 표현은 대소문자를 구분하지 않는다 (1) 문자 문자 타입은 작은따옴표(')로 감싸서 표현해준다 List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN 'Avenus3' AND 'Avenus6'", Member.class ).getResultList(); List resultList = em.createQuery( "SELECT m" + " FROM Member m" + " WHERE m.username BETWEEN \"Avenus3\" AND \"Avenus6\"", Member.class ).getResultList(); 이렇게 문자 타입은 큰따옴표(")로 ..
2022.08.10 -
[JPA] 서브 쿼리
※ 서브쿼리 예제 데이터 JPQL 서브쿼리 JPQL도 SQL처럼 서브쿼리를 지원하지만 모든 서브쿼리를 지원하는 것은 아니다. SELECT절 → Hibernate의 HQL에서는 허용 O / JPA 자체에서는 허용 X FROM절 → 허용 X WHERE절 → 허용 O HAVING절 → 허용 O from절에서의 서브쿼리는 JPA, Hibernate에서는 허용을 하지 않지만, JPA의 다른 구현체에서는 허용한다 1. SELECT절 서브쿼리 (Hibernate의 HQL) (1) Member별로 주문을 한 횟수 List resultList = em.createQuery( "SELECT m, (SELECT COUNT(*) FROM Order o WHERE o.member.id = m.id)" + " FROM Membe..
2022.08.10 -
[Spring] Spring Transaction
자바에서 DB에 접근하기 위해서는 "JDBC API"를 활용해서 DB에 접근할 수 있다 간단하게 DB에 접근해서 데이터를 받아오는 과정을 설명하면 다음과 같다 1. DB Connection 얻기 2. DB에 보낼 쿼리를 생성하고 Statement or PreparedStatement를 통한 쿼리 flush 3. DB에 쿼리를 보내고 그에 따른 결과 데이터들을 ResultSet을 통해서 받기 4. ResultSet에 담긴 쿼리 결과 데이터들을 원하는 형태로 parsing해서 사용 여기서 또 DB에 접근하는 방식은 3가지로 나눌 수 있다 1. 순수 JDBC 순수한 Native Query를 생성해서 DB로 날리고 그에 대한 결과를 parsing해서 사용하는 방식이다 순수 JDBC API 사용 1. SQL 생성..
2022.08.03 -
[JPA] Join
※ Join Query를 위한 테스트 데이터 내부조인 JPQL에서 기본적으로 내부 조인은 "INNER JOIN"으로 사용하고 여기서 INNER은 생략할 수 있다 회원 조회 : 팀이 Team-A인 회원 (팀에 대한 내부 조인) // INNER 명시 List result = em.createQuery( "SELECT m FROM Member m INNER JOIN m.team WHERE m.team.name = :name", Member.class ).setParameter("name", "Team-A") .getResultList(); // INNER 명시 X List result = em.createQuery( "SELECT m FROM Member m JOIN m.team WHERE m.team.nam..
2022.07.29 -
[JPA] 프로젝션 & 페이징
프로젝션 (Projection) 프로젝션이란 SELECT 절에서 조회할 대상을 지정하는 것을 의미한다 SELECT 절에서 조회할 수 있는 대상은 크게 3가지 분류로 나눌 수 있다 1. 엔티티 타입 프로젝션 엔티티 프로젝션은 말그대로 원하는 엔티티(객체) 자체를 통째로 조회하는 것이다 // Member(Entity) List members = em.createQuery( "SELECT m FROM Member m", Member.class ).getResultList(); // Team(Entity : Member -> Team) List team = em.createQuery( "SELECT m.team FROM Member m", Team.class ).getResultList(); Member와 Te..
2022.07.28 -
[JPA] JPQL 기본 문법
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...) 일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로.. cs-ssupport.tistory.com 이전에 엔티티를 쿼리하는 다양한 방법을 짧게 소개했었다. 여기서 가장 중요한 사실은 어떤 방법을 사용하든 JPQL에서부터 시작한다는 사실이다 JPQL의 특징은 다음과 같다 - 테이블을 대상으로 쿼리하는게 아닌 엔티티를 대상으로 쿼리하는 객체지향 쿼리 언어이다 - SQL을 추상화한 쿼리 언어이므로 특정 DB에 종속적이지 않..
2022.07.28 -
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...)
일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로 날릴 수 있다 (nativeQuery) -- Member 테이블의 모든 정보 가져오기 SELECT m FROM Member m 여기서 native Query와 JPA에서 생성하는 query의 차이는 다음과 같다 native query : DB의 테이블을 대상으로 쿼리 생성 JPQL : 엔티티(객체)를 대상으로 쿼리 생성 일반적인 SQL이 DB Table을 대상으로 하는 "데이터 중심의 쿼리"라면 JPQL이란 엔티티 객체를 대상으로 하는 "객체지향 쿼리"..
2022.07.27 -
[JPA] 값 타입
JPA의 데이터 타입을 큰 카테고리로 나누면 총 2개의 카테고리로 나눌 수 있다 엔티티 타입 값 타입 엔티티 타입은 말그대로 @Entity로 정의되는 객체를 의미하고, 값 타입은 단순히 값으로 사용되는 자바의 기본 타입이나 객체를 의미한다 여기서 이 두 타입의 가장 큰 차이점은 "추적의 가능성"이다 → 엔티티 타입은 "식별자"를 통해서 엔티티를 추적할 수 있지만, 값 타입은 별도의 식별자 개념이 없기 때문에 값이 바뀌어버리면 추적 자체가 불가능하다 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = G..
2022.07.22 -
[Spring] API 예외 처리
[Spring] 예외 처리 & 오류 페이지 Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블.. cs-ssupport.tistory.com 이전에는 예외가 발생했을 때 "오류 페이지"를 Client에게 내려주는 여러 방법들을 알아보았다 예외가 터지면 WAS에서 다시 "오류 페이지를 위한 REQUEST"를 보낸다 이 때 Request의 DispatcherType은 "ERROR" 하지만 서버가 앱 개발자와 통신을 하거나, 프론트엔드 API형식의 통신을 할 경우는 예외 처리가 달라진다 왜냐하면 이러한 AP..
2022.07.12 -
[Spring] 예외 처리 & 오류 페이지
Servlet 예외 처리 1. Exception Exception은 중간에서 "catch"를 통해서 잡을 수 있고, 아니면 계속 "throws"를 통해서 던질 수 있다 웹 애플리케이션은 Request마다 별도의 thread가 할당되고 이 thread는 서블릿 컨테이너 내부에서 수행된다 그런데 갑자기 예외가 터졌는데 이 예외를 잡지 않고 계속 throw를 하다가 결국 서블릿 외부까지 넘어간다면 어떻게 동작될까?? >> 최종적으로 WAS까지 전파된다 예외를 전파받은 WAS는 뒤에 설명하겠지만 예외 페이지를 Client에게 보여주기 위해서 "예외 전용 Request"를 또 다시 컨트롤러에게 요청한다 간단한 예제를 통해서 정상 흐름과 예외가 터졌을 때의 흐름을 살펴보자 LogFilter @Slf4j public..
2022.07.11 -
[Spring] 스프링 인터셉터
[Spring] Servlet "Filter" 현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야 cs-ssupport.tistory.com 이전에는 서블릿에서 제공해주는 "서블릿 필터"를 통해서 Request에 대한 필터링을 해주었다 이번에는 Spring에서 제공해주는 "스프링 인터셉터"를 알아보자 서블릿 필터 & 스프링 인터셉터 모두 웹과 관련된 "공통 관심 사항"을 처리하지만 적용되는 순서도 다르고 적용되는 방법또한 약간 다르다 Spring Interceptor Servlet Filter는 서블릿이 호출되기 전에 수문장 역할을 수행했지만..
2022.07.10 -
[Spring] 서블릿 필터
현재 Controller에 의해서 매핑되는 Page가 다음 종류가 있다고 하자 1. 로그인 하지 않고 접근 가능 2. 로그인 해야 접근 가능 >> 여기서 과연 "로그인 해야 접근 가능한 페이지"가 진짜 로그인을 해야만 접근 가능한지 확인해보자 /members/1로 접근 결과로 알수있듯이 "로그인 후 전용 마이페이지"가 로그인을 하지 않은 사용자에게도 접근이 허용되고 있다 >> "URL"에 따라서 request를 필터링할 수 있게 도와주는 기능을 Servlet에서 제공해준다 : Servlet Filter Servlet Filter Servlet Filter는 Servlet이 제공해주는 "Request Filtering" 기능이고 일단 필터의 흐름부터 알아보자 Servlet Filter는 수문장 역할을 수행..
2022.07.10