1. 스프링 프레임워크 개요
스프링(Spring) 프레임워크는 자바(JAVA) 기반의 엔터프라이즈 애플리케이션 개발을 위한 강력한 프레임워크이다. DI(의존성 주입, Dependency Injection)과 AOP(관점 지향 프로그래밍, Aspect-Oriented Programming)를 지원하여 개발자가 유지보수와 확장성이 높은 애플리케이션을 개발할 수 있도록 돕는다.
2. 스프링의 주요 기능
2.1. 의존성 주입(Dependency Injection, DI)
DI는 객체 간의 의존성을 개발자가 직접 관리하는 것이 아니라, 프레임워크가 자동으로 주입해 주는 개념이다. 이를 통해 결합도를 낮추고 코드의 유지보수를 쉽게 만들 수 있다.
DI 사용 예제
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepository();
}
}
위 예제에서 memberService() 메서드는 memberRepository()를 호출하여 MemberService 객체를 생성할 때 자동으로 주입한다.
2.2 트랜잭션 관리(Transaction Management)
스프링은 @Transactional을 사용하여 데이터베이스 트랜잭션을 자동으로 관리할 수 있다.
@Service
public class BankService {
@Transactional
public void transferMoney() {
// 트랜잭션 시작
withdraw();
deposit();
// 트랜잭션 종료
}
}
2.3 MVC 아키텍처 지원
Spring은 강력한 웹 프레임워크(Spring MVC)를 제공하며, @Controller와 @RestController를 사용하여 웹 애플리케이션을 쉽게 개발할 수 있다.
@RestController
@RequestMapping("/api")
public class UserController {
@GetMapping("/users")
public List<String> getUsers() {
return List.of("User1", "User2");
}
}
3. 스프링 빈(Spring Bean)
3.1 스프링 빈 개념
spring에서는 객체의 생성과 관리가 자동으로 이루어지는데, 이러한 객체를 **Spring Bean(스프링 빈)**이라고 한다. 스프링 컨테이너(ApplicationContext)가 빈을 관리하며, 개발자는 @Component, @Service, @Repository 등의 어노테이션을 사용하여 자동으로 빈을 등록할 수 있다.
3.2 스프링 빈 등록 방법
1) 어노테이션 기반 등록
@Service
public class UserService {
public void registerUser() {
System.out.println("사용자 등록 완료");
}
}
@Service 어노테이션을 사용하면, UserService가 자동으로 스프링 빈으로 등록된다.
2) XML 기반 등록 (구버전 방식)
<bean id="userService" class="com.example.service.UserService" />
3) Java Config 기반 등록
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
3.3 스프링 빈의 라이프사이클
스프링 빈은 객체 생성 → 의존성 설정 → 초기화 → 소멸의 과정을 거친다. @Bean을 이용해 초기화와 소멸 메서드를 지정할 수 있다.
- 객체 생성: @Component 또는 @Bean 등록을 통해 빈이 생성됨
- 의존성 주입: 생성된 빈에 필요한 의존성이 주입됨 (@Autowired 활용 가능)
- 초기화 메서드 실행: @PostConstruct 또는 initMethod 속성을 통해 초기화 작업 실행
- 사용 단계
- 소멸 단계: @PreDestroy 또는 destroyMethod 속성을 통해 종료 작업 실행
@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyBean myBean() {
return new MyBean();
}
또는 InitializingBean과 DisposableBean 인터페이스를 구현하는 방법도 있다.
public class MyBean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("빈 초기화 완료");
}
@Override
public void destroy() throws Exception {
System.out.println("빈 소멸 완료");
}
}
3.4 싱글톤과 프로토타입 스코프
스프링 빈은 기본적으로 싱글톤(Singleton) 스코프로 관리되지만, 필요에 따라 프로토타입(Prototype) 스코프로 설정할 수도 있다.
- 싱글톤(@Scope("singleton"), 기본값): 컨테이너 내에서 하나의 인스턴스만 유지
- 프로토타입(@Scope("prototype")): 요청할 때마다 새로운 인스턴스를 생성
@Component
@Scope("prototype")
public class PrototypeBean {
// 새로운 인스턴스가 매번 생성됨
}
4. AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)
AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 애플리케이션의 핵심 로직(Core Concern)과 공통 기능(Cross-Cutting Concern)을 분리하여 코드의 중복을 줄이고 유지보수를 쉽게 만드는 프로그래밍 패러다임이다.
Spring 프레임워크에서 AOP를 사용하면 로깅, 보안 검사, 트랜잭션 관리와 같은 부가적인 기능을 비즈니스 로직과 분리하여 모듈화할 수 있다. 스프링 AOP는 프록시(Proxy) 기반으로 동작하며, 런타임에 애스팩트(Aspect)를 객체에 적용한다.
4.1. AOP의 주요 개념
개념설명
횡단 관심사 | 여러 클래스에서 공통적으로 사용되는 기능 (예: 로깅, 보안) |
애스펙트(Aspect) | 횡단 관심사를 모듈화한 것 |
조인포인트(JoinPoint) | 애스펙트가 적용될 수 있는 실행 지점 (예: 메서드 실행) |
포인트컷(Pointcut) | 애스펙트가 적용될 특정 조인포인트를 정의 |
어드바이스(Advice) | 포인트컷에서 실행될 구체적인 코드 |
위빙(Weaving) | 애스펙트를 객체에 적용하는 과정 |
4.2. 스프링 AOP 구현
4.2.1. @Aspect를 이용한 AOP 적용
@Aspect
@Component
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
public void beforeMethodExecution(JoinPoint joinPoint) {
System.out.println("메서드 실행 전: " + joinPoint.getSignature().getName());
}
}
위 코드에서는 @Before 어노테이션을 사용하여 특정 패키지(com.example.service.*) 내의 모든 메서드 실행 전에 로그를 출력하도록 설정한다.
4.2.2. @Around를 이용한 실행 시간 측정
@Aspect
@Component
public class ExecutionTimeAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object measureExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long start = System.nanoTime();
Object result = joinPoint.proceed();
long end = System.nanoTime();
System.out.println(joinPoint.getSignature().getName() + " 실행 시간: " + (end - start) + " ns");
return result;
}
}
@Around 어노테이션을 사용하면 메서드 실행 전후의 로직을 제어할 수 있어 실행 시간을 측정하는 데 유용하다.
5. 스프링 컴포넌트 스캔(Component Scan)
@ComponentScan을 사용하면 특정 패키지를 스캔하여 자동으로 빈을 등록할 수 있다.
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
위 설정을 통해 com.example 패키지 내의 @Component, @Service, @Repository 등의 어노테이션이 붙은 클래스들이 자동으로 빈으로 등록된다.
6. AOP 활용 예제: 트랜잭션 관리
AOP를 활용하여 데이터베이스 트랜잭션을 관리할 수도 있다.
@Aspect
@Component
public class TransactionAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("트랜잭션 시작");
Object result = joinPoint.proceed();
System.out.println("트랜잭션 완료");
return result;
}
}
7. 마무리
이번 강의를 통해 스프링 프레임워크의 기본 개념, AOP의 활용, 스프링 빈의 라이프사이클 및 컴포넌트 스캔 등에 대해 학습하였다. AOP는 반복적인 코드를 줄이고 유지보수성을 높이는 강력한 도구.. 실무에서 아직 많이 사용해보지는 못했기 때문에 익숙해져야 할 것 같다.
이 글은 LG CNS AM Inspire Camp 1기 진행 중 Obsidian에 정리해뒀던 글을 블로그에 옮긴 글입니다.
'Experience > LG CNS AM Inspire Camp 1기' 카테고리의 다른 글
[LG CNS AM Inspire Camp] 16. Spring Security (with Session, Cookie, JWT) (0) | 2025.02.10 |
---|---|
[LG CNS AM Inspire Camp] 15. 스프링 부트와 MyBatis를 활용한 데이터베이스 연동 (0) | 2025.02.10 |
[LG CNS AM Inspire Camp] 13. 자바 실습 - 끝말잇기 게임 (with CLI) (0) | 2025.02.10 |
[LG CNS AM Inspire Camp] 12. 자바 제네릭, 컬렉션, 함수형 프로그래밍, 람다식, 스트림 (0) | 2025.02.10 |
[LG CNS AM Inspire Camp] 11. 자바(Java) 상속과 다형성, 인터페이스, 예외 처리 (1) | 2025.02.10 |