빈 후처리기 일반적인 빈 등록 @Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면, 스프링은 대상 객체를 생성하고 스프링 컨테이터 내부의 빈 저장소에 등록한다. 그리고 이후에는 스프링 컨테이너를 통해 등록한 스프링 빈을 조죄해서 사용하면 된다. 빈 후처리기(BeanPostProcessor) 스프링이 빈 저장소에 등록할 목적으로 생성한 객체...
Spring Framework - 스프링이 지원하는 프록시
프록시 팩토리 스프링은 동적 프록시를 통합해서 편리하게 만들어주는 프록시 팩토리(ProxyFactory)라는 기능을 제공한다. 과거에는 상황에 따라서 JDK 동적 프록시를 사용하거나 CGIL을 사용해야 했다면, 이제는 프록시 팩토리 하나로 편리하게 동적 프록시를 생성 할 수 있다. 인터페이스, 구체 클래스별 사용 기술 프록시 팩토리는 인터페이스가...
Java - JDK 동적 프록시
JDK 동적 프록시 동적 프록시 기술을 사용하면 개발자가 직접 프록시 클래스를 만들지 않고 동적으로 프록시 객체를 런타임에 생성 할 수 있다. 또한 동적 프록시에 원하는 실행 로직을 지정하는것도 가능하다. JDK 동적 프록시 구현 JDK 동적 프록시는 인터페이스를 기반으로 프록시를 동적으로 만들기 떄문에 인터페이스가 필수 이다. public i...
Java - Reflection
Reflection 자바가 기본으로 제공하는 JDK 동적 프록시 기술이나 CGIB과 같은 프록시 생성 오픈소스 기술을 활용하면, 프록시 객체를 동적으로 만들어 낼 수 있다. 이러한 JDK 동적 프록시 기술이나 CGIB을 이해하기 위해선 리플렉션이라는 기술이 필수이다. 리프렉션은 클래스나 메소드의 메타정보를 동적으로 획득하고, 코드를 동적으로 호출할...
Java - ThreadLocal
ThreadLocal 쓰레드 로컬은 해당 쓰레드만 접근할 수 있는 특별한 저장소를 말함. 간단한 예로 들면 물건 보관 창구와 비슷함. 여러 사함이 같은 물건 보관 창구를 사용하더라도 창구 직원은 사용자를 인식하여 사용자별로 확실히 물건을 구분해 줌. 즉, 사용자A, 사용자B 모두 창구 직원을 통하여 물건을 보관하고 꺼내지만 창구 직원이 사용자에 따라...
QueryDSL - 중급 문법
프로젝션과 결과 반환 - 기본 프로젝션 : select 대상 지정 List<Tuple> result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username...
QueryDSL - 기본 문법
기본 QTypq 활용 //별칭 직접 지정 QMember qMember = new QMember("m"); //기본 인스턴스 사용 QMember qMember = QMember.member; //기본 인스턴스를 static import와 함께 사용 import static study.querydsl.entity.QMember.*; @Test ...
Spring Data JPA - 스프링 데이터 JPA 구현체 분석
스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleJpaRepository @Repository @Transactional(readOnly = true) public cl...
Spring Data JPA - 확장 기능
사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야하는 기능이 너무 많음 스프링이 생성해주는 구현이외에 사용자가 직접 구현하고자 할 때는 다음과 같은 방멉이 있음. // 사용자 정의 인터페이스 public i...
Spring Data JPA - 쿼리 메소드 기능
메소드 이름으로 쿼리 생성 메소드 이름을 분석해서 JPQL 쿼리 실행 public interface MemberRepository extends JpaRepository<Member, Long> { // 이름이 username과 같고 나이가 age 보다 많은 Member의 리스트 반환 List<Member> findB...