spring boot AOP 구현하기.
Aop를 잘 모르지만

  • Http 요청이 왔을때 끼어들어 요청에 대한 권한이 있는지 체크하기 위한 AOP를 개발하려한다.
    : http요청이 왔을때 실제 응답을 주기전에 권한을 체크하고 권한이 있으면 계속 진행하도록 해주고, 권한이 없으면 진행을 막는다.
  • 더불어 특정 controller에는 권한체크를 하지 않고, http request로 온 header안에 정보를 parameter로 전달하려한다.
  1. pom.xml
    <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
  1. AopConfig.java
    @Around 이노테이션으로 requestMapping으로 들어오는 요청에 대해서 AOP를 적용할것임을 명시.
    특정 controller 접근시에는 parameter를 넘겨주도록했음.
    주석 참고.
@Configuration
@Aspect
@EnableAspectJAutoProxy() 
public class AopConfig { 
    ...
    @Around("@annotation(requestMapping)") 
    public final Object checkPermission(final ProceedingJoinPoint pjp
                                      , final RequestMapping requestMapping){
        .... 
        //권한을 체크하는 함수에서 true값을 return해주면 계속해서 진행 
        if (permission.check(pjp, requestMapping, httpServletRequest)) { 
            return pjp.proceed();
        } 

        ....
        String email = .... ;
        //특정 controller접근시에는 권한체크는 하지 않고 파라미터만 전달하여 계속 진행
        if (pjp.getSignature().toString().contains("com.xxx.xxx.controller.xxx")) {
            return pjp.proceed(new Object\[\]{email});
        } 
        ... 


        //권한 없는 경우 null을 return하여 계속해서 진행할 수 없음. 
        return null; 
        } 
 }

참고.
proceedjointpoint로 parameter를 넘겨줄때는 넘겨준 parameter와 동일한 명칭, 순서로 받아야한다.

@ResponseBody 
@RequestMapping(method = RequestMethod.GET, value = "/user") 
public LoginUser getLoginEmail(final String email) { 
    LoginUser loginUser = new LoginUser(); 
    loginUser.setEmail(email);
    return loginUser;
}

큰 데이터를 만지다보면, Spark의 DataFrame과 Pandas의 DataFrame의 서로 변환이 꼭 필수다.
예를들어서 Pandas의 DataFrame을 Spark SQL의 테이블로 등록하고, Spark에서 작업을 하기도 한다.
만약 이 방법을 모른다면, 어떻게 테이블로 변환을 할것인가?

Pandas의 DataFrame을 Spark의 DataFrame으로 변환하기 위해서는
spark.createDataFrame(df)를 하면된다. (너무 간단함...)
spark2 이상에서 사용했으니 1.x에서는 알아서 바꿔서 하면 될듯!

보통 spark와 pandas에서의 dataframe의 구분이 어렵기 때문에
pdf (=pandas data frame)으로 적는다. (아님 말고)

import pandas as pd
## Create Pandas Frame
pd_df = pd.DataFrame({u'2017-01-01': 1, u'2017-01-02': 2}.items())
## Convert into Spark DataFrame
spark_df = spark.createDataFrame(pd_df)
## Write Frame out as Table
spark_df.write.mode("overwrite").saveAsTable("db.table_name")

json의 파일이 있을때, dataframe으로 변환을 하고 싶을때가 있다.
보통 json은 리스트 형태로 안에 dictionary로 되어있다.
json.loads의 함수를 이용해 dictionary로 변환하고, from_dict을 이용하자.

import pandas as pd
import json

filename='file.json'
stats = open(filename, 'r').readline()
stats = json.loads(stats)
display(pd.DataFrame.from_dict([stats]))

dataframe에서 데이터 읽을때는 iterator를 이용해서 불필요한 데이터는 메모리에 올리지 않는게 좋다.
데이터를 다 메모리에 읽은 이후에 filter를 통해서 걸러내도 좋지만,
데이터가 크면 이 역시도 무리가 있을수 있으니
다음과 같이 iterator=Truechunksize=10000을 지정해서 메모리에 올리는 방법을 선택하는게 좋다.

import pandas as pd
iter_csv = pd.read_csv('data_in/data.txt', iterator=True, chunksize=1000, delimiter='\t', names=cols)
df = pd.concat([chunk[~np.isnan(chunk['cols'])] for chunk in iter_csv])
df = df.fillna('')  

