스프링 프레임워크의 핵심 기능
1. Dependency Injection (DI)
- 의존성이란? Inheritance (Class & Interface) 클래스보다 인터페이스를 선호하는 이유 → 수정이 더 용이하다. 그리고, 스프링을 사용하면 더욱 용이해진다. (수정해야 하는 코드가 줄어들어서)
- 스프링에서의 DI, 5가지 규칙
- 인터페이스를 이용해서 의존성을 만든다 (not Class)
- 인스턴스를 명시적으로 생성하지 않는다 (new 키워드 미사용)
- 어노테이션을 클래스에 부여한다
- 스프링 프레임워크에서 인스턴스를 생성한다 (인스턴스를 생성하려는 클래스에 어노테이션 부여; 인터페이스에는 어노테이션 불필요)(ex)) @Component, @Override, @Autowired)
- (프로그래머가) 인스턴스를 생성할 클래스에 @Component 설정
- (스프링 프레임워크는) 시작할 때 패키지를 스캔 = component scan
- (스프링 프레임워크는) 어노테이션이 있는 클래스를 추출 & 추출한 클래스의 인스턴스 생성
- 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다 (스프링 프레임워크에 의해 생성된 인스턴스를 이용하는 클래스에 참조를 받는 필드를 선얺고 필드에 @Autowired 어노테이션 부여
- Gradle Project Download해서 DI 프로그램 만들기 (패키지로 묶어주는 것 remember!)
- Interface
- Class (implement Interface & override method)
- @Component
- @Override
- Main Class
- @SpringBootApplication
- @Autowired
- New 키워드 미사용; 즉; 인스턴스 생성할 때:
- Greet greet instead of Greet greet = new Greet();
- Annotation (어노테이션): 외부 소프트웨어에 필요한 처리 내용을 전달하는 주석 (e.g. @Component)
- 사용하는 위치(레이어)에 따른, 인스턴스를 생성하는 어노테이션
- 레이어별 인스턴스 생성 어노테이션 설명 (주요 처리)
- application layer; @Controller :클라이언트와의 데이터 입출력 제어
- domain layer; @Servce :업무 처리
- infrastructure layer; @Repository :데이터베이스에 대한 데이터 영속성(Persistence Context) 담당
- 주요 처리 아닌 인스턴스 생성 어노테이션 설명 (보조 처리): @Component
- 커스텀 어노테이션
- java.lang.Annotation 인터페이스 상속 필요
- 메타 어노테이션: 커스텀 어노테이션에 정의를 추가하는 어노테이션 (@Target, @Retention, @Documented, @Inherited)
2. Aspect Oriented Programming (AOI): 관점 지향 프로그래밍
- 중심적 관심사 primary concern: 실현해야 할 기능을 나타내는 프로그램
- 횡단적/부수적 관심사 crosscutting concerns: 본질적인 기능은 아니지만, 품질이나 유지보수 등의 관점에서 반드시 필요한 기능을 나타내는 프로그램 (예: 예외 처리, 로그 정보 화면이나 파일 등으로 출력 처리, 데이터베이스의 트랜잭션 제어 등)
→ 코드를 중심적/횡단전 관심사로 분리를 함으로서, 기존 코드를 수정하지 않아도 프로그램 중에 특정 기능 (공통 처리)을 추가할 수 있다는 장점이 있다.
- AOP의 고유 용어 (Advice, Aspect, Target, JoinPoint, Pointcut, Interceptor)
- 어드바이스의 5가지 종류; ‘언제’ 실행되냐에 따라 종류가 나뉜다
- @Before→중심적 관심사가 실행되기 ‘이전’에 횡단전 관심사를 실행
- @AfterReturning→중심적 관심사가 정상적으로 종료된 후에 횡단적 관심사를 실행
- @AfterThrowing→중심적 관심사로부터 예외가 던져진 후로 횡단적 관심사를 실행
- @After→중심적 관심사의 실행 후에 횡잔적 관심사를 실행 (정상 종료나 예외 종료 드으이 결과와 상관없이 실행)
- @Around→중앙적 관심사 호출 전후에 횡단적 관심사를 실행
- 포인트컷 식: 직접 어드바이스를 만드는 경우 어드바이스 상입 대상 (패키지, 클래스, 매소드 등)을 조건으로 지정하는 방법. 와읻ㄹ드카드, execution 지시자를 사용하면 유연하게 적용 범위 지정이 가능하다.
- execution 지시자: execute(반환값 패키지.클래스.메서드(인수))
- execution( com.example.service.DemoService.(..))→DemoService 클래스의 메서드에 어드바이스를 적용합니다, 등.
- 와일드카드 (*(애스터리스크), .. (점 두 개), +(플러스))
- 스프링 프레임워크가 제공하는 AOP 기능 (@Transactional)
3. Spring Initializr
:스프링 부트에서 프로젝트를 시작할 때 통합 개발 환경 (IDE)에 의존하지 않는 프로젝틀르 만드는 방법. (IDE란? 코딩을 편히 할 수 있는 기능 (코드 자동 완성, 코드 분석, 리팩터링 등)이 탑재된 환경.)