스프링 프레임워크(Spring Framework)는 Java 애플리케이션 개발에서 가장 널리 사용되는 프레임워크 중 하나로, 주로 엔터프라이즈 애플리케이션 개발을 위한 다양한 기능을 제공합니다. 스프링은 모듈화되어 있으며, 각 기능을 선택적으로 사용할 수 있어 매우 유연합니다. 스프링 프레임워크의 주요 특징은 다음과 같습니다.
스프링은 경량 프레임워크로, 복잡한 엔터프라이즈 애플리케이션에서도 간단한 설정으로 동작할 수 있습니다.
XML 설정 파일이나 애노테이션을 통해 간편하게 설정할 수 있으며, 특정 모듈만 선택적으로 사용할 수 있기 때문에 필요한 부분만 경량화된 형태로 적용 가능합니다.
스프링은 POJO를 기반으로 개발할 수 있습니다. 즉, 개발자는 특별한 클래스를 상속받거나 특정 인터페이스를 구현하지 않고도 스프링을 사용할 수 있어 기존의 Java 객체를 쉽게 재사용할 수 있습니다.(특정 기술에 종속되지 않으므로)
이를 통해 코드의 유연성과 유지보수성이 크게 향상됩니다.
스프링의 핵심 기능 중 하나는 의존성 주입입니다. 객체 간의 의존성을 코드 내에서 직접 정의하지 않고, 스프링 컨테이너가 객체 간의 관계를 설정해줍니다.
이를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 테스트 가능성을 높일 수 있습니다.
DI 방식에는 3가지가 있다. 생성자 주입, Setter주입, 필드 주입 이렇게 3가지이다.
// 생성자를 통한 의존 주입
@RequiredArgsConstructor //final이 붙은 필드에 생성자를 만들어줌, 이 애노테이션만 붙여도 의존 주입이 가능함
public class MemberService {
private final MemberRepository memberRepository;
// RequiredArgsConstructor 애노테이션을 붙이면 주석처럼 생성자를 만들지 않아도 됨
//@Autowired 생성자가 하나 있을 때 스프링이 알아서 등록을 해줌
/*public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}*/
}
Spring을 포함한 DI 프레임워크에서는 생정자 주입을 권장하고 있다. 객체의 불변성을 확보할 수 있으며, 테스트가 편리하고, final키워드와 Lombok을 활용해서 간결하게 작성이 가능하고, 순환 참조 에러를 방지할 수 있다.
아무튼 생성자 주입 방식을 사용하자!
// setter 메서드를 통한 의존 주입
@Component
public class MemberService {
private MemberRepository memberRepository;
@Autowired // Setter 주입을 위한 메서드, 스프링 4.3 버전부터는 없어도됨
// (생성자가 하나만 있는 경우나 Setter 메서드가 있는 경우, @Autowired 애노테이션이 없어도 스프링이 자동으로 주입을 처리)
public void setMemberRepository(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
}
// 필드에 애노테이션을 붙여 의존 주입
public class MemberService {
@Autowired
private MemberRepository memberRepository;
}
스프링은 AOP를 통해 핵심 비즈니스 로직과 별개로 처리해야 하는 공통된 기능(로깅, 트랜잭션 관리, 보안 등)을 분리할 수 있습니다.
이를 통해 코드 중복을 줄이고 비즈니스 로직의 가독성과 유지보수성을 높일 수 있습니다.
@Aspect
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void logBefore() {
System.out.println("Logging before method execution");
}
}
Interceptor
나 Filter
와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.Interceptor
와 Filter
는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 Advice
와 HandlerInterceptor
의 가장 큰 차이는 파라미터의 차이다.
Advice의 경우 JoinPoint
나 ProceedingJoinPoint
등을 활용해서 호출한다.
반면 HandlerInterceptor
는 Filter
와 유사하게 HttpServletRequest, HttpServletResponse
를 파라미터로 사용한다.
@Before
: 대상 메서드의 수행 전
@After
: 대상 메서드의 수행 후
@After-returning
: 대상 메서드의 정상적인 수행 후@After-throwing: 예외발생 후@Around: 대상 메서드의 수행 전/후
스프링은 선언적 트랜잭션 관리를 지원합니다. 개발자는 트랜잭션 관리를 직접 처리할 필요 없이, 애노테이션이나 XML 설정을 통해 트랜잭션을 선언적으로 관리할 수 있습니다.
이를 통해 데이터베이스 작업의 안정성을 높이고, 중복된 트랜잭션 관리 코드를 줄일 수 있습니다.
@Transactional
public void performTransaction() {
// 트랜잭션이 자동으로 관리됨
}
스프링은 다양한 모듈로 구성되어 있어, 개발자가 필요한 기능만 선택해서 사용할 수 있습니다. 주요 모듈로는 스프링 코어, 스프링 데이터, 스프링 웹(MVC), 스프링 보안(Security) 등이 있습니다.
필요한 모듈만 선택하여 프로젝트에 적용할 수 있어 유연하고 확장 가능한 애플리케이션 개발이 가능합니다.
스프링 프레임워크는 강력한 웹 애플리케이션 개발을 위한 Spring MVC를 제공합니다. MVC 아키텍처를 기반으로 웹 애플리케이션의 개발을 구조화할 수 있으며, URL 매핑, 폼 처리, 데이터 바인딩, 유효성 검사 등 다양한 기능을 제공합니다.
@Controller
public class MyController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "hello";
}
}
스프링은 JDBC, JPA, Hibernate 등 다양한 데이터 접근 기술을 쉽게 통합할 수 있는 기능을 제공합니다. Spring Data 모듈을 통해 데이터베이스와의 상호작용이 매우 간편해집니다.
데이터베이스 관련 코드를 크게 줄일 수 있으며, 선언적으로 데이터를 처리할 수 있습니다.
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
}
스프링은 단위 테스트, 통합 테스트를 위한 다양한 도구와 기능을 제공합니다. Mockito, JUnit과 같은 프레임워크와 쉽게 통합되어, 의존성 주입을 통한 모킹(Mock) 및 테스트 환경 구성을 지원합니다.
스프링 컨텍스트를 로드하지 않고도 스프링의 많은 기능을 테스트할 수 있어, 빠르고 효율적인 테스트가 가능합니다.
@SpringBootTest
public class MyServiceTest {
@Autowired
private MyService myService;
@Test
public void testServiceMethod() {
assertEquals("expectedValue", myService.someMethod());
}
}
스프링은 인증과 권한 부여를 위한 Spring Security 모듈을 제공합니다. 이 모듈을 통해 로그인, 역할 기반 접근 제어, OAuth2 등의 보안 기능을 간편하게 적용할 수 있습니다.
Spring Security는 많은 기업 애플리케이션에서 사용되는 강력한 보안 솔루션을 제공합니다.
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin();
}
}
스프링 프레임워크는 마이크로서비스 아키텍처를 지원하는 다양한 기능을 제공합니다. Spring Boot와 Spring Cloud는 클라우드 환경에서 마이크로서비스를 쉽게 배포하고 관리할 수 있는 다양한 도구와 패턴을 제공합니다.
마이크로서비스 아키텍처를 지원하기 위한 REST API, 서비스 등록 및 디스커버리, 로드 밸런싱, 분산 트랜잭션 관리 등의 기능이 포함되어 있습니다.
스프링 프레임워크는 오랜 역사와 광범위한 사용자 기반을 가지고 있어, 풍부한 문서화와 커뮤니티 지원을 제공합니다. 다양한 오픈소스 프로젝트, 서드파티 라이브러리와 쉽게 통합할 수 있으며, 문제 발생 시 도움을 받을 수 있는 리소스가 많습니다.
스프링 프레임워크는 유연성, 확장성, 모듈화 등 다양한 강점을 가지고 있어, 엔터프라이즈 애플리케이션부터 마이크로서비스까지 폭넓은 애플리케이션 개발에 적합한 프레임워크입니다. POJO 기반의 개발, 의존성 주입, AOP와 같은 기능들을 통해 복잡한 애플리케이션에서도 코드의 간결성과 유지보수성을 보장하면서 확장 가능한 구조를 제공해줍니다.
https://goddaehee.tistory.com/154 [갓대희의 작은공간:티스토리]