AOP 관련 단어 정리


안녕하세요.
고코더 입니다.


이전 시간에는 AOP라는 의미에 대해 알아보았습니다. 이번 시간에는 사용하는 용어에 대해 알아보겠습니다. 



AOP 관련 용어


1. Aspect
기본적으로 AOP는 흩어진 Aspect들을 모아서 모듈화 하는 기법을 말합니다. 사전적으로 말하며 흩어진 관심사를 모듈화 한 것입니다. 부가기능을 모듈화 합니다.

2. Target
타겟은 Aspect할 대상을 말합니다. 핵심 기능을 담고 있는 모듈들은 부가기능을 부여할 대상이 됩니다.

3. Advice
실질적인 부가기능을 구현한 구현체를 말합니다. 어떤 동작을 해야할지 대한 것들입니다.

4. Joint Point
Advice가 적용될 위치에서 끼어들 수 있는 지점을 말합니다. 다양한 시점에 적용가능 합니다. (ex 메서드, 생성자 호출, 필드에서 값을 꺼낼때) 

5. PointCut 
JointPoint에서 상세한 스펙을 정의한 것 입니다. Advice가 실행될 지점을 구체적으로 정할 수 있습니다. 




advice 어노테이션


1. @Before 
 - advice 타겟에서 메소드가 호출되기 전 시점

2. @After
-  결과에 관계 없이 타겟 메소드 완료 후 시점

3. @AfterReturning 
- 타겟 메소드가 성공적으로 결과값을 반환 후 시점

4. @AfterThrowing 
- 타겟 메소드가 수행 중 예외 발생 후 시점

5. @Around  
- 어드바이스가 타겟 메소드를 감싸 타겟 메소드 호출 전후에 실행


마무리


하.. 어렵다


댓글을 달아 주세요


Plain old Java object 란?


안녕하세요.
고코더 입니다.


오늘인 POJO라는 개념을 알아봅니다. 개인적으로 몰라도 될거 같은 개념이지만 면접자들은 이걸 질문하기 좋아하므로 알아봅니다. 이 개념은 철학에 가깝습니다. 물런 구체화 하면 특정 방식의 소스가 POJO가 됩니다.



 1. POJO란 한줄로 표현하면?


"프레임워크에 종속된 무거운 객체를 만들게 된 것에 반발해서 사용되게 된 용어"


 2. 탄생 배경




마틴 파울러는 자바의 단순한 오브젝트를 이용하여 로직을 구현하는게 나은데 왜 EJB처럼 복잡하고 제한 많은 기술을 이용할까? 라는 의문이 들었습니다. 마틴은 그저 그럴싸한 이름이 없는게 원인 일까 싶어  POJO를 만들었습니다. 평범한 자바오브젝트에 멋진 이름을 붙여줬던 시도는 기대 이상으로 성공적이었다고 합니다.

우리는 사람들이 자기네 시스템에 보통의 객체를 사용하는 것을 왜 그렇게 반대하는지 궁금하였는데, 간단한 객체는 폼 나는 명칭이 없기 때문에 그랬던 것이라고 결론지었다. 그래서 적당한 이름을 하나 만들어 붙였더니, 아 글쎄, 다들 좋아하더라고. -마틴 파울러 -



 3. POJO의 정의


POJO는 Java 언어 규약에 의해 강제된 것 이외의 제한에 구속되지 않는 Java 오브젝트 이어야 합니다.

1.  지정된 클래스를 extends 하면 안된다.

2. 정의된 인터페이스를 implement 하면 안된다.

3. 정의된 Annotation을 포함하지 않는다



 4. POJO 기반 코드란?


1. 객체지형적으로 설계 되었는가?

재활용 가능하고 반복적인 템플릿이 없는 특징이 있습니다. 객체지향적으로 자바를 개발되어 있는지 확인해야 합니다

2. 테스트가 용이한가?

POJO 철학을 이용해 만들어진 어플리케이션은 자동화된 테스트 코드 작성이 편리해야 합니다. 자동화된 테스트 코드를 개발 해야합니다.


마무리


사실 외우긴 했는데 쓰면서도 잘 모르겠네요.


댓글을 달아 주세요


Dependency Injection , Inversion of Control 를 알아보자


안녕하세요.
고코더 입니다.



