➡️ 영속성 컨텍스트의 범위는 일반적으로 HTTP 요청이 시작될 때 생성되고, 응답이 완료될 때 소멸된다. JPA에서는 @Trancational이 적용된 메서드 내에서 유지된다.
영속성 컨텍스트는 엔티티 객체를 관리하는 공간으로 엔티티 객체의 생명 주기를 관리하고 변경 감지를 통해 자동으로 DB에 반영하는 역할을 한다.
➡️ @Componet로 등록된 Bean이 어떤 범위로 관리될지 설정할 수 있다. 기본값은 Singleton으로 애플리케이션에서 하나의 인스턴스만 생성되고 DI 컨테이너가 생성될 때 한 번만 초기화 된다.
➡️ 엔티티를 조회할 때 실제 데이터를 로드하는 것이 아니라 프록시 객체가 생성된다. 실제 데이터가 필요한 시점에 영속성 컨텍스트를 통해 엔티티를 조회하고 데이터를 가져온다.
@Transactional
이 적용된 메서드가 실행될 때, 프록시 객체 동작 방식은?➡️ 트랜잭션이 적용된 메서드는 AOP 기반의 프록시 객체를 생성하여 실행된다. 메서드 실행 전 트랜잭션이 시작되며 메서드가 종료될 때 트랜잭션이 커밋되거나 롤백된다.
➡️ 트랜잭션 격리 수준 동시에 실행되는 트랜잭션 간의 데이터 격리 수준에 대한 설정이다. 기본값은 REPEATABLE READ로, 트랜잭션 동안 동일한 데이터를 읽을 수 있다. READ UNCOMITTED(커밋되지 않은 데이터 읽기 가능), READ COMITTED(커밋된 데이터만 읽기 가능), SEIALIZALBE(동시 실행 차단) 등의 격리 수준이 존재한다.
➡️ MySQL의 B-Tree 인덱스는 삽입/삭제 시 자동으로 정렬된다. B-Tree 특성에 따라 적절한 위치에 삽입되고 균형 유지를 위한 재정렬 작업이 발생한다.
ClassNotFoundException
오류가 발생하는 이유?(클래스 버전 관리/SerialVersionUID 에 대해 알고 있는지)
➡️ Java에서 객체를 직렬화할 때, 클래스의 메타데이터가 함께 저장된다. 역직렬화 시점에 데이터의 클래스 메타데이터와 일치하는 클래스를 찾을 수 없으면 ClassNotFoundException이 발생한다.
➡️ 스프링은 ComponentScan을 통해 Bean을 찾고 인스턴스를 생성한 뒤, @Autowired, @Inject 등의 애너테이션, 생성자 등을 통해 의존성을 주입한다. Bean 인스턴스를 스프링 컨테이너에 등록하고 필요에 따라 제공한다.
➡️ 도메인 객체의 상태 변화가 발생하면 이벤트가 발행된다. 이벤트 리스너가 해당 이벤트를 감지하고 처리한다.
➡️ DIP는 고수준 모듈이 저수준 모듈에 의존하지 않고 추상화에 의존하도록 인터페이스를 활용하여 의존성을 역전하는 개념이다.
저수준 모듈이 아니라 인터페이스나 추상 클래스를 참조하여 의존성을 분리한다. 인터페이스를 주입하여 고수준 모듈이 특정 구현체에 의존하지 않도록 보호할 수 있게 된다.
➡️ 레디스는 인메모리 데이터베이스로 디스크보다 빠른 속도를 제공한다. 다양한 자료 구조를 지원하여 상황에 맞게 적용할 수 있다.
➡️ 1. 버전 정보를 사용하여 충돌을 감지하는 낙관적 락
2. 하나의 트랜잭션만 데이터에 접근 가능하도록 제어하는 비관적 락
3. 다중 인스턴스 환경에서 선점을 구현하는 분산 락
➡️ 데이터 일관성, 서비스 간 통신, 로드 밸련싱, 보안 등
➡️ 1. 레디스에 로그아웃된 토큰을 저장하고 인증시 체크하는 블랙리스트 설계
2. 토큰 무효화 API 제공
3. 엑세스 토큰의 유효시간을 짧게 하고 리프레쉬 토큰 무효화