스프링 프레임워크

스프링의 핵심 가치
애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것
스프링 부트 (Spring Boot)
스프링 애플리케이션을 복잡한 설정 없이 빠르게 작성하는 기능 제공
스프링 프로젝트
• 스프링 MVC (Spring MVC)
웹 애플리케이션을 간단하게 생성하는 기능 제공
• 스프링 데이터 (Spring Data)
데이터 접근에 관한 기능 제공
• 스프링 배치 (Spring Batch)
배치 처리 기능 제공
• 스프링 시큐리티 (Spring Security)
인증/허가 기능 제공
스프링 코어
• 스프링 DI (Spring DI)
의존성 주입 (Dependency Injection) 기능 제공
• 스프링 AOP (Spring AOP)
관점 지향 프로그래밍 (Aspect Oriented Programming) 기능 제공
스프링 프레임워크 장단점
• 효율적
프레임워크가 개발에 필요한 최소한의 기능을 제공하기 때문에 자신이 모든 기능을 작성할 필요가 없고, 애플리케이션 개발에 필요한 시간과 비용을 줄일 수 있다.
• 유지보수
프레임워크를 사용하면 코드가 보다 체계적이여서유지보수에 안정적이다.
• 프레임워크에 있는 코드를 습득하고 이해하는데 시간이 걸린다.
스프링 DI
- 의존성 주입
- 의존하는 부분을 외부에서 주입하는 것
- 코드간의 재사용을 높이고, 소스코드를 다양한 곳에 사용하며 모듈 간의 결합도를 낮출 수 있다.
- DI 는 프로그램에서 의존하는 부분을 외부에서 주입한다.
- 의존하는 부분 : '사용하는 객체 클래스'에 사용되는 객체' 클래스가 작성된 상태
- 외부로부터 주입 : '사용하는 객체' 클래스의 밖( DI 컨테이너 ?) 에서 '사용되는 객체' 인스턴스를 주입하는 것* 용어
- *용어 - 의존성을 주입받는다 : 의존성 주입은 주로 사용하는 쪽의 클래스에서 필요로 하는 의존성을 외부에서 주입받는 개념이다. 즉, 사용하는 클래스는 직접 의존하는 객체를 생성하거나 인스턴스를 가져오지 않고, 외부에서 필요한 의존성을 주입받아 사용하는 것이다
다섯 가지 규칙
DI 컨테이너에 인스턴스 생성을 맡기고 다음의 규칙을 지키는 것으로 '사용하는 객체' 클래스를 전혀 수정할 필요가 없게끔 만들 수 있다.
1. 인터페이스를 이용하여 의존성을 만든다.
의존하는 부분에 인터페이스를 이용한다
2. 인스턴스를 명시적으로 생성하지 않는다.
인스턴스 생성에 new 키워드를 사용하지 않는다는 것을 의미
3. 어노테이션을 클래스에 부여한다.
인스턴스를 생성하려는 클래스에 인스턴스 생성 어노테이션을 부여
4. 스프링 프레임워크에서 인스턴스를 생성한다.
스프링 프레임워크는 시작할 때 대상 프로젝트의 모든 패키지를 스캔한다. 이 기능을 컴포넌트 스캔이라고 하고, 스캔 이후 스프링은 인스턴스 생성 어노테이션이 부여된 클래스를 추출하고 추출한 클래스의 인스턴스를 생성한다
5. 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.
인스턴스를 이용하는 클래스에 참조를 받는 필드를 선언하고 필드에 @Autowired 어노테이션 부여
인스턴스 생성 어노테이션
어노테이션 | 개요 | 레이어 |
@Controller | 인스턴스 생성 지시, 스프링 MVC를 이용할 때 컨트롤러에 부여 | 어플리케이션 레이어 컨트롤러에 부여 |
@Service | 인스턴스 생성 지시, 트랜잭션 경계가 되는 도메인(서비스) 기능에 부여 | 도메인 레이어의 업무 처리에 부여 |
@Repository | 인스턴스 생성 지시, 데이터 베이스 엑세스(리포지토리) 기능에 부여 | 인프라 레이어의 데이터베이스 엑세스 처리에 부여 |
@Component | 위 용도 이외의 클래스에 부여 | 위 용도 이외의 클래스에 부여 |
* 레이어(Layer)란 계층 구조로 되어 있는 각 층. 즉 복잡한 전체 내용을 한 번에 정리해 이해하는게 아닌 계층화 해 각 계층별로 대상의 의미를 이해하는 것. 애플리케이션을 만들 때는 레이어로 나눠야 한다
스프링 AOP
- 관점 지향 프로그래밍
- 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리, 여러 메서드의 호출 전/후 에 원할때마다 손쉽게 추가
- 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법
- 스프링 프레임워크에서 지원하는 AOP기능을 활용하여 '중심적 관심사'와 '횡단적 관심사'를 분리하여 프로그램을 쉽게 만들 수 있다
AOP의 고유 용어
용어 | 내용 |
어드바이스(Advice) | 횡단적 관심사의 구현(메서드). 로그 출력 및 트랜잭션 제어 등입니다. |
애스펙트(Aspect) | 어드바이스를 정리한 것(클래스)입니다. |
조인포인트(JoinPoint) | 어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드(생성자) 실행 전, 메서드(생성자) 실행 후 등 실행되는 타이밍입니다. |
포인트컷(PointCut) | 어드바이스를 삽입할 수 있는 위치. 예를 들어, 메서드 이름이 get으로 시작할 때만 처리하는 조건을 정의할 수 있습니다. |
인터셉터(Interceptor) | 처리의 제어를 인터셉트 하기 위한 구조 또는 프로그램입니다. 스프링 프레임워크에서는 인터셉트라는 메커니즘으로 어드바이스를 중심 관심사에 추가한 것처럼 보이게 합니다. |
타깃(Target) | 어드바이스가 도입되는 대상을 말합니다. |
어드바이스의 다섯 가지 종류
어드바이스 | 내용 | 어노테이션 |
Before Advice | 중심적 관심사가 실행되기 '이전'에 횡단적 관심사를 실행 | @Before |
After Returning Advice | 중심적 관심사가 '정상적으로 종료된 후'에 횡단적 관심사를 실행 | @AfterReturning |
After Throwing Advice | 중심적 관심사로부터 '예외가 던져진 후'로 횡단적 관심사를 실행 | @AfterThrowing |
Afted Advice | 중심적 관심사의 '실행 후'에 횡단적 관심사를 실행(정상 종료나 예외 종료 등의 결과와 상관없이 실행) | @After |
Around Advice | 중심적 관심사 호출 전후에 횡단적 관심사를 실행 | @Around |
포인트컷 식
직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있다. 지정하는 조건 방법에는 포인트 컷 식을 사용 (여러가지 가 있고 예시로 execution만)
execution 지시자
구문 : execute(반환값 패키지.클래스.메서드(인수))
와일드 카드 : 유연하게 적용 범위를 지정 가능 ( *, .., + )
예제)
날짜와 메서드 이름을 표시하는 @Before 어드바이스를 작성
@Aspect //어드바이스를 기술하는 클래스에는 @Aspect 어노테이션 부여
@Component //인스턴스 생성 위해 부여
public class SampleAspect {
//어노테이션의 인수에 포인트컷 식 execution지정
//= com..dicontroller패키지에서 클래스 이름이 Greet으로 끝나는 모든 메서드에 대해 어드바이스 작성한다
@Before("execution(* com.example.springlearning.chapter03.dicontroller.*Greet.*(..))")
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("==== Before Advice====");
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
}
결과 : beforeAdvice() 먼저 처리 후 Greet클래스 메서드 호출
@Around는 좀 특이한데 일단 참고용
@Around("execution(* com.example.springlearning.chapter03.dicontroller.*Greet.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("==== Around Advice====");
System.out.println("▼▼▼ 처리전 ▼▼▼");
//지정한 클래스의 메서드 실행
Object result = joinPoint.proceed();
System.out.println("▲▲▲ 처리후 ▲▲▲");
return result;
}
결과: "처리전" -> Greet클래스 메서드 -> "처리후"
참고자료
스프링 프레임워크