오늘은 의존성 주입(Dependency Injection)을 다뤄봅니다. 스프링의 핵심 개념중에 하나 입니다. 스프링에서 가장 중요한 핵심입니다. 이 부분때메 자바 서블릿을 하다. 스프링을 만나면 헤매게 되는 이유입니다. 100프로 이해하려면 현업에서 장점을 마주칠때 이해가 조금씩 되나 머리속에 잘들어오지 않는 개념입니다. 그러므로 그냥 얘는 원래 이러구나라고 생각하면 될거 같습니다.



 1. DI를 한줄로 요약하면


"객체간의 의존성을 외부에서 주입하는 개념"


 2. 비유



최근에 생긴 오락실을 가니깐 동전 넣는 부분이 없습니다. 그래서 물어보니 목에 매는 카드를 하나 줍니다. 이걸 가지고 게임을 원하는 만큼하고 계산대에서 카드로 계산하면 되는 방식이었습니다. 덕분에 동전 흘리고 다니지 않으면서 게임을 할 수 있었습니다. 여기서 나온 목에 매는 결제를 대신하게 하는 카드는 주입된 객체입니다. 철권이 한판에 500원이었습니다. 그런데 마진이 안남아 주인은 한판에 1000원을 올립니다. 기존 오락실이라면 각 오락기마다 가서 옵션을 수정해줘야 하지만 이 오락실은 사무실 컴퓨터에서 옵션을 변경하면 카드를 찍을때 1,000원 으로 찍히게 하면 됩니다.  그리고 19세 이상만 할 수 있는 게임이라면 게임카드에 조건을 걸어서 특정 카드는 성인게임을 못하게 막을 수도 있습니다. 외부에서 모든 게임 설정을 주입합니다.


외부에서 오락기에 가격을 통제하는 이 방식이 의존성 주입입니다. 


 3. DI 아주 단순한 예제


가장 단순하고 직감적으로 소스를 보여드리겠습니다.

1. beans.xml 
해당 XML 파일에 의존성을 주입합니다. Gocoder라는 클래스를 GC라고 id를 부여합니다. 그러면 해당 주입된 객체는 이제 사용이 가능합니다.

1
<bean id="GC" class="bean.GoCoder" />
cs

2. hi.java
gc라고 명명한 객체를 생성하여 소스에서 사용합니다. 이렇게 XML이라는 외부에서 주입하는것이 바로 의존성 주입입니다.

1
2
3
jGC gc;
    public HI (Printer printer){
}
cs


 4. IoC 제어의 역전


스프링하면 가장 먼저 떠올라야 하는 단어가 IoC입니다. 번역하면 제어의 역전이라는 뜻입니다. 기존의 제어권은 개발자가 결정하였지만 이를 역전하여 스프링에서 하겠다는 말입니다. 프레임워크 내부에서 결정된 사항대로 개발이 흘러가는걸 제어의 역전이라고 합니다. 

객체의 생성애서 생명주기의 관리 객체에 대한 모든 제어권이 바뀌었다는 뜻입니다.

개발자가 라이브러리를 불러와서 직접 개발했던 행위에서 프레임워크 내에 라이브러리가 구성되고 개발자는 프레임워크에서 작성된 방식대로 코드를 호출하기 때문에 주도권이 스프링에게 있게 됩니다.


마무리


어렵죠? 저도 맨날 까먹어요


댓글을 달아 주세요


관점으로 본 AOP


안녕하세요.
고코더 입니다.


OOP는 훌륭한 객체 프로그래밍입니다. 하지만 공통적으로 트랜잭션처럼 반복되는 중복코드가 생기는 단점이 있습니다. 중복코드를 좀 더 줄이고자 하여 탄생한게 AOP 입니다. 
Aspect Oriented Programming 의 약자입니다. 직역하자면 "관점 지향 프로그래밍" 이라고 할 수 있습니다. 오늘은 AOP가 어떤 관점이 있는지 알아봅니다.


 1. AOP를 한줄로 정리하면?


"애플리케이션 전체에 걸쳐 사용되는 기능을 재사용 하도록 지원하는 개념"



 2. 비유


