스프링 프록시 기반 AOP (2) - CGLIB Proxy 이번엔 cglib를 이용한 프록시 객체 생성/동작 과정에 대해서 알아보고자 한다. 스프링 AOP 적용을 위한 프록시 방식 2가지 중, cglib가 사실상 메인으로 쓰이는데, cglib가 뭔지, 프록시 객체 생성을 위해서 cglib에서 어떤 모듈이 쓰이는지에 대해 알아보자. 메인으로 쓰인다는 것에 대한 지표등은 확인 못했지만, aop를 적용하고자 하는 메소드가 인터페이스를 구현하지 않는 경우도 많으며, 부트에서도 auto-configuration에서 default로 cglib를 선택하고 있으므로 main라고 말해도 되지 않을까.? CGLIB (Code Generation LIBrary) 해당 글을 작성하며 cglib에 대해 좀 더 자세히 보기전까진..
스프링 Proxy 기반 AOP (1) 스프링을 통해 애플리케이션을 개발할 때, 우리는 애플리케이션의 도메인과 관련된 코어 로직 개발뿐만 아니라 이 코어 기능을 제대로 동작시키기 위해 트랜잭션 관리나 로깅, 캐싱등의 관심에도 신경써야한다. 하지만 이런 부가적인 관심사들을 도메인 코어 로직에 같이 녹여야한다면 해당 모듈은 변경의 이유가 도메인 로직의 변경 뿐만이 아니게 된다. 그리고 이런 부가적인 관심사들은 전 애플리케이션의 영역이 활용이 필요하다. 그래서 스프링에선 AOP를 통해서 이런 공통적인 기능들을 별도로 분리해 필요한 곳에서 재사용가능하게 했다. 스프링에서 AOP를 적용하기 위해선 스프링에서 자체적으로 구현하고 있는 AOP 프레임워크를 사용할 수도 있고 AspectJ라는 라이브러리를 활용할 수도 있..
스프링을 사용하다보면 @Transactional과 함께 자주 사용하는 애노테이션중에 하나가 바로 @Async 일 것이다. 스프링은 애플리케이션에서 메소드의 비동기 수행이 필요한 경우, @Async 애노테이션을 통해 애플리케이션 코어 로직을 수정하지 않고도 AOP를 통해 메소드를 비동기 처리로 전환할 수 있다. 오늘은 이 스프링 비동기 실행 및 이를 위해 필요한 스레드풀 관련해서 포스팅하려 한다. 아래 Spring 코드는 5.x 기반 주의. 스프링 프레임워크 코드 및 이미지가 많아 스크롤 압박은 있을 수 있으나 내용은 실제로 그렇게 길지 않습니다. Spring Async 설정 및 메소드 비동기 수행 스프링은 일련의 작업을 수행하는 메소드를 간단하게 비동기로 처리할 수 있게끔 프레임워크단에서 AOP로 비동기..
API를 개발하다보면 API의 버전을 나눌 필요가 있다. 그런데 API가 바뀔 때가 아니더라도 UI나 아이콘과 같은 것들이 바뀔 때 클라이언트의 버전은 올라가야한다. 그래서 버전을 구분하는 것을 API Level과 Version으로 나누도록 한다. API Level: API가 추가되거나 값이 바뀔때 올라가도록 함Version: API가 변경되지 않더라도 다른 무언가가 바뀌었을 때 올라가도록 함따라서 일정 API Level에 따라 URI에 클라이언트의 버전을 path를 추가하는 방식을 사용한다. AP 서버를 운영하다보면 웹 서버 엔진을 사용하게 되는데, 나는 nginx를 사용하였기에 nginx를 통해서 API versioning을 해보았다. nginx에서 http request의 header를 변수로 가져..
OS는 OSX,pyenv와 virtualenv가 설치있다고 가정한다. 파이썬 가상환경 설정 및 앱 구축$ pyenv virtualenv 3.5.2 JWT-sample-3.5.2$ pyenv shell JWT-sample-3.5.2 $ pip install --upgrade pip$ mkdir jwt-sample && cd jwt-sample$ pip install django==1.8$ django-admin startproject jwtsite . setttings.py 변경 (jwtsite/settings.py)TIME_ZONE = 'Asia/Seoul'#########STATIC_URL = '/static/'STATIC_ROOT = os.path.join(BASE_DIR, 'static') Data..
로그는 집약과 수집을 구별해서 다룸이렇게 구별하는 이유는 각각의 목적과 정밀도가 다르기 때문집약: 웹 서버가 출력하는 로그를 항상 전송해서 한곳에 모으는 것수집: 각 서버상에 출력된 로그를 정기적으로 모아서 저장하는 것 로그를 집약하는 목적: 순간순간의 상황을 파악하기 위함 (무슨 일, 어디서 일어나고 있는지) 장애 발생시 어떤 머신에서 문제가 일어나고 있는지를 확인사이트의 액세스 상황(순간 페이지뷰, 사용자 수등을 집계) 로그를 수집하는 목적: 집계, 분석, 그리고 보존을 위함서비스 운영시 웹서버나 AP서버의 로그 집계, 분석을 기본로그 분석에는 일별, 주별, 월별등 다양한 단위의 로그가 필요한데, 이를 위해 로그가 여러군데 분산되어 있으면 불편하다. 로그 집약, 수집에는 다양한 방법이 있다. 파일이 ..
Consistent hashing: 웹서버의 갯수가 변동하는 가운데 요청을 분산하는 방법. 출처: wikipedia 해시테이블의 크기가 변할때, 평균적으로 K/n의 키만 재매핑되면 된다. 즉, 노드나 슬롯의 개수가 바뀔때, 노드의 추가나 삭제를 할 때, 오직 K/n의 아이템만 다시섞이면 됨. (n은 전체 노드의 갯수, K는 item의 개수) 기존의 해싱에서는 슬록의 개수 변화가 거의 모든 키가 다시 재매핑되야만 했다. (키와 슬롯간의 매핑이 모듈러 연산에 의해 정의되었기 때문) Consitent hashing이 사용되는 상황Consistent hashing은 분산 캐싱을 위해 나오게 되었다. 이는 변화하는 웹서버들의 수들 사이에서 요청을 분산하는 방법의 하나로 소개되었다. 또한 consistent has..
주의! 해당 글은 전문가의 의견이나 유명 사이트의 번역글이 아닙니다. 단지 공부를 하는 학생이 공부하고 그를 통해 생각하는 것을 써놨으니, 100% 신뢰할 수 없습니다. cf. 장고 프로젝트 커맨드는 '장고걸스 튜토리얼'을 참조하였습니다. 또한 개발환경은 OS X 입니다. (django 및 python 자료는 구글링하면 많습니다.) Twelve-Factor App은 전체 시스템에 특정 패키지가 암묵적으로 존재하는 것에 절대로 의존하지 않습니다.그래서 패키지의 종속성을 시스템으로부터 분리하고, 종속성 선언을 manifest를 이용해서 모든 종속성을 완전하고 엄격하게 선언해야합니다. 이렇게 하는 이유를 생각해보면, 파이썬을 이용한 장고 프로젝트에 필요한 A라는 라이브러리가 있는데, 이게 현재 내 로컬 개발 ..
View는 우리의 장고 애플리케이션에서 웹페이지의 형식인데, 그것은 일반적으로 특수한 함수를 제공하고 특수한 템플릿을 가진다. Django에서, 웹페이지와 다른 컨텐츠는 views에 의해서 배달된다. 각각의 view는 하나의 간단한 Python function(or method, in the case of class-based views.)에 의해서 표현되는데, Django는 요청된 URL(정확하게는 도메인이름 다음의 URL의 파트)을 검사함으로써 view를 고를 것이다. URL로부터 view까지 도달하는데, 장고는 URLconfs라고 알려진 것을 사용한다. 이것은 URL patterns을 views로 매핑한다. 이번 튜토리얼에서는 URLconfs의 사용에 대한 기본적인 구조를 제공하며, 그 후는 알아서..
Defines a named constant bool define ( string $name , mixed $value [ , bool $case_insensitive = false ] )Defines a named constant at runtime. *Parameters-name: the name of the constant. -value: The value of the constant; only scalar and null values are allowed. Scalar values are integer, float, string or boolean values. -case_insensitive: If set to true, the constant will be defined case_insensi..
- Total
- Today
- Yesterday
- logging
- TaskExecutor
- webserver
- good practice
- logging facade
- Spring
- async
- lood
- log
- linux
- NGINX
- JVM
- logback
- runtime data areas
- Apache
- log level
- java
- object
- slf4j
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |