-
Inflearn Spring Framework 입문BackEnd/Spring 2023. 10. 20. 21:19
백기선님의 Spring Framework 입문 강의를 수강하며 간단히 정리한 내용입니다.
🌵 IoC
위 코드와 아래 코드를 비교해보자.
class OwnerController { private OwnerRepository repository = new OwnerRepository(); } class OwnerController { private OwnerRepository repository; public OwnerController(OwnerRepository repository) { this.repository = repository; } }
위의 코드
- OwnerController는 자기가 필요한 OwnerRepository를 직접 new로 생성해서 사용한다.
- 내가 사용할 것은 내가 만들어서 쓴다 : OnwerController는 OwnerRepository에 대한 의존성이 있다. (필요로 함)
아래 코드
- 내가 만들지 않아, 내가 관리하지 않아. 누군가가 알아서 주겠거니 : Inversion Of Control
- 필요로 하는 OwnerRepository만 필드변수로 가지고 있고, 누군가 생성자에서 넣어줄 것이라고 가정한다!
🌵 IoC Container
- Bean을 만들고 의존성을 엮어주며 제공해준다.
- OnwerController가 IoC Container에 내부 객체로 들어오고, 이 객체를 컨테이너가 만들어옴.
- OwnerRepository 객체도 만들어줌
- 실제로 직접 사용할 일은 많지 않다.
🌵 Bean
- Spring IoC 컨테이너가 관리하는 객체
- 등록방법
- Component Scanning
- @Component
- @Repository
- @Service
- @Controller
- @Component
- 직접 일일이 XML, 자바 설정파일에 등록하는 것
- @Configuration이라는 어노테이션 붙은 곳(ex : @SpringBootApplication)에 @Bean이라고 넣어야 등록 가능
- Component Scanning
- 꺼내 쓰는 방법
- @Autowired || @Inject
- ApplicationContext에서 getBean()으로 직접 꺼내거나
🌵 의존성 주입 Dependency Injection
- 의존성 주입 방법
- 생성자
- Bean이 되는 클래스에 생성자가 하나만 있고, 생성자 매개변수 타입이 bean으로 등록되어 있다면 @Autowired 없어도 주입 해줌
- 가장 권장하는 방법
- 필드
- Setter
- 생성자
🌵 AOP
- 흩어져 있는 코드를 한 곳으로 모으자 ~ SRP에 맞게 코드 짜도록 도와주는..
- 바이트코드 조작
- 프록시 패턴(스프링 AOP는 이 방법을 쓴다)
- Spring Bean만 Aspect가 될 수 있음
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LogExecutionTime { } // ----------------------------------------- @Component @Aspect public class LogAspect { Logger logger = LoggerFactory.getLogger(LogAspect.class); @Around("@annotation(LogExecutionTime)") 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 : 잘 만든 인터페이스?
- 인터페이스를 사용해서 코드를 작성
- 테스트 / 바꿔끼기 좋다
- 인터페이스 기술 자체를 바꿔도 나의 코드가 바뀌지 않는 것
Spring 에서 제공해주는 대부분의 API가 PSA이다.
- JDBC, ORM, Resources, Data Binding, Spring MVC(servlet 직접 복잡한 코드들 다 치고 하지 않으니까) 등등
🌵 Transaction
public class JpaTransactionManager extends AbstractPlatformTransactionManager
- AbstractPlatformTransactionManager 상속받은 여러 구현체가 존재.
- 구현체가 바뀌더라도 Transaction Aspect의 코드는 바뀌지 않는다.
- JpaTransactionManager, HibernateTransactionManager 등등 여러 구현체가 있고, 이들은 Bean으로 등록된다.
- PSA이면서 AOP 구현한 기능
'BackEnd > Spring' 카테고리의 다른 글
MVC 패턴 (0) 2023.10.20 Servlet에 대해서 (0) 2023.10.20 Bean Scope (0) 2022.08.28 Bean Life-Cycle Call Back (0) 2022.08.21 Spring - Domain, Java to Spring (0) 2022.08.19