공부공부

공부공부-230401

nayoon 2023. 4. 1. 18:08

스프링 데이터 JPA는 JPA를 편리하게 쓸 수 있도록 도와주는 기술

 

 

스프링 데이터 JPA가 SpringDataJpa를 구현하는 레포지토리를 알아서 스프링 빈에 올린다.

(스프링 데이터 JPA가 알아서 Hibernate 구현체를 생성해서 스프링 데이터 JPA 레포지토리에 주입하고 생성한다.)

 

이때 프록시라는 기술을 사용한다.

 

또한, 기본적으로 스프링 데이터 JPA가 제공하는 API만 사용할 수는 없기 때문에

 

메소드 명명 규칙이 있어서 해당 규칙대로 메소드를 만들 경우 스프링 데이터 JPA가 알아서 메소드를 만들어준다.

 

마치 아래와 같다.

// JPQL select m from Member m where m.name = ?
Optional<Member> findByName(String name)

// JPQL select m from Member m where m.name = ? and m.age = ?
Optional<Member> findByNameAndAge(String name, int age)

위의 메소드들은 스프링 데이터 JPA의 리플렉션 기술을 바탕으로 가능하다고 한다.

 

 

Spring Data JPA

-> 인터페이스를 통한 기본적인 CRUD 제공

-> findByName, findByEmail 처럼 메소드 이름만으로 조회 기능 제공

-> 페이징 기능 자동 제공

 

스프링 데이터 JPA는 기본적인 부분을 사용하고 복잡한 부분은 QueryDSL이나 JDBC Template를 사용하면 된다.

 

 

AOP

 

AOP가 필요한 상황은 아래와 같은 상황인데

 

실무를 하다보면 공통 관심 사항(cross-cutting concern)과 핵심 관심 사항(core concern)으로 분리할 수 있는데

 

핵심 관심 사항은 메인 로직과도 같아서 필수적으로 개발 시 들어가지만

공통 관심 사항의 경우 급하게 뭔가..메소드의 실행 시간을 원한다든가.. 로그를 찍는 등등..

 

급작스럽게 추가된 사항에 대해서 코드 수정없이 진행하고 싶을 때..

 

AOP(Aspect-Oriented Programming)

위의 그림과 같이 '시간 측정 로직'과 같이 로직을 적용하고자 하는 곳에 적용하기 위해..스프링 컨테이너가 기술을 제공한다고 한다..!

 

AOP의 경우는 @Component 애노테이션을 사용하는 것보다는 SpringConfig 파일에서 스프링 빈으로 직접 등록해서 쓰는 것을 더 선호하는데..

 

Service나 Repository의 경우는 되게 정형화된 부분이지만

AOP의 경우는 그렇지 않고 이것을 쓰는구나..! 라고 알게해서 쓰는 게 더 좋다. 

 

따라서 @Component로 스프링 빈에 등록하는 것보다는 SpringConfig 파일에 스프링 빈으로 직접 등록 후 사용하는 게 더 좋다.

 

@Around 애노테이션을 사용하게 되면 원하는 곳!을 타겟팅해줄 수 있다

 

 

스프링은 AOP를 적용할 때 아래 그림과 같이 프록시라는 기술을 사용하게 된다.

프록시란

 

스프링 컨테이너가 프록시 memberController(가짜)를 생성한 후 공통 로직을 실행하고 다시 memberController(진짜) 스프링 빈을 생성하는 것이다.

 

스프링은 프록시 방식의 AOP를 사용하는 것이 기본인데 자바에서는 아예 컴파일러 타임에 진짜 코드를 위아래로 박아넣는 방식도 있다고 한다..!

 

'공부공부' 카테고리의 다른 글

공부공부-230419  (0) 2023.04.21
공부공부-230410  (0) 2023.04.12
공부공부-230409  (1) 2023.04.10
공부공부-230320  (0) 2023.03.20
공부공부-230319  (0) 2023.03.19