BackEnd/Spring

Inflearn Spring Framework 입문

Bubbles 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
    • 직접 일일이 XML, 자바 설정파일에 등록하는 것 
      • @Configuration이라는 어노테이션 붙은 곳(ex : @SpringBootApplication)에 @Bean이라고 넣어야 등록 가능 
  • 꺼내 쓰는 방법 
    • @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 구현한 기능