병원에 환자가 입원합니다. 맹장 수술이 필요하다고 합니다. 전날에 약을 먹고 금식을 지도하는걸 간호사가 합니다. 그리고 당일날 수술실에 환자를 눕히고 조명을 밝히고 수술 부위 소독과 매스까지 준비합니다. 그럼 의사가 들어와서 바로 수술에 들어갑니다. 
여기서 AOP는 간호사의 역할을 합니다. 어떤 수술이든 해당 과정은 동일합니다. 수술 외에 부가적으로 보면 전날 금식을 지도하고 수술을 준비하는건 매번 동일합니다. AOP는 이런 공통적 요소를 추출하여 재사용하는 기법입니다.
(더 좋은 비유 있으면 댓글을..)



 3. 부가기능 관점으로 바라보는 것


1. OOP (핵심기능 관점)

기존의 OOP는 서비스를 바라보는 시점은 핵심기능으로 바라보았습니다. 글쓰기와 통계확인이라는 서비스를 개발하고 기능별로 조립하도록 하였습니다. 자바는 다중 상속을 지원하지 않아서 핵심기능으로 바라보는 측면도 있습니다.




2. AOP (부가기능 관점)

AOP는 부가기능의 관점으로 이를 바라봅니다. 그리고 이런 공통적인 요소를 추출하는 것이고 이를 관점 지향 프로그래밍이라고 말합니다. 

- 공통 기능이 하나의 장소에서 관리
- 이 외에 모듈을 신경쓰지 않고 개발만 충실하게 하도록 한다



마무리


AOP는 계속 시리즈로 알아보겠습니다. 



댓글을 달아 주세요



싱글톤을 알아보자


안녕하세요.
고코더 입니다.


싱글톤(Singleton) 패턴을 알아보려고 합니다. 싱글톤은 최초에 한번만 실행합니다.  애플리케이션이 시작될때 최초 한번만 메모리를 할당하는 방법입니다. 동일 인스턴스를 사용하게 하는 특징이 있습니다. 다시 말해서 인스턴스가 프로그램 안에서 하나만을 생성되게 하고 이 인스턴스를 접근하게 만든 패턴입니다. 


 1. 싱글톤 비유


외로운 남자 일러스트 이미지 검색결과

결혼 안한 사람을 우린 싱글이라고 합니다. 싱글남은 소개팅을 하러 나갑니다. 매번 나간 소개팅에서 옷이랑 머리 스타일은 변하지만 사람은 그대로 입니다. 소개팅을 주선하는 주선자는 매번 똑같은 사람인 이 싱글남을 소개합니다. 싱글남은 언제나 준비되어 있고요. 항상 소개팅을 나갈 준비가 되어 있습니다. 싱글톤도 이와 같습니다. 최초에 소개팅 시켜준 그 남자가 결혼할때까지 전화번호를 저장해서 똑같은 사람에게 호출합니다. 같은 남자를 계속 호출하는 방법입니다. (..좀 어거지죠?)



 2. 예제소스 


싱글패턴에서는 private staic으로 선언을 합니다. new로 객체를 만들때 private 를 이용해 외부에서 객체를 생성할 수 없도록 합니다.  다시 한번 객체 생성을 요청하면 아래와 같이 기존의 객체를 사용하도록 합니다. 기본 생성자도 private를 사용해 외부에서 직접 생성하지 못하도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
    private static Singleton singleton = new Singleton(); // 외부에서 생성하지 못하게 한다.
 
    private Singleton() // 외부에서 생성하지 못하게 한다.
 
    public static Singleton getInstance(){
        if( singleton == null ){    // 또 다시 객체를 생성 요청시에 생성하지 않는다.
           singleton = new Singleton();
        }
 
        return singleton;
    }
}
cs

getinstance를 사용해 호출합니다. 객체가 생성되었다면 그대로 있던 객체를 반환하고 없다면 객체를 만들어 반환하겠죠

1
Singleton singleton1 = Singleton.getInstance();
cs



마무리


싱글남은 죄송합니다.
(고코더는 기혼)


댓글을 달아 주세요



자바에서 공백 값과 널(Null) 값의 차이는?


안녕하세요.
고코더 입니다.

자바에서 null 값과 ""(빈 공백)은 어떻게 다른지 알아보려고 합니다. 얼핏보면 비슷해보이지만 완전히 다른 개념을 가지고 있습니다.


 1. null


