전체 글 55

트랜잭션의 EntityManager 관리방법과 Bean으로 주입받는 EntityManger의 관리방식

1. 트랜잭션의 EntityManager 관리방법서비스 단에 @Transactional이 붙은 메서드 호출이 되면 Spring AOP 프록시가 요청을 가로채고, TransactionIntercepter를 호출한다.이 TransactionIntercepter에는 invoke 메서드가 위와 같이 구현되어 있다. 내부적으로 invokeWithinTrasaction 메서드를 실행시키고 이 내부를 들여다 보면위와 같은 코드가 들어있다.위 코드는 내부적으로 TransactionManager를 사용하며, jpa의 경우 JpaTransactionManager를 사용한다.그리고 JpaTransactionManager는 내부적으로 트랜잭션을 시작하기 위해 doGetTransaction() 메서드를 호출한다. doGetTr..

Spring 2025.02.22

EntityManagerFactory, EntityManager, 영속성 컨텍스트와 영속성 컨텍스트의 특징

[목차]EntityManagerFactory란?EntityManager란?영속성 컨텍스트란?영속성 컨텍스트의 생명주기영속성 컨텍스트의 주기능영속성 컨텍스트의 특징트랜잭션 안이 아니면 영속성 컨텍스트로 관리되지 않는다.영속성 컨텍스트는 Map으로 관리되며 key는 기본키를 사용한다. [본론]EntityManagerFactory란?EntityManagerFactory란 EntityManager를 생성하는 역할을 한다.Spring Application이 실행될 때 딱 한번만 생성되며, 이 후 EntityManager가 필요하면 같은 EntityManagerFactory를 사용하여 생성한다.딱 한 번만 생성하는 이유는 생성비용이 크기 때문이다.한 EntityManagerFactory는 여러 EntityManag..

Spring 2025.02.22

영속성 컨텍스트의 1차 캐시는 어떻게 저장될까?

영속성 컨텍스트의 1차 캐시1차 캐시는 Map 형태로 관리된다.이는 Hibernate의 PersistenceContext 의 구현체인 StatefulPersistenceContext 에서 찾아볼 수 있다.entitiesByKey 필드 등을 보면 PK를 Key로 Object(엔티티)를 value로 관리하는 것을 볼 수 있다. 그리고 이 Key는 기본키를 저장한다따라서 findById가 호출되면 내부적으로 우선 Map을 확인해 엔티티가 존재하는 지 확인하며, 있으면 Map에서 반환한다. 없으면 DB를 조회하여 Map 저장하고 엔티티를 반환한다. 만약 findByName() 등을 통해 조회하면 Name은 기본키가 아니므로 DB에서 조회해오게 된다. DB에서 조회해온 후에는 조회한 ID를 통해 같은 엔티티가 영..

Spring 2025.02.22

@Transactional 내에서가 아니여도 OSIV가 on이면 조회한 데이터들이 같은 영속성 컨텍스트를 공유하는 이유

[서론]스프링에서는 트랜잭션이 시작되면 AOP 코드에 따라 내부적으로 EntityManager를 사용해 영속성컨텍스트를 만들어, 한 트랜잭션 내에서는 같은 영속성컨텍스트를 공유하게 끔 동작합니다. 진짜 그럴까 테스트해보면, 종종 @Transactional이 붙지 않았는데도 데이터들이 한 영속성 컨텍스트에서 공유되는 것을 볼 수 있습니다. 예를 들어 다음과 같이 id가 1인 객체를 두 번조서론]스프링에서는 트랜잭션이 시작되면 AOP 코드에 따라 내부적으로 EntityManager를 사용해 영속성컨텍스트를 만들어, 한 트랜잭션 내에서는 같은 영속성컨텍스트를 공유하게 끔 동작합니다.   진짜 그럴까 테스트해보면, 종종 @Transactional이 붙지 않았는데도 데이터들이 한 영속성 컨텍스트에서 공유되는 것을..

Spring 2025.02.22

트랜잭션 격리수준과 락

