1-5) 스프링 AOP(Aspect Oriented Programming) : @Aspect, @Pointcut, @Before, @After, @AfterReturning, @AfterThrowing, @Around
- AOP(Aspect Oriented Programming)란? 과거 프로그램의 규모가 커지면서 중복된 코드를 줄이고 유지보수성을 높이기 위해 OOP, 객체지향 프로그래밍이 등장하였다. 객체지향 프로그래밍은 각각의 역할을 분리하고 서로 필요할 기능을 호출하도록 하여 그 목표를 달성하였다. 웹서비스의 구조를 보면, 사용자 입장에서는 서로 다른 기능으로 보일지라도 여러 서비스와 레포지토리 객체를 공통으로 사용한다. 이렇게 공통 기능을 객체로 분리하여 코드의 재사용성을 높혔지만, 여전히 객체마다 중복해서 들어가야하는 요소들이 존재했다. 예를들어 로그의 경우, 각 객체마다 로그를 남기기 위한 별도의 코드가 삽입되어야 했다. 이렇게 각 객체를 관통하여 존재하는 중복을 제거할 필요성이 생겼다. 그리고 이를 위해 ..
1-1) 스프링 의존성 주입(DI), 제어의 역전(IoC) : @Bean, @Component, @Autowired, @Primary, @Qualifier
- 의존성 주입(Dependency Injection, DI), 제어의 역전(Inversion of Control, IoC) 이란 큰 규모의 프로젝트를 다수와 협업하여 개발하다보면 여러 문제 상황에 직면하게 된다. 규모가 커짐에 따라, 컴포넌트의 수가 많아지고, 컴포넌트들 간의 결합 역시 복잡해지게 된다. 예를 들어서 다음과 같은 코드를 보자. class UserService { private Encoder encoder; ... public UserService(Encoder encoder){ this.encoder = encoder; } ... } ... Encoder encoder = new MyEncoder(); UserService dao = new UserService(encoder); .....