스프링의 핵심 가치
애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있게끔 하는 것
스프링 부트 (Spring Boot)
스프링 애플리케이션을 복잡한 설정 없이 빠르게 작성하는 기능 제공
스프링 프로젝트
• 스프링 MVC (Spring MVC)
웹 애플리케이션을 간단하게 생성하는 기능 제공
• 스프링 데이터 (Spring Data)
데이터 접근에 관한 기능 제공
• 스프링 배치 (Spring Batch)
배치 처리 기능 제공
• 스프링 시큐리티 (Spring Security)
인증/허가 기능 제공
스프링 코어
• 스프링 DI (Spring DI)
의존성 주입 (Dependency Injection) 기능 제공
• 스프링 AOP (Spring AOP)
관점 지향 프로그래밍 (Aspect Oriented Programming) 기능 제공
스프링 프레임워크 장단점
• 효율적
프레임워크가 개발에 필요한 최소한의 기능을 제공하기 때문에 자신이 모든 기능을 작성할 필요가 없고, 애플리케이션 개발에 필요한 시간과 비용을 줄일 수 있다.
• 유지보수
프레임워크를 사용하면 코드가 보다 체계적이여서유지보수에 안정적이다.
• 프레임워크에 있는 코드를 습득하고 이해하는데 시간이 걸린다.
스프링 DI
- 의존성 주입
- 의존하는 부분을 외부에서 주입하는 것
- 코드간의 재사용을 높이고, 소스코드를 다양한 곳에 사용하며 모듈 간의 결합도를 낮출 수 있다.
- DI 는 프로그램에서 의존하는 부분을 외부에서 주입한다.
- 의존하는 부분 : '사용하는 객체 클래스'에 사용되는 객체' 클래스가 작성된 상태
- 외부로부터 주입 : '사용하는 객체' 클래스의 밖( DI 컨테이너 ?) 에서 '사용되는 객체' 인스턴스를 주입하는 것* 용어
- *용어 - 의존성을 주입받는다 : 의존성 주입은 주로 사용하는 쪽의 클래스에서 필요로 하는 의존성을 외부에서 주입받는 개념이다. 즉, 사용하는 클래스는 직접 의존하는 객체를 생성하거나 인스턴스를 가져오지 않고, 외부에서 필요한 의존성을 주입받아 사용하는 것이다
다섯 가지 규칙
DI 컨테이너에 인스턴스 생성을 맡기고 다음의 규칙을 지키는 것으로 '사용하는 객체' 클래스를 전혀 수정할 필요가 없게끔 만들 수 있다.
1. 인터페이스를 이용하여 의존성을 만든다.
의존하는 부분에 인터페이스를 이용한다
2. 인스턴스를 명시적으로 생성하지 않는다.
인스턴스 생성에 new 키워드를 사용하지 않는다는 것을 의미
3. 어노테이션을 클래스에 부여한다.
인스턴스를 생성하려는 클래스에 인스턴스 생성 어노테이션을 부여
4. 스프링 프레임워크에서 인스턴스를 생성한다.
스프링 프레임워크는 시작할 때 대상 프로젝트의 모든 패키지를 스캔한다. 이 기능을 컴포넌트 스캔이라고 하고, 스캔 이후 스프링은 인스턴스 생성 어노테이션이 부여된 클래스를 추출하고 추출한 클래스의 인스턴스를 생성한다
5. 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.
인스턴스를 이용하는 클래스에 참조를 받는 필드를 선언하고 필드에 @Autowired 어노테이션 부여
인스턴스 생성 어노테이션
어노테이션 | 개요 | 레이어 |
@Controller | 인스턴스 생성 지시, 스프링 MVC를 이용할 때 컨트롤러에 부여 | 어플리케이션 레이어 컨트롤러에 부여 |
@Service | 인스턴스 생성 지시, 트랜잭션 경계가 되는 도메인(서비스) 기능에 부여 | 도메인 레이어의 업무 처리에 부여 |
@Repository | 인스턴스 생성 지시, 데이터 베이스 엑세스(리포지토리) 기능에 부여 | 인프라 레이어의 데이터베이스 엑세스 처리에 부여 |
@Component | 위 용도 이외의 클래스에 부여 | 위 용도 이외의 클래스에 부여 |
* 레이어(Layer)란 계층 구조로 되어 있는 각 층. 즉 복잡한 전체 내용을 한 번에 정리해 이해하는게 아닌 계층화 해 각 계층별로 대상의 의미를 이해하는 것. 애플리케이션을 만들 때는 레이어로 나눠야 한다
스프링 AOP
- 관점 지향 프로그래밍
- 로깅, 트랜잭션, 보안 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리, 여러 메서드의 호출 전/후 에 원할때마다 손쉽게 추가
- 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법
- 스프링 프레임워크에서 지원하는 AOP기능을 활용하여 '중심적 관심사'와 '횡단적 관심사'를 분리하여 프로그램을 쉽게 만들 수 있다
AOP의 고유 용어
용어 | 내용 |
어드바이스(Advice) | 횡단적 관심사의 구현(메서드). 로그 출력 및 트랜잭션 제어 등입니다. |
애스펙트(Aspect) | 어드바이스를 정리한 것(클래스)입니다. |
조인포인트(JoinPoint) | 어드바이스를 중심적인 관심사에 적용하는 타이밍. 메서드(생성자) 실행 전, 메서드(생성자) 실행 후 등 실행되는 타이밍입니다. |
포인트컷(PointCut) | 어드바이스를 삽입할 수 있는 위치. 예를 들어, 메서드 이름이 get으로 시작할 때만 처리하는 조건을 정의할 수 있습니다. |
인터셉터(Interceptor) | 처리의 제어를 인터셉트 하기 위한 구조 또는 프로그램입니다. 스프링 프레임워크에서는 인터셉트라는 메커니즘으로 어드바이스를 중심 관심사에 추가한 것처럼 보이게 합니다. |
타깃(Target) | 어드바이스가 도입되는 대상을 말합니다. |
어드바이스의 다섯 가지 종류
어드바이스 | 내용 | 어노테이션 |
Before Advice | 중심적 관심사가 실행되기 '이전'에 횡단적 관심사를 실행 | @Before |
After Returning Advice | 중심적 관심사가 '정상적으로 종료된 후'에 횡단적 관심사를 실행 | @AfterReturning |
After Throwing Advice | 중심적 관심사로부터 '예외가 던져진 후'로 횡단적 관심사를 실행 | @AfterThrowing |
Afted Advice | 중심적 관심사의 '실행 후'에 횡단적 관심사를 실행(정상 종료나 예외 종료 등의 결과와 상관없이 실행) | @After |
Around Advice | 중심적 관심사 호출 전후에 횡단적 관심사를 실행 | @Around |
포인트컷 식
직접 어드바이스를 만드는 경우 패키지, 클래스, 메서드 등 어드바이스 삽입 대상을 조건으로 지정할 수 있다. 지정하는 조건 방법에는 포인트 컷 식을 사용 (여러가지 가 있고 예시로 execution만)
execution 지시자
구문 : execute(반환값 패키지.클래스.메서드(인수))
와일드 카드 : 유연하게 적용 범위를 지정 가능 ( *, .., + )
예제)
날짜와 메서드 이름을 표시하는 @Before 어드바이스를 작성
@Aspect //어드바이스를 기술하는 클래스에는 @Aspect 어노테이션 부여
@Component //인스턴스 생성 위해 부여
public class SampleAspect {
//어노테이션의 인수에 포인트컷 식 execution지정
//= com..dicontroller패키지에서 클래스 이름이 Greet으로 끝나는 모든 메서드에 대해 어드바이스 작성한다
@Before("execution(* com.example.springlearning.chapter03.dicontroller.*Greet.*(..))")
public void beforeAdvice(JoinPoint joinPoint){
System.out.println("==== Before Advice====");
System.out.println(new SimpleDateFormat("yyyy/MM/dd").format(new java.util.Date()));
System.out.println(String.format("메서드:%s", joinPoint.getSignature().getName()));
}
}
결과 : beforeAdvice() 먼저 처리 후 Greet클래스 메서드 호출
@Around는 좀 특이한데 일단 참고용
@Around("execution(* com.example.springlearning.chapter03.dicontroller.*Greet.*(..))")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("==== Around Advice====");
System.out.println("▼▼▼ 처리전 ▼▼▼");
//지정한 클래스의 메서드 실행
Object result = joinPoint.proceed();
System.out.println("▲▲▲ 처리후 ▲▲▲");
return result;
}
결과: "처리전" -> Greet클래스 메서드 -> "처리후"
참고자료