본문 바로가기

Spring23

[JPA] @Query annotaion 으로 직접 쿼리 작성 너무 잘되어 있는 포스트가 있어 아래에 전체 링크함. 필요한 케이스는 다 들어가있는 듯. 요약 @Query 어노테이션을 달고 일반 SQL 및 JPQL로 쿼리를 작성할 수 있다. JPQL은 JPA에서 지원하는 객체지향 쿼리 언어이다. 테이블 명 등으로 작성하는 일반 sql과 달리 JPA에서 생성한 Entity 등으로 참조한다. 함수명은 일반 JPA처럼 결정되어 있는 것이 아니라 임의작성가능(길이를 줄일 수 있다!!! 망할 JPA!!!) 기본값은 JPQL로 작성가능하고 일반 SQL로 작성하려면 옵션(nativeQuery = true, default false)을 바꿔야한다. @Query(nativeQuery = true) 예제 select * from user where id='test01' 이 문구를 적용.. 2022. 8. 4.
[querydsl] 하나의 entity를 여러번 join하고 싶을 때 QClass로 querydsl을 작성하다가 하나의 entity(테이블)을 여러번 join하는 등, n번 사용하고 싶을 때가 있다. 그럴 때, QClass에는 생성 시 variable을 지정해서 사용해야 한다. 아래처럼 서로 다른 이름을 지정한다. QPpApl ppApl = new QPpApl("ppApl"); QPpApl ppApl2 = new QPpApl("ppApl2"); QUsr usr = new QUsr("usr"); QUsr usr2 = new QUsr("usr2"); 그런데! 주의사항이 있다. 같은 entity간 중요한 것이 아니다. query를 작성하는 모든 곳에서 유일한 값이어야 한다. 즉, 저 4개의 QClass에서 서로 겹치는게 발생하면 query 수행 시 문제가 발생할 수 있다. 아.. 2022. 8. 1.
querydsl에서 Tuple 혹은 DTO로 데이터 받기 querydsl에서 보통 entity로 선언된 클래스의 변환 클래스인 QClass로 데이터를 받게 되나, DTO로 받을 수 있다. 기본적으로 Tuple로 받아서 개발자가 알아서 꺼내 쓸 수도 있겠으나, 좋은 방법이 아님에는 분명하다. DTO로 받는 방법에는 3가지가 있다. Property 접근(setter, getter) List result = queryFactory .select(Projections.bean(MemberDto.class, member.username, member.age)) .from(member) .fetch(); 필드에 직접 접근 List result = queryFactory .select(Projections.fields(MemberDto.class, member.userna.. 2022. 7. 30.
Springboot에서 커스텀 필터 추가 방법 Filter를 구현하고 @Component 어노테이션을 붙여 등록한다. import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class MyFilter implements Filter { @Override public void doFilter(ServletRequest request, Servle.. 2022. 7. 20.
OncePerRequestFilter와 Filter의 차이 요약 Filter 를 구현하여 Spring에서 커스텀 필터를 만드는 부분은 넘어가고, GenericFilterBean 이라는 추상클래스를 스프링에서 제공한다. 이것은 스프링의 설정들을 가져다 쓸 수 있거나 set도 할 수 있도록 구성되어 있다. public abstract class GenericFilterBean implements Filter, BeanNameAware, EnvironmentAware, EnvironmentCapable, ServletContextAware, InitializingBean, DisposableBean { } 두 개의 공통점은 매 서블릿마다 호출된다는 점인데, 문제는 서블릿에서 다른 서블릿으로 이동할 때 다시 필터체인을 거치면서 두 번 호출되는 경우가 있다는 점이다. 그.. 2022. 7. 20.
CORS(Cross Origin Resource Sharing) 요약 직역하자면 교차 출처 자원 공유. 사용되는 의미는, 출처가 다른 자원에 대한 공유를 허용하는 [규칙]이다. CORS 규칙을 지키지 않은 요청에 대해서 막겠다는 의미. 출처라고 하면 스킴과 호스트, 포트를 의미한다. 예를 들면 https://naver.com:8080 이다. 이 경우 https 스킴에 naver.com 호스트이며 8080 포트로 들어온 요청만 받는다는 SOP(Same Origin Policy) 규칙에서 예외 조항을 설정한다면 그게 CORS 규칙이 될 것이다. 출처를 비교하는 스펙은 기본적으로 브라우저 스펙이다. 요청이 들어오면 서버로 요청하여 응답을 받고 출처를 비교해 SOP를 어겼다면 리젝한다. 브라우저를 통하지 않은 요청을 당연히 비교하지 않는다. CORS 동작 방식 http요청을.. 2022. 7. 9.
Session, cookie, token 차이 요약 Session / Cookie 계정정보를 header에 넣는다. 세션 저장소에 정보를 저장한다. session은 서버에서 보관, cookie는 클라이언트에서 보관 발급 및 사용 절차 사용자가 로그인한다. 서버에서 사용자 정보를 이용하여 고유ID를 발급해 세션 저장소에 저장하고 그와 연결되는 세션ID를 만들어 클라이언트로 응답한다. 클라이언트는 2에서 받은 세션ID를 쿠키에 저장해 요청이 필요할 때마다 헤더에 넣어 보낸다. 서버는 쿠키를 받아 세션저장소에서 확인 후, 요청된 데이터를 응답한다. Token JWT(Json Web Token)은 인증정보를 암호화시킨 토큰을 의미한다. 사용자는 Access Token을 헤더에 실어 서버로 보낸다. 토큰은 마치 임시비밀번호처럼 동작하며, 제한 기간 내에 사용.. 2022. 7. 8.
[JPA] Entity Custom ID Generator 만들기 JPA에서 기본 시퀀스가 아닌, 개발자가 임의로 커스텀하여 아이디를 생성하는 방법 요약하자면, IdentifierGenerator 인터페이스를 구현해서 configure(), generate() 두 개의 함수를 구현 한다. configure - 외부에서 커스텀 ID 구현을 위해 설정한 파라미터 값을 가져와서 내부에 선언한 변수에 할당하는 역할(prefix, suffix 등등) generate - 커스텀한 ID를 리턴하는 역할. 보통 DB에서 시퀀스를 가져와 사용자가 지정한 형태를 입히고 리턴한다. 사용할 엔티티에 아래와 같은 형태로 GenericGenerator에 위에서 만든 클래스를 strategy에 넣고 이름을 지정한다. 파라미터로 사용자 임의 데이터를 넣는다. name이 key값으로 활용된다. Ge.. 2022. 7. 7.
@ExceptionHandler Controller 계층에서 발생하는 에러나 Exception을 잡아서 처리해주는 핸들러 역할을 한다. Service나 Repository 계층에서 발생하는 것들은 잡지 않는다. 자세한건 https://velog.io/@kiiiyeon/%EC%8A%A4%ED%94%84%EB%A7%81-ExceptionHandler%EB%A5%BC-%ED%86%B5%ED%95%9C-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC [스프링부트] @ExceptionHandler를 통한 예외처리 @ExceptionHandler는 Controller계층에서 발생하는 에러를 잡아서 메서드로 처리해주는 기능이다.Service, Repository에서 발생하는 에러는 제외한다.간단한 예시부터 살펴보자.이렇게 @Con.. 2022. 7. 2.