ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
      • 직접 일일이 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 구현한 기능 

     

     

    '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
Designed by Tistory.