2020/08/22 스프링 강의를 들으며 정리한 내용...
아래와 같은 내용 노션(Notion) : www.notion.so/Spring-Framework-9d5d2fcafdcb4fc18de030df1797de93
스프링 프레임워크/Spring Framework
Inversion of Control
제어권이 뒤바뀜!
일반적인 (의존성에 대한) 제어권: "내가 사용할 의존성은 내가 만든다."
IoC: "내가 사용할 의존성을 누군가 알아서 주겠지"
- 내가 사용할 의존성의 타입(또는 인터페이스)만 맞으면 어떤거든 상관없다.
- 그래야 내 코드 테스트 하기도 편하지
IoC (Inversion of Control) 컨테이너
ApplicationContext (Bean Factory)
빈(bean)을 만들고 엮어주며 제공해준다.
빈 설정
- 이름 또는 ID
- 타입
- 스코프
컨테이너를 직접 쓸 일은 많지 않다.
빈 (Bean)
스프링 IOC 컨테이너가 관리하는 객체
등록하는 방법?
omponent Scanning
- @Component
- @Repository
- @Service
- @Controller
- @Configuration
- 또는 직접 XML이나 자바 설정 파일에 등록
꺼내 쓰는 방법?
- @Autowired 또는 @Inject
- ApplicationContext에서 getBean()으로 직접 꺼내기
특징
- 오로지 "빈"들만 의존성 주입을 해준다.
ETC.
@ComponentScan
- IOC 컨테이너가 만들어질때 빈에 등록할 객체들을 어느지점부터 찾을지 알려줌
→ Component Scanning
Repository는 SpringData JPA가 제공해주는 기능에 의해서 빈으로 등록됨
→ 특정 인터페이스(Repository)를 상속받고 있는 인터페이스를 찾아서 내부에서 구현체를 만들 어서 빈으로 등록함
의존성 주입 (Dependency Injection)
필요한 의존성을 어떻게 받아올 것인가!
@Autowired / @Inject를 어디에 붙일까?
- 생성자
- 필드
- Setter
AOP (Aspect Oriented Programming)
흩어진 코드를 한 곳으로 모아!
공통적으로 사용하던 코드를 따로 모아서 작성함
다양한 AOP 구현 방법
- 컴파일 : A.java —(AOP)—> A.class(AspectJ)
- 바이트코드 조작 : A.java → A.class —(AOP)—> 메모리 (AspectJ) : 클래스 로더가 클래스를 읽어서 메모리에 올릴때 조작함
프록시 패턴 (스프링 AOP) : 기존 코드 건드리지 않고 새 기능 추가하기 : link
AOP 적용 예제
@LogExecutionTime 으로 메소드 처리 시간 로깅하기
@LogExecutionTime 어노테이션 (어디에 적용할지 표기해두는 용도)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogExcutionTime {
}
실제 Aspect ( @LogExecutionTime 어노테이션 달린곳에 적용 )
@Component
@Aspect
public class LogAspect {
Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Around("@annotation(LogExcutionTime)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object proceed = joinPoint.proceed();
stopWatch.stop();
logger.info(stopWatch.prettyPrint());
return proceed;
}
}
PSA (Portable Service Abstraction)
잘 만든 인터페이스!!
환경의 변화와 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조
- POJO 원칙을 철저히 따른 Spring 의 기능으로 Spring 에서 동작할 수 있는 Library 들은 POJO 원칙을 지키게끔 PSA 형태의 추상화가 되어있음을 의미
- 외부 라이브러리들은 Spring에서 사용할 때 내부구현이 달라지더라도 동일한 인터페이스로 동일한 구동이 가능하게끔 설계되어 있으며 의존성을 고려할 필요가 없다.
스프링 웹 MVC (Model, View, Controller)
@Controller 와 @RequestMapping
스프링 트랜잭션
Platform TransactionManager
@Transactional
댓글