Developer Note/국비과정 수업내용 정리&저장

24년 11월 18일

DH_PARK 2024. 11. 24. 22:28

복습

aop : 어떤 로직을 기준으로 관점으로 나누어서 그 관점을 기준으로 각각 모듈화함.

@Configuration : 특정 클래스를 어노테이션으로 설정파일로 등록. Bean을 수동으로 등록한다.

@ComponentScan : 어노테이션들을 자동으로 탐지 및 등록

근데 특정 어노테이션만을 스캔한다.

@Component와 그 하위 어노테이션:

  • @Component: 기본적인 스프링 빈으로 등록.
  • @Service: 서비스 계층 클래스.
  • @Repository: DAO(Data Access Object) 계층 클래스.
  • @Controller: Spring MVC의 컨트롤러.
  • @RestController: RESTful API 컨트롤러.

Bean 을 만들 때 특별히 빈의 이름을 정하지 않았다면 클래스명에서 제일 앞글자만 소문자로 해서 등록한다.


인터셉터 :

인터셉터(Interceptor)는 J2EE 표준 스팩인 필터(Filter)와 달리 스프링이 제공하는 기술로서, 디스패처 서블릿이 컨트롤러 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공합니다.

· 필터(Filter)는 웹 컨테이너에서 동작

· 인터셉터(Interceptor)는 스프링 컨텍스트에서 동작

package com.example.ex01.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MemoInterceptor implements HandlerInterceptor{
	
	//메모컨트롤러로 이동하기 전 처리 로직
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("MEMOInterceptor preHandle.." );
		return true;
	}

	//메모컨트롤러 작업끝난이후 처리로직
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("MEMOInterceptor postHandler");
		
	}
	
	
	//View page 렌더링 된 이후 처리로직
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		System.out.println("MEMOInterceptor afterCompletion invoke..");

	}

	
	
}

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// TODO Auto-generated method stub
		registry.addInterceptor(new MemoInterceptor()).addPathPatterns("/memo/*");		//메모 url 요청이 들어왔을때 인터셉터가 동작 객체가 생성된다
	}

리스너 :

Listener (ContextLoaderListener)

리스너는 리스너라고 정의되어있는 것이 아니라, 이벤트가 생겼을 때 이것에 대응하기 위해 이벤트 핸들링을 하는 객체를 지칭하는 것이었다. 스프링에서 이 리스너는 스프링의 조상인 서블릿의 ServletContextListener를 상속한 ContextLoaderListener로 구현되어있다. 그리고 스프링에서 이 ContextLoaderListener은 애플리케이션의 시작과 종료 시 발생하는 이벤트를 핸들링하는 리스너 역할을 한다.

스프링에서의 리스너

여기서는 프레임워크 내에 있는 이벤트를 대상으로 리스너가 동작

ApplicationEventPublisher는 Spring Framework에서 이벤트를 게시(publish)하는 데 사용되는 인터페이스입니다. 이를 통해 애플리케이션 내에서 이벤트 기반 프로그래밍을 구현할 수 있습니다.

주요 역할:

  1. 이벤트 게시: ApplicationEventPublisher를 사용하여 특정 이벤트를 애플리케이션 컨텍스트에 게시할 수 있습니다. 게시된 이벤트는 해당 이벤트를 수신할 수 있도록 등록된 리스너(listener)에 의해 처리됩니다.
  2. 애플리케이션 컴포넌트 간 느슨한 결합: 이벤트 기반 설계를 통해 애플리케이션 컴포넌트 간의 의존성을 줄이고 더 느슨하게 결합된 구조를 만들 수 있습니다.

주요 메서드:

ApplicationEventPublisher 인터페이스의 주요 메서드는 다음과 같습니다:

  • void publishEvent(Object event): 이벤트 객체를 받아서 이벤트를 게시합니다. 이벤트 객체는 보통 Spring의 ApplicationEvent를 상속하거나 일반 POJO일 수도 있습니다.

※ 현재 이 작업들은 다 DispatcherServlet 과 관계가 있음 ! (전에 다 하던거임)


핸들러

직역하면 ‘처리하는 취급자’. 스프링에서는 웹요청을 처리해서 핸들러라는 이름이다.

근데 이건 Controller 와 같지 않나? 라는 생각인데 컨트롤러가 일종의 핸들러인데 ,

핸들러는 좀 더 상위개념인 넓은 범위에서의 요청 처리 객체가 핸들러라고 한다.

(헷갈림)

핸들러 참고 그림

https://ksabs.tistory.com/250 //핸들러 참고 자료.

 

 


Http Request -> Dispatcher Servlet -> HandlerMapping -> Dispatcher Servlet -> HandlerAdapter 목록조회 -> Dispatcher Servlet -> HandlerAdapter를 통해 핸들러 실행

핸들러의 흐름이다.

핸들러라는게 , 따로 무슨 어노테이션이나 그런게 있는게 아니고 간단하게 일단은 넓은 범위의 Controller 라고만 생각하자.


스케줄

스프링 프레임워크에서 제공하는 작업 스케줄링 기능.

이 기능으로 개발자는 지정된 시간 간격이나 특정 시점에 자동으로 실행되어야 하는 작업을 쉽게 구성할 수 있고 , 스케줄러는 멀티스레딩 , 비동기 실행을 지원해서 효율적으로 백그라운드 작업 처리를 제공한다.

스케줄러 설정

package com.example.ex01.schedule;

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@EnableScheduling
public class Scheduling {
	
//	@Scheduled(fixedRate = 1000) //1초 마다 실행
//	public void t1() {
//		System.out.println("Scheduling's t1() invoke....");
//	}

	@Scheduled(cron="*/15 * * * * *")
	public void t2() {
		System.out.println("Scheduling's t2() invoke....");
	}
	
}
//초(0-59)  분(0-59)  시(0-23)  일(1-31)  월(1-12)  요일(0-6)
//매 초마다 실행: "* * * * * *"
//매 시간의 30분마다 실행: "0 30 * * * *"
//매일 오전 8시 30분마다 실행: "0 30 8 * * *"
//매주 월요일 아침 9시 30분마다 실행: "0 30 9 * * 1"
//매월 1일 아침 4시 30분마다 실행: "0 30 4 1 * *"
//매주 월요일부터 금요일까지 아침 10시마다 실행: "0 0 10 * * 1-5"

이렇게 시간 별로 특정 함수를 실행하게 한다거나 설정할 수 있다.

'Developer Note > 국비과정 수업내용 정리&저장' 카테고리의 다른 글

24년 11월 20일  (0) 2024.11.25
24년 11월 19일  (1) 2024.11.25
24년 11월 15일  (0) 2024.11.24
24년 11월 14일  (0) 2024.11.24
24년 11월 13일  (0) 2024.11.24