'전체 글'에 해당되는 글 66건

  1. 2015.08.24 aop 예제
  2. 2015.08.23 aop
  3. 2015.08.21 옵저버 패턴의 정의
  4. 2015.08.19 jsonObject 형식
  5. 2015.08.19 HttpServletRequest/HttpServletResponse 이란?
  6. 2015.08.18 리눅스 기본 명령어 1
  7. 2015.08.17 centOS6.6 jdk1.7 설치
  8. 2015.08.13 클라이언트 ip 구하기

aop 예제

FRAMEWORK/Spring 2015. 8. 24. 19:30 |

AOP 예제 

 

XML 형식 aop 

sevlet-context.xml 에 

맨위 <beans>에 xmlns:aop="http://www.springframework.org/schema/aop" 추가 한다.


	<!-- XML 형식의 AOP -->
	<beans:bean id="loggingAspect" class="com.iuom.www.aop.LoggingAspect"/>
	
	<aop:config>
	    <aop:pointcut expression="execution(* com.iuom.www..*DAO.*(..))" id="loggingAspectPointCut"/>
	    <aop:aspect ref="loggingAspect">
	        <aop:before method="beforeMethod" pointcut-ref="loggingAspectPointCut"/>
	        <aop:after method="afterMethod" pointcut-ref="loggingAspectPointCut"/>
	        <aop:after-throwing method="errorMethod" throwing="exception" pointcut-ref="loggingAspectPointCut" />
	    </aop:aspect>
	</aop:config>



com.iuom.www..*DAO.*(..)) 이하에 모든 클래스에 pointcut 지정


com.iuom.www..*DAO.*(..)) 이하 클래스는 메소드를 실행하기전에 

aop:before 어드바이스에 의해  loggingAspect 의  beforeMethod 메소드 실행


com.iuom.www..*DAO.*(..)) 이하 클래스는 메소드 실행후

aop:after 어드바이스에 의해 loggingAspect의 afterMethod 실행


aop:after-throwing 에 의해 com.iuom.www..*DAO.*(..) 이하 모든 클래스 메소드가 실행후 에러가 나면

loggingAspect 의 errorMethod 실행




어노테이션 이용한 AOP

@Aspect
@Configuration
public class LoggingAnnotation {

	final private Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
	
	@Pointcut("execution(* com.iuom.www..*Service.*(..))")
	private void pointMethod() {}
	
	@Before("pointMethod()")
	public void testMethod() {
		logger.info("Aspect 로그 Service 체크 시작 ----->");
	}
}




'FRAMEWORK > Spring' 카테고리의 다른 글

Spring scheduler 설정 및 사용  (0) 2016.04.12
스프링 이클립스 연동하기  (0) 2015.10.20
aop  (0) 2015.08.23
Spring @PathVariable 이용하여 parameter 를 url 형식으로 받기  (0) 2015.08.13
[Spring] ehcache 캐싱하기  (0) 2015.08.12
Posted by 양승아
:

aop

FRAMEWORK/Spring 2015. 8. 23. 14:29 |

aop

-기능을 핵심 비지니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 공통모듈을 효과적으로 잘 끼어 넣도록 잘 끼워넣도록 하는 개발 방법이다.

공통 모듈(보안,로깅 등) 만든후 코드밖에서 이 모듈을 비스니스로직에 삽입하는게 바로 aop 적인 개발

코드 밖에 설정된다는 것이 핵심!


aop 가 사용되는 경우

-간단한 메소드 성능 검사

-트랜잭션 처리

-예외 반환

-아키텍쳐검증

-동기화문제

-락 설정

-예외를 만났을때 재시도하는 애스텍트

-로깅,인증,권한


aop의 구성요소

-조인포인트(joinPoint) : 횡단 관심 모듈의 기능이 삽입되어 동작할 수 있는 실행 가능한 특정위치

-포인트컷(pointCut): 어떤 클래스의 어느 조인토인트를 사용할 것인지를 결정하는 선택 기능