데이터를 확인할때 가장먼저 NaN을 확인하게 되는데, NaN 컬럼별로 얼마나 있는지 확인하기 위해서는 아래와 같이 하면된다.
이때 axis=0column을 의미하고, axis=1index를 의미한다. (앞으로도 많이 사용한다)

df.isnull().sum(axis = 0) # columns

NaN을 확인할때는 np.isnan(), ~np.isnan()을 이용하자
NaN의 데이터에 내가 원하는 값을 채워넣기 위해서는 아래와 같이 fillna(원하는값)을 사용한다.

dataframe.fillna(0)

특정 컬럼에 대해서 null을 확인하기 위해서는 아래와 같이 isnull()을 추출하고 select하면 된다.

all_df[all_df['City'].isnull()]

노트북에서 사용할 함수 시작할때 자동으로 로드하기

  • 자주 사용하는 라이브러리가 있다면, notebook을 실행할때 자동으로 import 되도록 설정이 가능하다. 예를들어서 pandas의 dataframe의 사이즈를 조정하거나, 자주 사용하는 함수가 있다면 번거롭게 노트마다 등록하지 말고, 하나의 파일로 생성해놓자.

  • ~/.ipython profile_default/에 들어간다.

  • startup의 디렉토리를 생성한다 (아마 있을것이다.)

  • start.py의 파이썬 파일을 생성한다.

  • 파일에 내가 추가할 함수 모듈을 추가한다.

  • 자동으로 notebook에서 import 하는지 확인한다.

startup

startup 디렉토리를 들어가면 README로 친절하게 설명이 되어 있다. 위에의 경우에 start.py로 생성하면 하나의 파일을 생성하기에는 쉽겠지만, 여러개의 단계를 생성하고, 단계를 추가/삭제 하기 위해서는 아래와 같이 순서를 적어주면 알아서 순서대로 수행을 해준다.

This is the IPython startup directory

.py and .ipy files in this directory will be run *prior* to any code or files specified
via the exec_lines or exec_files configurables whenever you load this profile.

Files will be run in lexicographical order, so you can control the execution order of files
with a prefix, e.g.::

    00-first.py
    50-middle.py
    99-last.ipy

start.py


import pandas as pd
import numpy as np

# Pandas options
pd.options.display.max_columns = 30
pd.options.display.max_rows = 20

from IPython import get_ipython
ipython = get_ipython()

# If in ipython, load autoreload extension
if 'ipython' in globals():
    print('\nWelcome to IPython!')
    ipython.magic('load_ext autoreload')
    ipython.magic('autoreload 2')

# Display all cell outputs in notebook
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all'

# Visualization
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode
init_notebook_mode(connected=True)
import cufflinks as cf
cf.go_offline(connected=True)
cf.set_config_file(theme='pearl')

print('Your favorite libraries have been loaded.')

Autoreload

%load_ext autoreload
%autoreload 2
  • 2의 경우 모든 모듈에서 변화가 있을경우 자동으로 다시 패키지 로드

Apache 2.2.x 버전은 2017년 12월부터 EOL되었기에 업그레이드가 필요하다.
2.4.39에는 mod_proxy, mod_http2 등에서 보안에 취약하다고 나왔기에 2.4.41로 업그레이드 하도록한다.

아파치 2.2 버전이 eol된다는 공식 문서

Apache HTTP Server 2.2 vulnerabilities This page lists all security vulnerabilities fixed in released versions of Apache HTTP Server 2.2. Each vulnerability is given a security impact rating by the Apache security team - please note that this rating may we

아파치 httpd업그레이드 공식 문서

1. 다운로드 및 설치

wget http://apache.tt.co.kr//httpd/httpd-2.4.41.tar.gz
tar -zxvf httpd-2.4.41.tar.gz
cd httpd-2.4.41/
./configure --prefix=/home1/irteam/mocha
make
make install

2. conf 설정

- 필요한 모듈들은 주석을 제거한다.

LoadModule rewrite_module modules/mod_rewrite.so 
LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_http_module modules/mod_proxy_http.so

- 모든 요청을 거부 혹은 허용하는것을 기술하는 문법이 바꼈다.
- 그외에 default값이 변경된 것이 있을 수 있으니 upgrade문서를 참고하여 기존 conf설정을 옮겨오도록한다.

1) 모든 요청을 거부

# 2.2 설정
Order deny,allow
Deny from all

# 2.4 설정
Require all denied

2) 모든 요청을 허용

# 2.2 설정
Order allow,deny
Allow from all

# 2.4 설정
Require all granted  

3.  아파치 서버를 시작해준다 :)

sh apachectl start

+ Recent posts