spring
-
Spring 필터(Filter), 인터셉터(Interceptor), AOPSpring 2023. 3. 16. 15:34
스프링은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 스프링에서 공통된 처리를 위해 필터, 인터셉터, AOP를 사용할 수 있다. 필터(Filter) 필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞게 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되고, 디스패처 서블릿 전/후에 처리하는 것이다. 디스패처 서블릿(Displatcher Servlet) HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적..
-
N+1 Select 문제JPA 2023. 2. 14. 02:29
N+1 문제란, 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 이를 N+1 문제라고 한다. N+1이 발생하는 이유는? jpaRepository에 정의한 인터페이스 메서드를 실행하면 JPA는 메서드 이름을 분석해서 JPQL을 생성하여 실행하게 된다. JPQL은 SQL을 추상화한 객체지향 쿼리 언어로서 특정 SQL에 종속되지 않고 엔티티 객체와 필드 이름을 가지고 쿼리를 한다. 그렇기 때문에 JPQL은 findAll()이란 메소드를 수행하였을 때 해당 엔티티를 조회하는 select * from Owner 쿼리만 실행하게 되는것이다. JPQL 입장에서는 연관관계 데이터를 무시하고 해당 엔티..
-
@EntityGraphJPA 2023. 2. 14. 02:05
연관관계가 있는 엔티티를 조회할 경우 지연 로딩으로 설정되어 있으면 연관관계에서 종속된 엔티티는 쿼리 실행 시 select 되지 않고 proxy 객체를 만들어 엔티티가 적용시킨다. 그 후 proxy 객체를 호출할 때마다 그때그때 select 쿼리가 실행된다. 위와 같은 연관관계가 지연로딩으로 되어있을 경우 fetch 조인을 사용하여 여러 번의 쿼리를 한번에 해결할 수 있다. @EntityGraph는 Data JPA 에서 fetch 조인을 어노테이션으로 사용할 수 있도록 만들어 준 기능이다. 엔티티들은 서로 연관되어 있는 관계가 보통이며 이 관계는 그래프로 표현이 가능하다. EntityGraph는 JPA가 어떤 엔티티를 불러올 때 이 엔티티와 관계된 엔티티를 불러올 것인지에 대한 정보를 제공한다. Fetc..
-
@ManyToMany 사용 시 주의할 점 (List, Set)JPA 2023. 1. 25. 16:35
@ManyToMany 사용을 되도록 피해야 한다고 배웠다. 그 이유는, 개발하다 보면 연결 테이블이 단순히 연결만 하고 끝나지 않는다. 조인 테이블 자체에 주문 시간, 수량 같은 추가 데이터가 많이 들어갈 수 있다. 하지만, 매핑 정보만 넣는 것이 가능하고, 추가 정보를 넣는 것 자체가 불가능하다. 그리고 중간 테이블이 숨겨져 있기 때문에 예상하지 못하는 쿼리들이 나간다. 이러한 문제점들 때문에 실무에서는 사용하면 안된다고 한다. 해결 방법으로는, 연결 테이블용 엔티티를 추가한다. 사실상 연결 테이블을 엔티티로 승격시킨다. 그리고 @ManyToMany를 각각 일대다, 다대일로 관계를 맺어준다. JPA가 만들어주는 숨겨진 매핑테이블의 존재를 밖으로 꺼내는 것이다. 등이 있다. 나는 그럼에도 다대다 관계를 ..
-
Spring Security : Web IgnoreSpring 2023. 1. 19. 00:56
Spring Security는 기본적으로 모든 자원에 접근하는 요청에 대해서 인증, 인가를 확인해서 자원에 접근할 수 있는 경우에만 값을 내려준다. 인증, 인가를 모두 검사하는 것이 안전하지만 필요하지 않는 경우도 있다. 특정 URL에 접근했을 때, View가 랜더링 되는 시점에 URL에 접근할 수 있다는 인가를 받으면 그 화면이 바로 랜더링이 되면 된다. 그렇지만 스프링 시큐리티는 기본적으로 모든 접근에 대해서 인증, 인가를 검색하기 때문에 해당 URL을 랜더링 하는데 필요한 정적인 파일 (CSS, HTML, JS) 파일들을 모두 다시 한번 검사한다. 필요 없는 검사가 반복될 수 있기 때문에 정적인 파일에 한해서 검사를 건너뛸 수 있도록 처리해주어야 한다. Spring Security 에서는 Web I..
-
@EqualsAndHashCode, equals, hashCodeSpring 2023. 1. 18. 22:23
equals 와 hashCode란? equals 와 hashCode는 Object 클래스에 정의되어 있다. Object 클래스의 자식인 Java의 모든 객체는 Object 클래스에 정의된 equals 와 hashCode 함수를 상속받는다. equals() boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용된다. equals는 2개의 객체가 참조하는 것이 동일한지를 확인하는 것이며, 동일성(identity)을 비교하는 것이다. 즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에 동일한 객체가 된다. public boolean equals(Object obj) { return (this == obj); } 동일한 객체일지라도 서..