// 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)
static function lookUpByStage($date, $i){

        return LoginLog::on('mongodbGomLogs')->raw(function($collection) use ($date, $i){
           return $collection->aggregate([
               ['$match'=>['rday'=> $date+$i]],
               ['$lookup'=>[
                    'from'=>'temp',
                    'localField'=>'userid',
                    'foreignField'=>'userid',
                    'as'=>'test'
                ]],
               ['$count'=>'userid']
           ]);
        });

    }

 

1. yum -y install gcc php-pear php-devel

2. pecl install mongo ---> 이렇게 해서 설치했는데 실제로 모듈은 확인 안되고, 새로 설치하면 이미 설치 됐다는 에러만 떴다.. -> pecl install -f mongo 로 바꿔서 됨

3. php.ini 에다가 extension=mongodb.so 추가

**mongo.so: 구버전/ mongodb.so: 신버전

**몽고 잘 깔렸는지 확인 -> php -m 모듈에서 확인 가능 -> phpinfo 에도 잘 떠야한다

추가 4. PHP MongoDB "No suitable servers found" ERROR

selinux 보안과 관련된 문제인거 같다

setsebool -P httpd_can_network_connect on

 

yum -y install gcc php-pear php-deveyum -y install gcc php-pear php-deveㅛㅕㅡ yum -y install gcc php-pear php-develyum -y install gcc php-pear php-devel

0. 새로 ec2 인스터스를 팠으면 yum -y update 해주자

1. Install EPEL Repository

To install the latest PHP 7.3.3 on CentOS 7.6, you need to first install EPEL repositories.

yum install epel-release

 

2. Install Remi Repository

Remi is a third party repository that provides the latest versions of PHP.

yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

 

3. Disable Remi PHP 5.4 repository

yum install -y yum-utils

yum-config-manager --disable remi-php54

 

4. Enable Remi PHP 7.3 repository

yum-config-manager --enable remi-php73

 

5.

Installing PHP 7.3.3 on CentOS 7.6

yum install php

 

6. php-fpm 설치

yum install php-fpm php-common

7. 설정파일

/etc/php-fpm.d/www.conf 파일

########### file /etc/php-fpm.d/www.conf user = nginx group = nginx ;listen은 nginx 설정과 맞춰줘야 한다. ;listen = 127.0.0.1:9000 listen = /var/run/php-fpm/php-fpm.sock; listen.owner = nginx listen.group = nginx

출처: https://forteleaf.tistory.com/entry/nginx-php71-phpfpm-설치하기 [부들잎의 이것저것]

 

nginx + php71 + php-fpm 설치하기

version 정보 nginx : 1.14.0 php : 7.1.18 yum install nginx 를 통해서 설치하였으며, # yum install nginx [root@centos html]# nginx -v nginx version: nginx/1.14.0 php71 은 remi repo를 추가해서 아래와..

forteleaf.tistory.com

/etc/nginx/conf.d/default.conf 파일 : 여기 있는 루트 파일에서 html 불러온다

출처: https://forteleaf.tistory.com/entry/nginx-php71-phpfpm-설치하기 [부들잎의 이것저것]

