// input
var date = 20200602
var period = 7;
//temp 미리 만들어놨음 - 나중에 ttl index
var temp_cnt = db.temp.count();
var array = new Array();
for(var i=0; i<period; i++){
var stage = db.test_logs.aggregate([
{$match: {rday:20200602+i}},
{$lookup:{
from: "temp",
localField: "userid",
foreignField: "userid",
as: "test"
}}
]);
var stage_cnt = stage._batch.length
array.push(stage_cnt/temp_cnt*100);
}
print(array)
server{listen80;server_nameyour_server_ip;# note that these lines are originally from the "location /" block# root 설정이 없으면 404 에러가 날수 있다.root/usr/share/nginx/html;indexindex.php index.html index.htm;location/ {try_files$uri$uri/ =404; }error_page404/404.html;error_page500502503504/50x.html;location= /50x.html {root/usr/share/nginx/html; }location~ \.php${try_files$uri=404;#fastcgi_pass 는 아래 두개 중 아무거나 사용해도 좋으나 php-fpm.d/www.conf 설정과 맞춰줘야 한다.#fastcgi_pass 127.0.0.1:9000;fastcgi_passunix:/var/run/php-fpm/php-fpm.sock;fastcgi_indexindex.php;#/scripts 이름으로 인해서 오류가 생길 수 있다.#fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;includefastcgi_params; } }
- Servlet Container는 Servlet 저장소라고 봐도 무방하다. Java로 웹을 개발하기 위해 여러 Servlet들이 필요하게 되는데, 이러한 Servlet들의 Life Cycle (생명주기) 관리, 멀티쓰레드 지원등을 하고 있는 것이 Servlet Container이다. 우리가 알고 있는 대표적인 Servlet Container가Tomcat이다.
- Spring MVC로의 모든 요청과 응답은 DispatcherServlet이 관리하고 있다.
URL요청이 오면 이를 가로채서 HandlerMapping (@RequestMapping으로 봐도 무방) 에게 해당 요청을 처리할 수 있는 Controller를 찾아내어 요청을 Controller에게 보내고 결과값을 리턴해준다.
자세한 설명은 다음시간에 좀더 하고 아래 그림을 DispatcherServlet의 흐름을 보면 좋을것 같다!
2. Servlet
- 웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게
전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그래밍 기술
-간단히 말해서, 서블릿이란자바를 사용하여 웹을 만들기 위해 필요한 기술입니다. 그런데 좀더 들어가서 설명하자면
클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램입니다.
예를 들어, 어떠한 사용자가 로그인을 하려고 할 때. 사용자는 아이디와 비밀번호를 입력하고, 로그인 버튼을 누릅니다.
그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고, 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는
것이 바로 서블릿(Servlet)입니다. 그래서 서블릿은 자바로 구현 된 *CGI라고 흔히 말합니다.
- 일반적으로 웹서버는 정적인 페이지만을 제공합니다. 그렇기에 동적인 페이지를 제공하기 위해서 웹서버는
다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 합니다. 동적인 페이지로는 임의의 이미지만을 보여주는 페이지와 같이
사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미합니다. 여기서 웹서버가 동적인 페이지를 제공할 수 있도록
도와주는 어플리케이션이 서블릿이며, 동적인 페이지를 생성하는 어플리케이션이 CGI입니다.
3. SpringMVC의 처리구조
4. JSP란? (서블릿과의 비교)
- HTML을 코딩하기 너무 어렵고 불편해서 HTML 내부에 Java코드를 삽입하는 형식이 JSP이다. 다시 말해 서블릿의 단점을 보완하고자 만든 서블릿 기반의 스크립트 기술이다. 서블릿을 이용하게 되면 웹프로그래밍을 할 수 있지만 자바에 대한 지식이 필요하며 화면 인터페이스 구현에 너무 많은 코드를 필요로 하는 등 비효율적인 측면들이 있다. 때문에 서블릿을 작성하지 않고도 간편하게 웹프로그래밍을 구현하게 만든 기술이 JSP(Java Server Pages)이다. 조금더 알아보자면 JSP(Java Server Pages)는 서블릿 기반의 '서버 스크립트 기술'이다. 여기서 스크립트 기술이란 ASP, PHP 처럼 미리 약속된 규정에 따라 간단한 키둬드를 조합하여 입력하면, 실행 시점에 각각의 키워드에 매핑이 되어 있는 어떤 코드로 변환 후에 실행되는 형태이다
- mvc 모델에서!!
:JSP는 HTML태그 사용이 용이하고 자바코드 사용이 불편하기 때문에 웹어플리케이션에서 사용자에게 결과를 보여주는 View(Client)를 담당하고 Servlet은 자바코드 작성이 편리하기 때문에 주로 화면과 통신하여 자료를 받아 가공하고 가공한 자료를 다시 화면에 전달하는 Controller역할을 하고 있다.
~ JSP와 Servlet 동시에 사용 MVC모델(View는 JSP, Controller는 Servlet을 사용) ~ 프리젠테이션 로직과 비즈니스 로직 분리 (보여지는 부분은 HTML이 중심이 되는 JSP, 다른 자바클래스에게 데이터를 넘겨주는 부분은 Java코드가 중심이 되는 Servlet이 담당) ~ 유지보수 용이
5. Bean이란?
- [ 스프링에서의 빈이란? ]
우선 스프링은 경량 컨테이너로서 객체 생성, 소멸과 같은 Life Cycle을 관리하며 스프링 컨테이너로부터 필요한 객체를 얻을 수 있다.
스프링 컨테이너에 의해서 자바 객체가 만들어지게 되면 이 객체를 스프링은스프링 빈(Bean)이라고 부른다.
스프링 빈과자바 일반 객체와의 차이점은 없고 스프링 컨테이너에 의해 만들어진 객체를 스프링 빈이라고 부를 뿐이다.
- Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
우리가 new 연산자로 어떤 객체를 생성했을 때 그 객체는 빈이 아니다.
ApplicationContext.getBean()으로 얻어질 수 있는 객체는 빈이다.
즉 Spring에서의 빈은 ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
6. Annotation? - Bean을 등록하는 방법
- JDK5부터 나왔으며 메타데이터(실제데이터가 아닌 데이터를 위한 데이터)라고도 불린다. 컴파일 또는 런타임에 해석이 된다.
설정값들을 명시한다는 점에서 xml과 비슷하지만 xml은 외부에 존재하고, 필요한 경우 이미 빌드한 결과에 재 컴파일할 필요없이 xml에서 설정만 수정하여 변경사항을 적용할 수 있다. 그렇지만 프로그램 작성을 위해 매번 많은 설정파일을 작성해야한다.
Annotation은 선언위에 존재해서 어떤 내용인지 쉽게 판단할 수 있으며 작성할 코드의 양도 적은 편인다. 그렇지만 xml도 위에서 말한 장점이 있으므로 annotation을 사용한다고 해서 xml을 아예 사용 안하는 것은 아니다.
- 원래 bean을 정의하기 위해선 xml에 명시적으로 정의하는 것이 기본이었다. 하지만 Spring 2.0버전 이후로 classpath scanning을 하면서 Spring framework가 자동으로 관리할 bean을 정의할 수 있는 애노테이션이 생겼다. 이것이 stereotype이다.
Spring 2.0에서 @Repository 애노테이션이 stereotype으로 처음 소개되었다. 그리고 Spring 2.5에 @Component, @Service, @Controller 등의 더 많은 stereotype 애노테이션이 생겼다.
@Component는 목적이 불분명한 클래스를 bean으로 만들 때 사용하고 나머지 @Repository, @Controller, @Service 모두 @Component를 좀 더 구체적으로 만든 것이다.
7. 맨날보는 @SpringBootApplication ??
- 1) @Configuration: 클래스에 이 어노테이션이 붙어 있으면 스프링은 해당 클래스를 Java config로 간주한다.
2) @ComponentScan : 컴포넌트 검색기능을 가진 어노테이션이다. 스프링은 기본적으로 객체를 자동으로 생성하여 관리하기 때문에 @Component 어노테이션이 있는 클래스들을 스프링 컨테이너가 생성해준다. @ComponentScan는 특별히 basePackage를 지정하지 않아도 main class가 위치한 패키지를 Root package로 하여 그 이하의 모든 컴포넌트 클래스들을 검색하여 빈으로 등록한다.
FirstApplication.class는 메인 클래스이다. 이 클래스는 examples.boot.first 패키지에 위치하고 있고 이곳이 컴포넌트 스캔의 루트 패키지가 된다. 즉 FirstApplication이 위치하고 있는 example.boot.first 패키지가 기준이 되어 그 하위에 있는 모든 컴포넌트들을 검색한다.
3) @EnableAutoConfiguration : 어플리케이션에 추가된 설정들을 자동으로 추가해주는 어노테이션
@Bean을 이용하여 개발자가 생성하는 코드를 작성
public class FirstApplication { // 프로그램 시작점 public static void main(String[] args) { SpringApplication.run(FirstApplication.class, args); }
run()에 넣어야 하는 것은 Java Config클래스이다. 즉 FirstApplication.class를 넣는다. Java Config가 되려면 @Configuration이 붙어 있어야 한다.
@SpringBootApplication 내부에 @Configuration이 포함되어있기 때문에 Java configure로 가능.
그럼 Java configure는 누가 읽는가? Application Context가 읽는다. 이것은 run() 안에 구현되어 있다.
examples.boot. first ---> 이하로 컴포넌트를 찾는다
FirstApplication이 examples.boot.first에 있기 때문.
examples.boot.first.service 라는 패키지 아래에 컴포넌트가 있어도 찾을 수 있다.