전체 글
-
Spring 필터(Filter), 인터셉터(Interceptor), AOPSpring 2023. 3. 16. 15:34
스프링은 공통적으로 여러 작업을 처리함으로써 중복된 코드를 제거할 수 있도록 많은 기능들을 지원하고 있다. 스프링에서 공통된 처리를 위해 필터, 인터셉터, AOP를 사용할 수 있다. 필터(Filter) 필터는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞게 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다. 디스패처 서블릿은 스프링의 가장 앞단에 존재하는 프론트 컨트롤러이므로, 필터는 스프링 범위 밖에서 처리 되는 것이다. 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 되고, 디스패처 서블릿 전/후에 처리하는 것이다. 디스패처 서블릿(Displatcher Servlet) HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적..
-
JVM 메모리 구조Java 2023. 3. 9. 20:05
JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부르며 자바 프로그램 실행환경을 만들어 주는 소프트웨어다. 자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다. 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다. 또한, 가비지 컬렉터를 사용한 메모리 관리도 자동으로 수행하며, 스택 기반으로 동작한다. JVM을 사용함으로써 얻는 가장 큰 이점은 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다는 점이다. C언어로 작성된 Test.c를 윈도우 컴파일러를 사용하여 컴파일하면 Test.exe가 만들어진다. 윈도우 컴파일..
-
[Effective Java] wait와 notify보다는 동시성 유틸리티를 애용하라Java 2023. 2. 14. 02:44
wait와 notify보다는 동시성 유틸리티를 애용하라 자바 5에서 도입된 고수준의 동시성 유틸리티가 이전이라면 wait와 notify로 하드코딩해야 했던 전형적인 일들을 대신 처리해주기 때문에 지금은 wait과 notify를 사용해야 할 이유가 많이 줄었다. 갖고 있던 고유 락을 해제하고, 스레드를 잠들게 하는 wait와 잠들어 있던 스레드 중 임의로 하나를 골라 깨우는 notify는 synchronized 블록이나 메소드에서 호출되어야하고, 올바르게 사용하기가 아주 까다로우니 고수준 동시성 유틸리티를 사용하자. java.util.concurrent의 고수준 유틸리티는 세 범주로 나눌 수 있다. 실행자 프레임워크, 동시성 컬렉션, 동기화 장치다. 동시성 컬렉션 동시성 컬렉션은 List, Queue, M..
-
[Effective Java] 스레드보다는 실행자, 태스크, 스트림을 애용하라Java 2023. 2. 14. 02:43
스레드보다는 실행자, 태스크, 스트림을 애용하라 책 초판의 아이템 49에서는 단순한 작업 큐(work queue) 클래스는 클라이언트가 요청한 작업을 백그라운드 스레드에 위임해 비동기적으로 처리해줬다. 작업 큐가 필요 없어지면 클라이언트는 큐에 중단을 요청할 수 있고, 그러면 큐는 남아 있는 작업을 마저 완료한 후 스스로 종료한다. 안전 실패나 응답불가가 될 여자를 없애는 코드를 추가해야 했기 때문에 코드가 길고 복잡했다. java.util.concurrent 패키지 java.tuil.concurrent 패키지가 등장하면서 더이상 위와 같은 코드를 작성하지 않아도 됐다. 이 패키지는 실행자 프레임워크라고 하는 인터페이스 기반의 유연한 태스크 실행 기능을 담고 있다. 그래서 모든 면에서 뛰어난 작업 큐를 ..
-
Open EntityManager In View 필터Spring 2023. 2. 14. 02:38
Open EntityManager In View 필터는 JPA EntityManager(영속성 컨텍스트: DB에서 읽어온 객체들을 관리하는 컨텍스트. persistent 상태인 것을 관리)를 요청을 처리하는 전체 프로세스에 바인딩 시켜주는 필더이다. 스프링부트는 기본적으로 Open EntityManager In View를 설정해준다. persistent 상태인 객체들은 트랜잭션 안에서는 객체 상태의 변경만 감지하다가 트랜잭션이 종료될 때에 DB에 반영한다. 그러므로 데이터를 변경해야하는 일이 있는 경우, 트랜잭션 내에서 관리해주어야 한다. 뷰를 랜더링 할 때 까지 영속성 컨텍스트를 유지하기 때문에 필요한 데이터를 랜더링하는 시점에 추가로 읽어올 수 있다. (지연 로딩. Lazy Loading) 엔티티 객..
-
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..
-
[Effective Java] 필요 없는 검사 예외 사용은 피하라Java 2023. 2. 6. 12:47
필요 없는 검사 예외 사용은 피하라 검사 예외를 싫어하는 자바 프로그래머가 많지만 제대로 활용하면 API와 프로그램의 질을 높일 수 있다. 결과를 코드로 반환하거나 비검사 예외를 던지는 것과 달리, 검사 예외는 발생한 문제를 프로그래머가 처리하여 안정성을 높이게끔 해준다. 물론, 검사 예외를 과하게 사용하면 오히려 쓰기 불편한 API가 된다. 어떤 메서드가 검사 예외를 던질 수 있다고 선언됐다면, 이를 호출하는 코드에서는 catch 블록을 두어 그 예외를 붙잡아 처리하거나 더 바깥으로 던져 문제를 전파해야 한다. 검사 예외 회피 방법 - 1. 비검사 예외 API를 제대로 사용해도 발생할 수 있는 예외이거나, 프로그래머가 의미 있는 조치를 취할 수 있는 경우라면 이 정도 부담쯤은 받아들일 수 있을 것이다...