[Spring] 스프링 3대요소(DI, AOP, PSA)

jdev·2022년 11월 3일
0

Spring

목록 보기
2/3
post-thumbnail

🎭 DI

  • 의존성 주입(Dependency Injection) 약자
  • 객체지향 SOLID D와 관계된 Depency Inversion Principal과 연관(의존성 역전 원칙)
  • Ioc 컨테이너(Application Context) 관리 (Bean 라이프사이클 및 Proxy 형태로 관리 가능)
  • Ioc 컨테이너 형태여서 기본값설정을 임의로 완료설정하여 Spring Boot 이점인 자동구성 손쉽게 가능
  • 의존성 분리의 이점이 있는데 단일 어플리케이션으로만 생각하면 이점에 대해 개념만 알고 체감이 안될수가 있음 (본인이 Spring 관련 라이브러리를 만들고 의존하고 버전업에 따른 비슷한 기능을 추가 구현에 따른 확정성, 교체를 하는 경험과 생각을 가져보는 전환이 필요하다고 생각)

Bean 생성 방법

  1. XML 생성방법 (Spring 3.0 이전에 해당방법만 존재)
  2. @Configuration, @Bean 생성방법
  3. @Controller, @Service, @Repository, @Component 생성방법
  • 최근 선호 방법은 2,3번 Java에서 사용하는 방법입니다

주입방법

방법설명
field기본 생성자 클래스 생성후 필드 주입으로 해당 Bean 미존재시에도 에러 전파 X
setter기본 생성자 클래스 생성후 수정자 주입으로 해당 Bean 미존재시에도 에러 전파 X
constructorSpring 진영에서 권장하는 방법 - Spring Boot 로딩시 결국에 ClassLoader를 통한 파싱으로 Bean 주입을 시도 및 생성자를 통한 생성인데 (단일 생성자 하나일시 그 해당생성자로 생성하게되는데 해당 Bean이 미존재시 객체 생성 에러가 전파되 Spring Boot 로딩 실패로 빠른 확인 가능)

관련 어노테이션

어노테이션설명
@Autowired필드, 수정자 주입시 사용 (생성자시에도 사용할수 있지만 단일 생성자일시 필수X)
@QualifierAutowired 주입시 우선순위(1: 클래스타입, 2: Bean 이름) 동일타입시 Bean 이름 명시로 주입
@ResourceResource 주입시 우선순위(1: Bean 이름, 2: 클래스타입)
@ComponentScanBean 패키지 경로 및 클래스 등록범위 설정 (filter를 사용하여 범위 세부설정 가능)
@Bean@Configuration 선언된 클래스 메서드 반환형태로 Bean 생성시도
@Configuration@Bean 사용하기위한 클래스에 선언
@LazyBean 생성시 지연생성(필자 기준으로 - 단위테스트, 라이브러리 형태로 제공해서 사용안하는 기능은 나중에 생성하는 방식이 더 나은 방법이지 않은가에 대한 판단)
@Primary같은 타입의 Bean 생성시 가장 처음 우선순위로 설정
@Order같은 타입의 Bean 생성시 우선순위 설정 (List 형태로 받아올시 순서 설정가능)
@Import해당 타입의 Bean만 등록 (필자기준 - 단위테스트, 공통모듈 개발시 사용)
@ConditionalBean 생성조건 선언 (해당 어노테이션 사용하여 @Enable*** 구성 가능), 해당 어노테이션으로 파생된 어노테이션 추가 존재(ex - @Conditionalonclass 등등)
@ScopeBean 생성 및 파괴 범위(ex: 싱글톤, 프로토타입, 세션, 리퀘스트) / Batch @StepScope, @JobScope 등 batch 전용 스코프도 존재 / (필자기준 - 프로토타입 scope 사용시 @Lookup 사용)
@LookupBean 생성 파괴 라이프사이클안에서 결국 필드에 저장되는데 싱글톤 객체에 프로토타입 타 빈주입이 불가능 하여 가능하게 하는 어노테이션 (필자기준 - factory class 생성하여 해당 메서드에 선언식으로 factory class bean 주입 받아서 메스드로 호출 생성 / interface default method로도 implement 받은 후 하면 가능하지 않을까 판단)
@DescriptionBean 설명을 나타내는 정보성 어노테이션
@RoleBean 역할 정보성 어노테이션 (3개의 값 -인프라, 어플리케이션, 보조)

참고 링크

🧵 AOP

  • 관점 지향 프로그래밍(Aspect Oriented Programming)의 약어
  • 비즈니스 로직 외 공통적으로 들어가는 부가적인 로직을 Proxy 패턴 형태로 호출
  • 단위테스트 할때 로직분리로 유용

관련 어노테이션

어노테이션설명
@Aspect@Component bean 주입 어노테이션과 같이 사용하여 관점 지향 클래스 선언
@PointCut어노테이션, 인터페이스 등 선언된 곳 설정 (해당 설정된 곳만 aop 기능 사용)
@Before호출 이전시점
@Around전체시점 / ProceedingJoinPoint(해당 시점에서만 사용가능) 사용하여 해당
@After반환후 (에러, 성공) 시점
@AfterThrowing반환후 에러 시점
@AfterReturning반환후 성공 시점

커스텀 해본 기능 (필자기준)

기능명설명
@ApiLog 기능해당 Api 호출시 로그 DB 저장(기능타입, referer, ip 등등 저장)
@ExcelTemplate 기능엑셀 양식 다운로드 (데이터 유효성, 스타일, 암호화, 데이터 포맷등의 기능)
@ExcelDownload 기능엑셀 데이터 다운로드 (스타일, 데이터 포맷, 스트리밍)

예시

@Transantional
@Cacheable
@CacheEvit
@CachePut
@PreAuthorize
@PostAuthorize
@PreFilter
@PostFilter

참고링크

🥼 PSA

  • 다른 기술로 교체가능한 추상화(Portable Service Abstraction) 약자
  • 추상화를 위한 인터페이스 사용

예시

Spring Data JPA, Spring Data MongoDB 등의 Spring Data
EhCacheCacheManager, JCacheCacheManager 등의 CacheManager

0개의 댓글