-어드바이스 또는 인터셉터 : 어드바이스는 각 조인포인트에 삽입되어져 동작할 수 있는 코드

인터셉터 : 인터셉터 제인 방식의 aop 툴에서 사용하는 용어로 주로 한 개의 invoke메소드를 가지는

어드바이스의 종류

before advice : 메소드 실행전에 적용되는 실행

after returning advice : 메서드가 정상적으로 실행된 후에 실행(예외를 던지는 상황은 정상적인 상황에서 제외)

after throwing advice : 예외를 발생시킬 때 적용되는 Advice를 정의

Around advice : 메서드 호출 이전, 이후, 예외 발생 등 모든시점에서 적용 가능한 advice 를 정의


-위빙(weaving) 또는 크로스컷팅(crossCutting)

:포인트컷에 의해서 결정된 조인포인트에 지정된 어드바이스를 삽입하는 과정(다른 말로 크로스컷팅)

위빙은 aop가 기존의 핵심 관심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능 추가할 수 있게 해주는 핵심적인 처리과정이다.

위빙을 처리하는 방법은 후처리기를 통한 코드생성 기술을 통한 방법부터 특별한 컴파일러 사용하는 것

이미 생성된 클래스의 정적인 바이트코드의 변환 또는 실행 중 클래스로더를 통한 실시간 바이트코드 변환

그리고 다이내믹 프록시를 통한 방법까지 매우 다양


-인트로덕션 또는 인터타입선언

:인트로덕션은 정적인 방식의 aop기술

동적인 aop장식을 사용하면 코드의 조인포인트에 어드바이스를 적용해서 핵심관심토드의 동작을 변경할수 없음

인트로덕션은 이에 반해서 기존의 클래스와 인터페이스에 필요한 메소드나 필드를 추가해서 사용할 수있음

oop에서 말하는 오브젝트의 상속이나 확장과는 다른 방식으로 어드바이스 또는 애스팩스를 이용해서

기존클래스에 없는 인터페이스 등을 다이내믹하게 구현해 줄 수 있다.


-애스팩트(aspect)

: 포인트 컷(어디에서) +어드바이스(무엇을할지)+(필요에따라 인트로덕션도포함)

aspect J 와 같은 자바 언어를 확장한 aop에서는 마치 자바의 클래스처럼 에스팩트를 코드로 작성할 수 있다.aop 툴의 종류에 따다서 어드바이와 포인트컷을 각각 일반 자바 클래스로 작성하고 이를 결합한 어드바이저 클래스를 만들어서 사용하는 방법도 있음.



aop 설정 구조


<aop:config>

<aop:pointcut>  :pointcout 설정

<aop:aspect> : aspect 설정

<aop:before> : method 실행 전

<aop:after-returning /> : method 정상 실행 후

<aop:after-throwing /> : method 예외 발생 시

<aop:after /> : method 실행 후 (예외 발생 예부 상관 없음)

<aop:around /> : 모든 시점 적용 가능

</aop:before>

</aop:aspect>

</aop:config>




Posted by 양승아
:


옵저버패턴

옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 자동으로 갱신되는 방식으로 일대다 의존성(one-to-many)을 정의한다.


옵저버 패턴 조건

객체간의 결합도는 높아질수록 유지보수가 힘들기 때문에 일단 객체간의 결합도는 낮추는게 일반적이다.

옵저버를 언제든지 추가하려고 할때도 주제를 전혀 변경할 필요가 없다.


예제

가상 모니터링 애플리케이션을 구현해보자.

이 시스템은 다음과 같이 3개의 요소로 어루어져 있고(가상 스테이션, 날씨 데이터, 디스플레이 장비) Weather Data를 통해서 3개 혹은 그 이상 디스플레이 장비에 데이터를 보여주게 된다.





분석

1. 옵저버 패턴의 정의를 떠올리면 one-to-many 관계이므로 one = Weather Data , many = Display 장치가 된다

2. Weather Data 객체를 주제객체로 하고 Display 장치에서 옵저버로 하는 경우 Display 애서 자기가 원하는 정보를

    얻기위해  Weather Data 객체에 등록할수 있는 registerObserver()메소드가 필요하다.

