스프링(Spring)은 Java 기반 애플리케이션 프레임워크입니다.
특별한 규약이나 요구 사항 없는 일반적인 자바 객체를 POJO라고 합니다.
Spring에서는 POJO를 사용하여 비즈니스 로직을 구현합니다.
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// Getter와 Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
IoC는 의존성 주입(DI)을 포함하는 개념으로 객체의 생명주기와 의존성을 프레임워크가 관리하는 것을 의미합니다.
즉, 객체가 자신을 생성하는 것이 아닌 외부에서 제공받는 방식으로 제어가 넘어갑니다.
이는 결합도 감소, 테스트 용이성, 유지보수성 향상의 장점이 있습니다.
IoC의 구체적인 구현 방식으로, 객체 간 의존성을 외부에서 주입하는 방식입니다.
객체 생성 및 관리의 책임을 프레임워크에 위임합니다.
final
선언 가능), 용이한 테스트, 순환 참조 방지 ↔ 코드가 복잡해질 수 있음@Service
public class UserService {
private final UserRepository userRepository;
// @Autowired (생략이 가능)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
public class UserService {
private UserRepository userRepository;
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
@Autowired
를 사용하여 필드에 직접 주입@Service
public class UserService {
@Autowired
private UserRepository userRepository;
}
AOP는 공통 관심사를 모듈화하여 코드의 중복을 줄이는 것으로,
관점을 기준으로 다양한 기능을 분리하는 프로그래밍 패러다임입니다.
Aspect : 공통 관심사를 모듈화한 단위
Join Point : Aspect 적용될 수 있는 시점
Pointcut : 특정 Join Point를 지정하는 표현식
Advice : Pointcut에 의해 지정된 Join Point에서 실행되는 코드 (Before, After, Around)
Weaving : Aspect와 비즈니스 로직을 결합하는 과정 (런타임, 로드 타임, 컴파일 타임에 이루어짐)
Proxy 기반 : Spring AOP는 주로 JDK 동적 프록시 혹은 CGLIB를 사용하여 프록시 객체를 생성, 이를 통해 접근 제어 및 부가 기능 추가
Spring 컨테이너와 통합 : Spring의 IoC 컨테이너와 쉽게 통합되어 의존성 주입과 함께 사용 가능
XML 또는 Annotation 기반 설정 : AOP 설정을 XML 파일 또는 Annotation을 통해 정의 할 수 있습니다.
트랜젝션 관리 : Spring AOP를 사용하여 method 실행을 감싸 트랜잭션이 자동으로 시작되고 종료
로깅 : 로깅 Aspect를 통해 method의 실행 전 후 자동으로 로그 기록
보안 검사 : method 실행 전 사용자의 인증 상태를 확인하는 Aspect를 적용하여 권한 없는 사용자 접근을 사전 차단
AOP를 사용하기 위해서는 아래와 같은 의존성을 추가해야합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
환경 변화에 관계없이 일관된 방식의 기술로의 접근 환경을 제공하는 추상화 구조
실제로 서비스에서 사용되는 부분만 제공하고 불필요한 정보는 제공하지 않는 것 입니다.
이는 추상화 계층을 통해 기술을 내부적으로 숨기고 개발자를 편리하게 해주는 서비스 추상화 입니다.
@Controller
어노테이션을 통해 @GetMapping
과 @PostMapping
등을,
HttpServlet
클래스의 doGet(), doPost() 등 메서드의 오버라이등 없이
어노테이션을 통한 편리한 처리가 가능한데, 이는 Spring Web MVC의 추상화 계층 덕분입니다.
또한 의존성을 <artifactId>spring-boot-starter-web</artifactId>
대신,
<artifactId>spring-boot-starter-webflux</artifactId>
를 사용하면
Tomcat 대신 Netty 기반 실행이 가능합니다.
같은 코드를 가지고 이렇게 편리하게 할 수 있는 이유는 Spring의 추상화 계층 덕분 입니다.
@Transactional
어노테이션은 범위 내 메서드가 트랜잭션이 되도록 보장하는 것입니다.
commit, rollback 등 raw한 트랜잭션 되신 추상화 계층을 통해 편리한 실행이 가능합니다.
이 때 JpaTransactionManager, DatasourceTransactionManager, HibernateTransactionManager 등 상황에 맞게 다양한 트랜잭션 매니저를 코드 수정 없이 사용 가능합니다.