널(null)은 어떠한 값으로도 초기화 되지 않은 것입니다. 이렇게 초기화된 데이터는 내가 사용할 예정이다 정도로 컴파일러는 생각합니다. 그래서 참조형이지만 힙메모리상에 데이터를 만들어 내지 않습니다.

1
String a = null;  
cs




 2. ""(공백)


공백 값은 사실 하나의 스트링입니다. 예를 들면 "gocoder"로 변수를 선언한거처럼 빈 값을 메모리에 할당한 행동입니다.  

1
String b = "";
cs




 3. 차이점 다시 정리


null은 사용하겠다고 예고만 해놓은 상태라면
""은 이미 사용한 것입니다. 


마무리


실무에서는 공백으로 변수를 선언하지만 사실은 null로 해야 하는게 맞습니다. 


댓글을 달아 주세요


자바 옵저버 패턴을 분석 해보자


안녕하세요.
고코더 입니다.


오늘은 옵저버 패턴에 대해 알아봅니다. 좋은 글들이 많지만 조금은 어려운게 많아 최대한 쉽게 설명해보겠습니다.



 1. 옵저버 패턴이란?

옵저버 패턴(Observer Pattern)을 이해 할때 좋은 이미지가 있습니다. 바로 스타크래프트에 옵저버 입니다. 프로게이머는 이 유닛들에게 명령을 내립니다. 예를 들면 "모두 본부로 귀환하라" 그럼 통지 받은  옵저버들은 본부로 이동합니다. 그러다 중간에 옵저버가 파괴 되기도 하고 대열에 이탈하기도 합니다. 그렇지만 다른 옵저버들은 각자 할일을 합니다. 느슨한 관계입니다. 마우스가 주체이고 옵저버들이 객체 입니다. 마우스가 많은 옵저버에게 명령을 내리는 1:N (1대다) 관계입니다. 이 와 같은 모습이 옵저버 패턴의 이미지와 비슷합니다.


 2. 옵저버 패턴 설명



제가 운영하는 블로그를 예를 들어보겠습니다. 제 블로그를 구독하는 분들은 제가 쓴 글을 피드로 빠르게 받아 볼 수 있습니다. 이 분들이 바로 옵저버 객체들입니다. 언제든지 제가 쓰는 글을 볼 준비가 되어 있습니다. 



 3. 느슨한 결합



새로운 구독자가 들어와도 블로그는 변함없이 자신의 일을 합니다. 이게 옵저버 패턴의 특징입니다. 객체는 언제든지 구독하기도 하고 해지하기도 합니다. 느슨한 결합(Loose coupling)이라고 합니다. 옵저버가  어던 일을 하든지 주체자(고코더 블로그)는 상관없습니다. 영향을 주지 않는 관계 입니다. 단지 옵저버가 특정 인터페이스를 구현한다는 것만 알고 있습니다.



 4단점


인터페이스 구성이 아닌 import java.util.Observe 패키지의 클래스로 기능을 구현합니다. 그렇기 때문에 프로그램을 재활용을 위한 재구성이 어렵습니다. 


마무리


구현만 하면 제일 속 편한 디자인 패턴


댓글을 달아 주세요


이퀄과 == 두 개의 비교 기능 뭐가 다를까?


안녕하세요.
고코더 입니다.


자바에서는 대표적인 두 가지 데이터 비교 방법이 존재합니다. 바로 "equals"와 "==" 입니다.


 1. 공통점


우선 공통점 부터 다뤄보려고 합니다. 이 둘은 데이터를 비교하는 기능을 합니다. 비교한 데이터를 논리형으로 리턴합니다. 즉 true 아니면 false 겠죠. 이런 기능을 통해 두 개의 데이터를 비교하여서 로직을 완성합니다.



 2. 형태의 차이점


이 둘은 근본적으로 형태가 다른 점이 존재합니다.

equals() 는 메소드입니다.
열기 닫기를 같이 쓰는걸 보면 메소드 이란걸 알 수 있습니다. 

== 는 비교 연산자입니다.
비교를 위한 연산자 입니다. 


 3. 비교 방식


이제 진짜 다른 점을 다루겠습니다. equals 는 값을 비교합니다. == 는 참조 주소값을 비교합니다. 이렇게하면 이해가 어렵죠? 다시 한번 설명해보겠습니다.

