프록시(Proxy) 객체
실제 Entity의 정보를 갖고 있는 가짜 Entity 객체. 지연 로딩을 사용해 Entity의 연관 관계로 조회하는 경우 프록시 객체를 활용한다.
: 연관된 Entity를 조회할 때, 실제 데이터를 조회해오는 것이 아니라 Entity에 대한 참조만 갖고 있는 Proxy 객체를 만듦. 그리고 실제 조회를 할 때 DB에서 조회함.
1. 프록시 객체에 실제 데이터 사용
2. 프록시 객체는 실제 Entity가 생성되어 있지 않은 경우, 영속성 컨텍스트에 실제 Entity 생성을 요청함(프록시 객체의 초기화) : org.hibernate.LazyInitializationException
3. 영속성 컨텍스트는 DB를 조회해 실제 Entity 객체를 생성
4. 프록시 객체는 생성된 실제 Entity 객체의 참조를 멤버 변수에 보관
5. 프록시 객체는 실제 Entity 객체를 이용해 결과를 반환
트랜잭션(Transaction)
데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위(더이상 분할이 불가능한 명령들의 모음)
// Entity Manager 의존성 주입
private final EntityManager em;
// Transaction 의존성 주입
private final EntityTransaction transaction = em.getTransaction();
...
void businessLogic() {
transaction.begin(); // 트랜잭션 시작
logic(em);
transaction.commit(); // 트랜잭션 커밋
}
@Transactional
어노테이션(org.springframework.transaction.annotation.Transactional;
)이 존재함!@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberService {
private final MemberJpaRepository memberJpaRepository;
public MemberGetResponse getMemberByIdV1(Long id) {
Member member = memberJpaRepository.findById(id).get();
return MemberGetResponse.of(member);
}
@Transactional
public String create(MemberCreateRequest request) {
Member member = memberJpaRepository.save(Member.builder()
.name(request.getName())
.nickname(request.getNickname())
.age(request.getAge())
.sopt(request.getSopt())
.build());
return member.getId().toString();
}
}
@Transactional
의 대표적인 속성 : readOnly@Transactional
은 Proxy 객체를 이용하기 때문에 private method 위에 선언 시 동작 X참고자료
33기 DO SOPT 서버 파트 3차 세미나 자료(배포 불가)
What are ACID Transactions?
[MYSQL] 📚 트랜잭션(Transaction) 개념 & 사용 💯 완벽 정리
정보통신기술용어해설 Integrity Constraint 무결성 제약조건