server { listen 80; server_name your_server_ip; # note that these lines are originally from the "location /" block # root 설정이 없으면 404 에러가 날수 있다. root /usr/share/nginx/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } error_page 404 /404.html; error_page 500 502 503 504 /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_pass unix:/var/run/php-fpm/php-fpm.sock; fastcgi_index index.php; #/scripts 이름으로 인해서 오류가 생길 수 있다. #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }

출처: https://forteleaf.tistory.com/entry/nginx-php71-phpfpm-설치하기 [부들잎의 이것저것]

8. 테스트하려면 

service nginx restart

service php-fpm restart

하고 나서 해당 ip 주소(기본 80포트)로 들어가서 지정해줬던 루트의 index.html이 보이는지 확인

<HTML의 data 속성>

가장 먼저 떠오른 data 속성.

배열을 따로 전달해 주는거 같진 않아서 json 형식의 string으로 전달 후, 자바스크립트에서 decode 해서 사용하기로 함.

JSON.parse($$$) : json to js object

JSON.stringify : json to string

<문제상황>

["Mar 1","Mar 2","Mar 3","Mar 4","Mar 5","Mar 6","Mar 7","Mar 8","Mar 9","Mar 10","Mar 11","Mar 12","Mar 13"]

이렇게 보여야 하는 배열이 json.parse를 하자 uncaught jsonUnexpected end of JSON input 에러가 나옴.

<해결책>

json 키나 밸류에는 공백을 넣어줘서는 안된다

'웹개발 > PHP' 카테고리의 다른 글

mongo retention 계산($lookup) - js/php  (0) 2020.06.10
centos에 php-mongodb driver 설치  (0) 2020.05.27
CentOS 7.8에서 php7.3 +nginx+php-fpm 설치  (0) 2020.05.26

1. application.properties = 외부 설정 파일

- 애플리케이션에서 사용하는 여러가지 설정 값들을 애플리케이션의 밖이나 안에 정의할 수 있는 기능을 말한다.

- 이 파일은 스프링부트가 애플리케이션을 구동할 때 자동으로 로딩하는 파일이다.
key - value 형식으로 값을 정의하면 애플리케이션에서 참조하여 사용할 수 있다.

'웹개발 > Spring' 카테고리의 다른 글

스프링 어노테이션+++  (0) 2020.05.12
스프링 기본 개념 정리+++++  (0) 2020.05.10

spring mvc 흐름

1. @ResponseBody

- Spring MVC의 컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다. Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다. 

2. @Controller

-전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다. 아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.

3. @RestConstroller = @Constroller + @ResponseBody

4. @Component

@Contoller, @Service, @Repositorym, @Component 이 4가지 어노테이션은 모두 빈에 자동으로 등록하기 위해서 선언하는 어노테이션 입니다. 매번 어떨 때 써야 맞는건지 고민 하신다면 아래의 표를 참고해 보시기 바랍니다.

 @Controller

  Presentation Layer에서 Contoller를 명시하기 위해서 사용

 @Service

  Business Layer에서 Service를 명시하기 위해서 사용

 @Repository 

  Persistence Layer에서 DAO를 명시하기 위해서 사용

 @Component

  그 외에 자동으로 스캔해서 등록하고 싶은 것들을 위해 사용

 

기본적으로 네 가지 어노테이션의 기능은 같습니다만, 시각적으로 역할을 확실하게 명시해 주기 위해서 나뉘어져 있으며 AOP의 Pointcut에서 어노테이션 단위로 지정할 수 있기 때문에 유용하게 사용 될 수 있습니다.

 

5. @Autowired

 

'웹개발 > Spring' 카테고리의 다른 글

스프링 폴더 구조++++  (0) 2020.05.12
스프링 기본 개념 정리+++++  (0) 2020.05.10

1. Tomcat

- Servlet ContainerServlet 저장소라고 봐도 무방하다. 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 라는 패키지 아래에 컴포넌트가 있어도 찾을 수 있다.

 

examples.boot.first.main 패키지에 FirstApplication 클래스가 있다면?

examples.boot.first.service 패키지의 클래스는 찾을 수 있을까? No!!

 

 

스프링은 기본적으로 객체를 관리할 때 Singleton으로 한다.

객체를 메모리에 1번만 올린다.

 

8. DI - Dependancy Injection 의존성 주입

- DI는 말 그대로 의존성을 주입시켜준다- 입니다. 객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입을 시켜주는 방식인데요.

방법 2가 DI

DI(의존성 주입)을 적용한 두번째 예제는 직접 객체를 생성하지 않고, 외부(applicationContext.xml)에서 객체를 생성 후 사용할 객체에 주입을 시켜주어 사용합니다. 

출처: https://private.tistory.com/39 [공부해서 남 주자]

'웹개발 > Spring' 카테고리의 다른 글

스프링 폴더 구조++++  (0) 2020.05.12
스프링 어노테이션+++  (0) 2020.05.12

당연히 혼용해서 사용하면 안됨..

1. Ajax 방식(비동기식)

<div id="container" style="width: 30%; height: 80px; margin-left: 30%; margin-top: 10%;" >
        <form class="form-signin" id="form">
            <h2 class="form-signin-heading">로그인</h2>
            <label for="inputEmail" class="sr-only">Email address</label>
            <input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
            <label for="inputPassword" class="sr-only">Password</label>
            <input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>

            <div>
                <label>

                </label>
            </div>
            <button class="btn btn-lg btn-primary btn-block" id="submit" type="button">Sign in</button>
        </form>
<script>

    $(function(){
        $('#submit').on("click",function () {

            var form1 = $("#form").serialize();

            console.log(form1);
            $.ajax({
                type: "post",
                url: "/login/check",
                data: form1,
                dataType: 'json',
                success: function (data) {
                    alert("success");
                    console.log(data);
                },
                error: function (request, status, error) {
                    console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);

                }
            });
        });
    });
    
</script>
  • HTML form 태그에서 따로 설정해주는 것이 없음. 
  • js에서 변수에 접근하려면 해당 태그의 아이디 값으로 $('#submit') 접근

 

2. Submit 방식 (동기식) : 페이지를 이동함(reload)

<form class="form-signin" id="form" method="POST" action="test.jsp">
            <h2 class="form-signin-heading">로그인</h2>
            <label for="inputEmail" class="sr-only">Email address</label>
            <input type="email" name="email" id="inputEmail" class="form-control" placeholder="Email address" required autofocus>
            <label for="inputPassword" class="sr-only">Password</label>
            <input type="password" name="password" id="inputPassword" class="form-control" placeholder="Password" required>

            <button class="btn btn-lg btn-primary btn-block" id="submit" type="button">Sign in</button>
        </form>
  • form을 이용해서 데이터를 날림(methodaction 속성 이용)
  • action값에는 url을 지정함

'웹개발' 카테고리의 다른 글

session과 cookie 차이점  (0) 2020.02.11
URL 개념 및 구조  (3) 2020.01.14
MVC 패턴  (0) 2020.01.02
Bootstrap - Grid System  (0) 2019.12.27

+ Recent posts