3. 모든 Display 장치는 항목이 다를 수 있다. 그러므로 바로 이 부분이 공통 인터페이스를 이용해서 처리가 가능함

   각 장치마다 구성 요소의 형식이 달라도 똑같은 인터페이스를 구현해야만 Weather Data 객체에서 기상 스테이션으로 측정값을 보낼      수 있다.

4. 즉 모든 디스플레이 장치는 Weather Data 에서 호출할 수 있는 update()메소드가 필요하다. 그리고 이 update() 메소드는 모든 장치들    이 구현하는 공통 인터페이스에 정의 되야 한다.



옵저버 패턴 적용

UML 확인하고 코딩하기!




Observer .java


Subject .java

DisplayElement .java

WeatherData.java

CurrentConditionsDisplay.java

Main .java


display는 하나만 구현함!

동작 시나리오

① WeatherStation에서는 온도, 습도, 기압 정보를 수집한다.

② WeatherStation에서 주기적으로 (30분에 한번식) 현재 데이터(온도,습도,기압)을 WeatherData에 던져 준다.

③ WeatherData는 새로운 데이터를 받으면, Observable에 Observer로 등록되어 있는, 현재상태 출력장비(CurrentConditionDisplay)와 기압변동 출력장비(ForecastDisplay)에 새로운 데이터를 전달한다.

④ 현재상태 출력장비와 기압변동 출력장비는 새로운 데이터(온도, 습도, 기압)을 각자의 활용 방법에 따라 화면에 출력한다.

⑤ WeatehrStation에서 다시 새로운 데이터를 던져준다. 

⑥ ①~④ 번이 반복되며, 주기적으로 현재상태 출력장비와 기압변동 출력장비는 새로운 데이터를 출력한다.


java에서 제공하는 옵저버 패턴 적용




WeatherData.java


CurrentConditionsDisplay .java

Main.java

 java.util.Observable.class  확인


java.util.Observable.class


소스코드 보기


- addObserver(Observer o) : 옵저버를 등록한다. 이후에 들어오는 데이터는 등록된 옵저버에 전달된다.

- deleteObserver(Observer o) : 옵저버를 제거한다. 이후에 들어오는 데이터는 해당 옵저버에 전달되지 않는다.

- notifyObservers(), notifyObservers(Object arg) : 새로운 데이터가 들어오면 등록된 옵저버에 새로운 데이터와, 파라미터를 전달한다.

- deleteObservers() : 등록된 모든 옵저버를 제거한다. 이후에 들어오는 데이터는 전달되지 않는다.

- setChanged() : 신규 데이터가 들어오면, changed 값을 true로 변경, changed 변수가 true 일때만 데이터가 옵저버에 전달된다.

- clearChanged() : changed 값을 false 로 변경한다. 신규 데이터를 옵저버에 전달이 완료되면 clearChanged()를 호출한다.

- hasChanged() : 현재 changed 의 값을 반환한다.

- countObservers() : 현재 등록되어있는 옵저버의 수를 반환한다.



자바의 내장된 옵저버 패턴 이용 (Observable)


- setMeasurements(float temperature, float humidity, float pressure) : 기상스테이션에서 온도, 습도, 기압 측정값을 전달할때 호출한다. 파라미터로 받은 데이터를 갱신하고 measuermentChanged()를 호출한다.

- measurementsChanged() : 옵저버에 전달할 새로운 데이터가 있다고 알리고(setChanged()), 등록된 옵저버에 데이터를 전달한다.(notifyObservers())  (setChanged()와 notifyObservers()는 Observable에서 상속받은 함수이다.)


보는것과 같이 WeatherData.java는 Observable 을 상속하였다. 따라서 Observable의 함수를 사용하여, Observer들에게 데이터를 전달할 수 있다.


15열의 setMeasurements() 함수와 24열의 measurementsChanged() 함수를 보자

