들어가기 전 토이 프로젝트를 하며 가장 어렵다고 느꼈던 부분은 타임리프에서 URL 링크를 적절히 사용하는 부분이었다. 어떻게 URL 경로를 걸어야 할지 굉장히 애매해서 로컬 환경에서 테스트를 하고 정상으로 확인한 후, 다른 곳으로 전파를 했다. 그런데 이렇게 충분한 테스트를 거쳤다고 하더라도, 다른 곳에서는 정상적으로 적용이 되지 않는 경우가 많았다. 가장 어려웠던 부분은 로컬 환경에서 어찌저찌 잘 걸어두었는데, 실제 AWS로 배포를 했을 때 뭔가 로컬과 다르게 작동하면서 CSS, BootStrap 같은 것들이 제대로 링크가 먹지 않는 부분이었다. 이번 포스팅에서는 그런 부분을 잘 정리해보고자 한다. Spring의 정적 리소스 제공 스프링은 /resource/static에 넣어둔 파일들을 스프링부트가 내..
이 게시글은 자바 ORM 표준 JPA 프로그래밍 책을 보고 공부한 내용을 정리한 글입니다. 영속성 컨텍스트와 1차 캐시 영속성 컨텍스트는 내부적으로 1차 캐시를 가지고 있다. 이 1차 캐시는 DB에서 가져온 엔티티를 영속화 해두는 저장소 역할을 한다. 이 저장소는 스냅샷을 만들어 더티 체킹도 하지만, PK 값으로 엔티티를 관리하기 때문에 엔티티의 비교에도 아주 유용한 기능을 제공한다. 영속성 컨텍스트가 1개 일 때, 엔티티 비교. 영속성 컨텍스트가 1개일 때 엔티티를 비교하면 어떻게 될까? OSIV 환경을 가정하고 비교해보자. 먼저 빈 영속성 컨텍스트에 PK가 1인 엔티티를 DB에서 영속화했다. 그럼 영속성 컨텍스트의 1차 캐시에 이 엔티티는 영속화된다. 그리고 이 엔티티를 A라는 변수에 참조하도록 한다..
이 게시글은 자바 ORM 표준 JPA 프로그래밍을 보고 필요한 부분을 정리한 글입니다. 스프링의 영속성 컨텍스트 기본전략 스프링의 영속성 컨텍스트 기본 전략은 트랜잭션을 시작할 때, 영속성 컨텍스트를 만든다. 그리고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하는 것이다. 따라서 트랜잭션과 영속성 컨텍스트의 생명주기는 동일하다. 스프링에서는 같은 트랜잭션 내에서는 어떤 위치에서 엔티티 매니저를 주입 받더라도 같은 영속성 컨텍스트를 관리하는 것이 보장된다. 항상 같은 엔티티 매니저가 주입되지 않을 수 있다. 그렇지만 서로 다른 엔티티 매니저가 들어오더라도 동일 트랜잭션에서는 동일 영속성 컨텍스트만을 관리하게 된다. 스프링은 쓰레드마다 서로 다른 영속성 컨텍스트를 배정한다. 따라서 멀티 쓰레드 환경에서 서로 ..
이 글은 자바 표준 ORM JPA를 읽고 정리한 글입니다. JPA 쿼리 성능 최적화 JPA는 읽기 전용 쿼리를 생성해서 조회 시, 쿼리를 좀 더 최적화 할 수 있다. 이 때의 가장 주된 효과는 1) 스냅샷을 만들지 않게 하거나 2) Flush()를 하지 않게 하면서 성능 최적화를 이끌어 낸다. 읽기전용 엔티티로 성능 최적화 1. 스칼라 타입으로 값을 불러온다. 스칼라 타입으로 엔티티를 불러오면 이 엔티티는 영속성 컨텍스트에서 관리하지 않는다. 따라서 스냅샷도 만들어지지 않고, 더티 체킹 등의 무거운 로직도 스킵된다. 2. 쿼리 힌트를 준다. 스프링 데이터 JPA에서는 @Query에 힌트를 줄 수 있고, 순수 JPA에서는 query.sethint로 읽기 전용 힌트를 줄 수 있다. ReadOnly 힌트를 주..
이 포스팅은 인프런 영한님의 강의를 복습하며 작성한 글입니다. 스프링 AOP : 프록시 기술과 한계 JDK 동적 프록시, CGLIB 동적 프록시를 이용하는 방법은 각각 장단점이 있다. JDK 동적 프록시는 인터페이스가 필수이고, 인터페이스를 기반으로 프록시를 구현한다. CGLIB는 구체를 기반으로 프록시를 구현한다. 그렇다면 JDK 동적 프록시, CGLIB 동적 프록시의 각각의 한계는 어떤 것이 있을까? JDK 동적 프록시의 한계 → 타입 캐스팅 한계 JDK 동적 프록시는 인터페이스를 기반으로 프록시 객체를 만든다. 따라서 프록시 객체는 Target 객체의 구현체 클래스에 대해서 전혀 알지 못한다. 따라서 JDK 동적 프록시 객체는 Target 객체의 구현체 클래스로 타입 캐스팅이 불가능하다. JDK 동..