문자를 저장하는 string은 참조형입니다. 특정 글자를 담으면 힙메모리에 저장되고 참조 주소 값을 가져옵니다. 예시를 들면 이렇습니다. 

두 대의 자동차가 있습니다. 같은 모델입니다. 이때 equals를 비교하면 이 둘 은 같습니다. 그런데 번호판을 보니 하나는 서울에서 출고했고 다른건 부산에서 출고했습니다. 이 둘을 ==으로 비교하면 값이 다릅니다. 왜냐면 주소 값이 다르니깐요.


 4. 예제 소스


아래에 소스를 만들어봤습니다. 이를 통해 한번 어떻게 비교되는지 알아보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
String a="GoCoder";
String b="GoCoder";
String c=new String("GoCoder");
 
== b
// true
 
==c
// flase
 
a.equals(b)
// true
 
a.equals(c)
// true
cs


결론은 비교 연산자 == 일때 new를 통해 새롭게 참조값을 생성할 경우 기존 string 과 다르기 때문에 주소값을 비교할시 다른 것입니다. 실무에서는 결과 값을 비교하는 경우가 많아서 equals를 사용하는 경우가 많습니다.


마무리


차이가 많죠.


댓글을 달아 주세요


참조형을 알아보자


안녕하세요.
고코더 입니다.


오늘은 참조형을 알아보려고 합니다. 이전에 알아본 기본형이랑 다른 속성이라고 생각하면 됩니다. 참조형은 객체의 저장 공간을 주소를 저장합니다. 기본형 8가지 이외에는 모두 참조형이라고 생각하면 쉽습니니다. 참조형 변수는 null 값을 기본으로 가지고 있고 정의된 생성자를 통해 생성 됩니다. 힙 메모리 공간에 저장 됩니다.

- 기본형을 제외한 자료형
- 참조 값을 가진다.
- 클래스를 자료형으로 선언할때
- 배열, 스트링등
- 힙(heap)의 할당 된다.Reference type(참조형)




대표적인 참조형


 배열

1
int[] gocoder_arry = {123};
cs

 열거

1
Enumeration<String> e = g.elements();
cs

 클래스

1
GocoderClass gc = new GocoderClass();
cs

 스트링

1
String str = "gocoder";
cs

 인터페이스 

1
public interface interface { }
cs


마무리


기본형외에는 모두 참조형입니다.




댓글을 달아 주세요


스태틱이란 무엇일까요?


안녕하세요.
고코더 입니다.


스태틱이 붙은 변수나 메소드는 동적으로 생성할 필요 없이 바로 꺼내쓸수 있습니다. 전역변수 입니다. 프로젝트 어디에서든 쉽게 접근이 가능합니다. 공통으로 자주 꺼내어 사용해야 할 데이터들을 관리할때 좋습니다. 

메모리 종류에 대한 글을 한번 더 확인해보세요.
-> JAVA 메모리 - 스태틱(static), 스택(stack), 힙(heap) 이란?




- static은 변수나 메소드에 키워드로 사용
- static 키워드를 사용하면 클래스가 메모리에 올라갈 때 자동으로 생성 후 고정
- 인스턴스 생성 없이 사용가능 


 1. 어떤 상황에서 사용할까요?


자주 사용하지만 프로그램마다 공통으로 써야 하는 부분에서 사용해야 합니다. 실무에서는 보통 로그인한 고유키를 저장하여 인증에 사용합니다. 그리고 브라우저에서 가로채이면 안되는 정보들을 서버에 저장해서 보호하기도 합니다. 우리가 사용하는 스마트폰에 전화번호와 같습니다. 언제 어디서든 전화를 받을 수 있는 것 처럼 어디서든 사용가능 합니다. 


 2. 예제소스


스태틱으로 변수나 메소드를 생성하면 바로 꺼내어 사용이 가능합니다. 그럼 메모리의 상주하면서 어디서든 쓰게되면서 메모리를 낭비하겠죠.

1
2
3
4
5
6
7
public class GocoderClass{
    static public int age = 1;
    static public void blog(){}
}
 
StaticTest.age;
StaticTest.blog();  
cs


마무리


스태틱을 사용하면 개발이 쉬운데 서버는 견디기 어렵겠죠.


댓글을 달아 주세요