[트랜잭션]트랜잭션이란 작업의 완전성을 보장해주는 것.즉 특정 트랜잭션 안에서 여러 쿼리를 실행했다면 모두 성공하거나 모두 실패함을 보장한다. 트랜잭션의 범위는 최대한 좁혀야 좋다.실제 DB 커넥션은 개수가 적고, 트랜잭션 안에서 메일전송등을 한다면 커넥션이 남아돌지 않을 것이다.또한 같이 묶여야하는 쿼리가 아니라면 트랜잭션은 분리하는 것이 좋다.[트랜잭션에서 발생할 수 있는 무결성 문제]무결성 문제에는 크게 3가지가 있다.이는 트랜잭션의 각 격리수준에 따라 발생할 수 있는 문제이다.Dirty ReadPhantom ReadNon-Repeatable Read1. Dirty ReadDirty Read란 아직 커밋되지 않은 데이터를 읽어 발생할 수 있는 데이터 무결성 문제.(여기서 커밋이란 트랜잭션 안의 모든..

데이터베이스 2025.02.21

@Profile과 @ActiveProfile

@Profile과 @ActiveProfileapplication.properties or yml에서 어떤 프로필을 사용할 지 결정할 수 있다.spring.profiles.active=dev,local 이라고 명시하면 dev 프로필과 local 프로필을 사용하게 된다.반면 Spring 코드 내에서 운영 환경에 따라 다른 빈을 주입해야 할 수도 있다.메인 환경에서는 RedisMainConfig를 개발환경에서는 RedisDevConfig를 사용해 서로 다른 캐시를 사용해야 할 수도 있다.또한 테스트 환경에서는 특정 프로필과 다른 프로필을 사용해야 할 수있다.이럴 경우 @Profile 혹은 @ActiveProfile을 사용할 수 있다.1. @Profile@Profile은 환경에 따라 Bean의 로딩을 다르게 할..

Spring 2025.02.20

LazyInitializationException과 LazyLoading의 동작원리

@Transactional이 붙지 않은 메서드 내에서 LazyLoading된 필드를 접근 시 하이버네이트가 LazyInitializationException을 발생시킨다.왜냐하면 Lazy Loading이 동작하려면 영속성 컨텍스트가 필요하지만, 이게 닫혀있기 때문이다.그럼 Hibernate는 어떻게 이를 알아챌까?Lazy Loading의 동작과정LazyLoading은 프록시 객체를 사용해서 동작한다.특정 엔티티가 LazyLoading이 붙은 필드가 있다면, Hibernate는 이 엔티티의 프록시 객체를 생성한다.class Room$HibernateProxy extends Room { private List places = new PersistentBag(); // Lazy Loading Proxy}..

Spring/Spring Jpa 2025.02.19

Spring에서의 예외, 에러 처리

Spring을 사용하다가 @RestControllerAdvice 를 사용하지 않으면 Spring에서 어떻게 예외를 처리하는 지 궁금해졌다. 그래서 이에 대해 알아보고자 한다.Spring의 기본 예외 핸들링1. BasicErrorControllerSpring의 기본 예외 처리는 공식 문서를 통해 알 수 있었다.기본적으로 모든 예외가 발생하면 /error 경로로 Spring이 재요청하여 기본적으로 등록되어 있는 BasicErrorController에서 예외 응답을 반환한다고 한다. 컨트롤러에서 BasicErrorController로의 예외 전달Spring Boot에서 예외가 발생되고, @RestControllerAdvice 및 @ExceptionHandler 에서 예외가 처리되지 않으면 에러가 처음 요청을 ..

Spring 2024.11.02

XSS(Cross-Site Scripting)이란?

목차XSS(Cross-Site Scripting)란?XSS의 세 가지 유형XSS(Cross-Site Scripting)란?XSS란 크로스 사이트 스크립팅, 사이트 간의 스크립팅을 의미한다.웹 애플리케이션의 취약점을 악용해 악성 스크립트를 다른 사용자에게 삽입하는 공격 기법이다.공격자가 신뢰할 수 있는 사이트에 악성 코드를 삽입하면, 이 웹 페이지를 이용하는 사용자는 자신도 모르게 악성 스크립트가 실행될 수 있고, 이 때 사용자 쿠키, 세션 정보, 민감 데이터가 탈취당할 수 있다. 악성 스크립트를 삽입한다는 게 무슨 뜻일까?더보기악성 스크립트를 삽입한다는 것은 공격자가 웹 페이지에 원래는 없던 자바 스크립트를 포함시키는 것을 의미한다. 예를 들어 다음과 같은 방법들로 삽입할 수 있다. 1. 사용자 입력을 ..

보안 2024.10.23