기상스테이션(WeatherStation.java)는 주기적으로 데이터(온도,습도,기압)값을 WeatherData의 setMeasurements() 함수를 사용하여 전달한다.

setMeasurements()는 전달받은 데이터를 각 변수에 갱신한 뒤, measurementsChanged() 함수를 호출한다.


measuremensChanged() 함수는 Observer에게 데이터를 전달한다.

먼저 setChanaged() 함수를 호출하여, 전달할 새로운 데이터가 있음을 설정한다. 그리고 notifyObservers() 함수를 호출하여, 갱신한 새로운 데이터를 각 등록된 옵저버에게 전달한다.


정말 간단하다. Observable 을 상속한뒤, 옵저버들에게 데이터를 전달할 때, setChanged()와 notifyObservers()를 순차적으로 호출하면 된다. 그러면 데이터가 등록된 옵저버들에게 전달되는 것이다.







'JAVA > Design patten' 카테고리의 다른 글

factory method pattern  (0) 2019.04.27
singleton-pattern  (0) 2019.04.27
Decorator Pattern (데코레이터 패턴)  (0) 2015.09.03
Posted by 양승아
:

jsonObject 형식

카테고리 없음 2015. 8. 19. 11:08 |

jsonObject 란?

jsonObject 는 json형태의 데이터를 관리해 주는 메소드.

jsonObject 는 0개 이상의 키/값 쌍으로 구성된 정렬되지 않은 컬렉션이다.


속성

JsonObject.Count         jsonObject 에 포함된 키/값 쌍의 수를 반환

JsonObject.jsonType     jsonObject 의  json 형식을 가져옴 jsonValue.jsonType를 재정의함

jsonObject.keys           jsonObject의 키가 포함된 컬렉션을 반환함

jsonObject.Values        jsonObject의 값이 포함된 컬렉션을 반환함




사용법


결과값 

{"이름":"양이","거주지":"서울"}

{"key":"value"} 이렇게 표시된다.




키값에 대한 value 를 얻고 싶다면

하면 key에 해당하는 value 를 반환한다.



JSON형태의 String을 JSONobject에 넣는법


Posted by 양승아
:



HttpServletRequest 

-ServiceRequest의 하위

- 클라이언트의 요청과 관련된 정보와 동작을 가지고 있는 객체 !(클라이언트 ip정보,쿠키,헤더,get/post로 전송한 값 가져옴)

- Web Container 가 생성하여 service()의 인수로 넘겨준다.

- 요청파라미터 조회

- HttpSession 조회

- request scope 상의 component 간의 데이터 공유 지원



데이터 읽어오는 방식

String value = getParameter(String name)
String [] values = getParameterValues(String name)
Cookie cookies[] = request.getCookies(); //쿠키
HttpSession session = request.getSession(); //클라이언트의 세션 정보


요청파라미터

- 클라이언트가 CGI(서블릿)으로 전송하는 데이터

- CGI가 처리하기 위해 클라이언트로 부터 입력받아야 하는 데이터

- html <form> 태그나 QueryString 를 이용해 전송한다.

- name = value 형태로 전송


HttpServletResponse 

- 응답할  클라이언트에 대한 정보와 동작을 가지고 있는 객체

- Web Container가 생성하여 service()의 인수로 넘겨준다

- 응답 header 정보설정(Content Type 설정)

- redirect 방식으로 수행 넘기기





'JS > javaScript' 카테고리의 다른 글

중복클릭방지 자바스크립트  (0) 2016.01.06
Posted by 양승아
:

리눅스 기본 명령어



adduser 이용자 추가

# adduser testUser

testUser 아이디를만든다.

# adduser -p testPw -g group -s '/bin//bash' -d '/home/www'testUser

비밀번호가 testPw 이고 그룹은 group 이고 쉡은 bash 홈디렉토리리는 /home/www 인 testUser란 아이디를 만든다. 


alias 자주쓰는 명령어 변경

# alias dir='ls -al'

 ls -al 를  dir 명령어로 변경


bash 셸을 변경

# bash

bash 셸이 리눅스 기본 명령어인데 bash 셸이 아닌 사용자가 셸을 변경하고자 할때 사용한다.



파일 관련 기본 명령어 


cd 디렉토리 이동

# cd /usr/local/tomcat

/usr/local/tomcat 으로 이동

# cd 
최상위 루트로 이동
# cd ..
현재 디렉토리에서 한단위 아래 디렉토리 이동

ls 디렉토리 내용물 보여줌
# ls -al 
숨겨진 파일까지 모두 보여줌
# ll
# ls -l
파일 길게 리스팅(퍼미션,하드링크,소유자,그룹,파일크기,파일생성기간,파일이름,파일 순으로 보여줌)


mkdir 디렉토리 생성

# mkdir newDirectory

디렉토리 생성


rm 파일,디렉토리삭제

# rm filename

파일 삭제

# rm -r Directory

rm 은 파일만삭제 가능, 디렉토리는 rm -r 사용

# rm -rf 

확인 절차 없이 삭제 


cp 복사 

# cp fileName fileRoot 

# cp -r

cp 로는 디렉토리 내의 모든 파일들과 서브 디렉토리 내의 파일들을 한번에 복사 할 수 없다.

이럴때 cp -r 를 사용하여 해당 디렉토리의 모든 파일과 서브 디렉토리를 원하는 곳으로 복사한다.

새로 복사할 디렉토리가 없는 경우 복사와 동시에 생성 가능하다.

예를 들어

# cp -r . /home/newRoot

라고 하면 . 현재 디렉토리에 있는 모든 파일과 서브 디렉토리를 /home/newRoot로 복사된다.


* cp -r , rm -r !!! 여기서 -r 은 비슷한 의미를 갖음



mv 파일이동

# mv filename destination

목적지 디렉토리가 없으면 디렉토리 만들어서 옮겨짐

# mv old.txt new.txt 

old.txt 파일이 new.txt로 이름변경됨


ln -s 심볼릭링그(Symbolic link)

# ln -s filename linkname

심볼릭 링크는 윈도우릐 바로가기, 맥의 가상본과 유사하다

 

퍼미션 설정

퍼미션 이란 '허가' 를 뜻하는데 디렉토리를 누가 볼수 있고, 누가 새로운 내용을 기록할 수 있고, 실행할 수 있는지 설정하는 것입ㄴ디ㅏ. 

즉 파일수준의 보안 !

#ls 명령어를 실행하면 퍼미션을 확인 할수있다.

첫번째 = 파일인지(-),디렉토리인지(d)

그다음부터 나오는 알파벳은 디렉토리 퍼미션을 나타냄

퍼미션을 나타내는 9개의 알파벳은 3개씩 끊어서 각각 user,group,other 의 퍼미션을 나타냄

예를들어

-rwxw-r--

이것은  세 개씩 끊어서, rwx,rw-,r-- 로 읽는당. 각각이 user, group,other 의 퍼미션이다.

rwx 는 read , write, 실행 모두 허용

rw- 는 read,write 읽기,쓰기 허용

r-- 는 read 허용


기본적으로 설정되는 퍼미션은 rw-r--r--이다.


chmod 퍼미션변경 


# chmod +w myprogram

user,group,others, 모두에 쓰기 퍼미션이 첨가

# chmod u+w myprogram

 user(=u)에만 쓰기 퍼미션 추가

# chmod o-w  myprogram

 other에 쓰기 퍼미션 제거


chown , chgrp 퍼미션 user, group 변경

# chown myprogram linuxer 

유저 변경

# chgrp myprogram linuxer 

그룹변경

*root로 로그인시나 해당 owner 일때 변경 가능


rpm 관련 기본 명령어

레드햇 리눅스를 사용하는 경우 소프트웨어들이 rpm 패키지 형태로 배포되는 것을 볼 수 있다. 


# rpm -Uvh

rpm 를 이용해서 소프트웨어를 인스톨할 때 사용함.

rpm -Uvh --nodeps

의존성 때문에 인스톨 안될경우 사용

# rpm -qa

현재 서버에 어떤 rpm 패키지가 인스톨되어있는지 확인하는 명령어

# rpm -e

삭제 명령어


압축,해제 관련 기본 명령어


# tar xvzf 파일

tar로 압축한다음 gzip으로 압축된 파일은 한번에 압축 해제부터 보따리 풀기 까지 시행해 주는 명령어

# tar cvzf

여러개 파일을 tar로 묶은다음 압축 하는 명령어

# tar cvf 

압축하진 않고 파일을 묶어주는 명령어

# gzip 

gzip방식으로 압축하는 명령어

# gunzip

.gz 파일을 푸는 명령어 


기타 명령어


# whoami

로그인한 id 출력하는 명령어

# su

슈퍼유저, 즉 root 로 로그인하겟다는 명령어

# whereis

어떤 프로그램이 인스톨 되었는지 쉽게 알아보는 명령어

= (# which) 

인스톨 된 경로도 나옴

#man 

명령어 등의 메뉴얼 페이지 출력


'SERVER > LINUX' 카테고리의 다른 글

VI 명령어  (0) 2016.09.23
계정 권한(퍼미션 설정)  (0) 2016.04.08
centOS6.6 jdk1.7 설치  (0) 2015.08.17
Posted by 양승아
:

centOS6.6 jdk1.7 설치

SERVER/LINUX 2015. 8. 17. 20:23 |

기본 시스템 업데이트 

#yum -y update


wget 설치

#yum -y install wget


jdk설치

# yum list all | grep jdk


# yum install java-1.7.0-openjdk-devel.x86_64


설치후 

java 버전 확인

# javac -version


심볼릭 설정

# ln -s jdk-7u1-linux-x64.rpm java



jdk 경로 설정

# vi /etc/profile



2
3
#JAVA JDK7
export JAVA_HOME=/usr/java/java
export PATH=$PATH:$JAVA_HOME/bin

파일 적정한 위치에 설정 (난 맨위에 추가함)

변경된 프로파일 적용

# source /etc/profile 


'SERVER > LINUX' 카테고리의 다른 글

VI 명령어  (0) 2016.09.23
계정 권한(퍼미션 설정)  (0) 2016.04.08
리눅스 기본 명령어  (1) 2015.08.18
Posted by 양승아
:

JAVA 클라이언트 IP 구하기


클라이언트 ip 가져오는 방법은 아래와 같다.


Request.getRemoteAddr();

Requset 객체의 getRemoteAddr() 메소드를 호출한다.

로컬로 테스트 한다면 127.0.0.1 의 값을 가져올것이다.


만약 IPv6 형식(0:0:0:0:0:0:01)과 같은 형식으로 반환되면 

eclipse 환경 변수 설정 다이얼로그 띄운다.


Run -> Run Confiugations -> 좌측트리메뉴에서 Apache Tomcat 서버 선택 

-> Arguments 탭 메뉴 선택 -> VM Arguments 텍스트 박스 영역


"-Djava.net.preferIPv4Stack=true"

텍스트 박스 가장 하단에 위의 코드를 추가함





또는  톰캣서버 환경 설정 파일에서 직접 변경하기

\bin\catalina.bat 파일열기 

set JAVA_OPTS 검색하여


:noJuliConfig

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%


:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%


위의 2개의 설정 값에  -Djava.net.preferIPv4Stack=true 추가 해준다



:noJuliConfig

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Djava.net.preferIPv4Stack=true


:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER% -Djava.net.preferIPv4Stack=true



위처럼 추가하면 127.0.0.1 로 나온다~!


'JAVA > JAVA' 카테고리의 다른 글

제네릭 개념 알기  (0) 2017.05.16
다형성  (0) 2015.08.28
java foreach 반복문  (0) 2015.08.13
JAVA 앞뒤 공백제거 trim()  (0) 2015.08.13
[java] URL(xml파일) java 파싱하는 방법  (0) 2015.08.12
Posted by 양승아
: