DevEnjoy

One Step Closer

Month: 7월 2015

Template, Callback

2015년 7월 14일 by YongPwi 2 Comments
  • 클라이언트의 역할은 템플릿 안에서 실행될 로직을 담음 콜백 오브젝트를 만들고, 콜백이 참조할 정보를 제공
  • 만들어진 콜백은 클라이언트가 템플릿의 메소드를 호출할 때 파라미터로 전달
  • 템플릿은 정해진 작업 흐름을 따라 작업을 진행하다가 내부에서 생성한 참조정보를 가지고 콜백 오브젝트 호출
  • 콜백은 클라이언트 메소드에 있는 정보와 템플릿이 제공한 참조정보를 이용해서 작업을 수행하고 그 결과를 다시 템플릿에 돌려줌
  • 템플릿은 콜백이 돌려준 정보를 사용해서 작업을 마저 수행
  • 경우에 따라 최종 결과를 클라이언트에 다시 돌려주기도 한다.
  • 매번 메소드 단위로 사용할 오브젝트를 새롭게 전달 받음
  • 콜백 오브젝트가 내부 클래스로서 자신을 생성한 클라이언트 메소드 내의 정보를 직접 참조
  • 전략 패턴과 DI의 장점을 익명 내부 플래스 사용 전략과 결합한 독특한 활용법

Calculator.java

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Calculator {
    public Integer calcSum(String filepath) throws IOException{
        // 콜백 오브젝트 생성
        LineCallback<Integer> sumCallback = new LineCallback<Integer>() {
            // 익명 내부 클래스에서 인퍼페이스 메소드 override
            public Integer doSomeThingWithLine(String line, Integer value) {
                return value + Integer.parseInt(line);
            }
        };
        // 템플릿 메소드 호출
        return lineReadTemplate(filepath, sumCallback, 0);
    }

    public Integer calcMultiply(String filepath) throws IOException{
        // 콜백 오브젝트 생성
        LineCallback<Integer> muLineCallback = new LineCallback<Integer>() {
            // 익명 내부 클래스에서 인퍼페이스 메소드 override
            public Integer doSomeThingWithLine(String line, Integer value) {
                return value * Integer.parseInt(line);
            }
        };
        // 템플릿 메소드 호출
        return lineReadTemplate(filepath, muLineCallback, 1);
    }

    // 템플릿 메소드(파라미터로 콜백 오브젝트 받음:callback)
    public <T> T lineReadTemplate(String filepath, LineCallback<T> callback, T initVal) throws IOException{
        BufferedReader br = null;
        try{
            br = new BufferedReader(new FileReader(filepath));
            T res = initVal;
            String line = null;
            while ((line = br.readLine()) != null){
                res = callback.doSomeThingWithLine(line, res);
            }
            return res;
        } catch(IOException e){
            System.out.println(e.getMessage());
            throw e;
        } finally {
            if(br != null){
                try{
                    br.close();
                } catch (IOException e){
                    System.out.println(e.getMessage());
                }
            }
        }
    }
}

LineCallback Interface

1
2
3
public interface LineCallback<T> {
    T doSomeThingWithLine(String line, T value);
}
Posted in: Java, Programing Tagged: Callback, Template

Spring Singleton

2015년 7월 8일 by YongPwi 1 Comment
  • Spring 인스턴스 생성시 Default로 Singleton으로 관리
  • Singleton으로 선언된 SpringBean의 경우 해당 Bean이 속한 Spring Container 안에서만 하나의 인스턴스가 생성/사용되는 것을 보장
  • Spring은 Singleton Registry를 만들어 직접 Singleton 형태의 오브젝트를 만들고 관리
  • Servlet은 대부분 멀티스레드 환경에서 Singleton으로 동작
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class UserDaoTest {
    public static void main(String args[]) throws ClassNotFoundException, SQLException {
        ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);

        UserDao dao = new DaoFactory().userDao();

        UserDao dao3 = context.getBean("userDao", UserDao.class);
        UserDao dao4 = context.getBean("userDao", UserDao.class);

        System.out.println(dao3);
        System.out.println(dao4);
    }
}

// 동일한 인스턴스 결과
springbook.user.dao.UserDao@2c039ac6
springbook.user.dao.UserDao@2c039ac6

Singleton 패턴 구현 방식 문제점

  • private 생성자를 갖고 있기 때문에 상속 불가
    • 객체지향의 상속과 다형성 적용 불가
  • 테스트 하기 어렵다
    • Singleton은 만들어지는 방식이 제한적이므로 테스트에서 Mock Object로 대체하기 어려움
  • 서버환경에서 싱글톤이 하나만 만들어지는지 보장 불가
    • 서버에서 class loader 구성하는 방법에 따라서 하나 이상의 오브젝트가 만들어 질 수 있음
  • Singleton 사용은 전역 상태를 만들수 있다.


Spring Singleton

  • Sington Registry 덕분에 Singleton으로 사용될 클래스라도 public 생성자를 가질 수 있다.
  • Spring Sington Bean으로 사용되는 클래스를 만들때 개별적으로 바뀌는 정보는 필히 로컬변수로 선언해서 사용해야 한다.


Spring Bean 범위

  • Singleton
    • Container 한개에 한개만 생성되며 강제로 제거하지 않는 한 Container가 존재하는 동안 계속 유지된다.
  • Prototype
    • Container에 Bean을 요청할 때마다 매번 새로운 오브젝트 생성
  • Request
    • HTTP 요청시마다 생성, 웹 친화적인 Spring ApplicationContext의 컨텍스트에서만 유효
  • Session
    • 웹의 세션과 유사

참고

Spring의 Singleton과 Java static기반 Singleton 패턴의 차이
나는 싱글턴이 싫어요
[Spring 레퍼런스] 4장 IoC 컨테이너 #6

Posted in: Java, Programing Tagged: Singleton, Spring

IntelliJ EAP Font rendering

2015년 7월 8일 by YongPwi 2 Comments

IntelliJ 사용중 CheckStyle 플러그인 업데이트를 하였더니

IntelliJ가 재 시작시 정상적으로 실행이 되지 않았다,,,

확인해보니 CheckStyle 플러그인이 java 1.8 기반에서 동작해서 그런 문제였고,,,

IntelliJ시 필요한 java를 1.8로 올려야 했다,,,

버전 바꾸는 방법은

OS X 기준으로

응용 프로그램 > IntelliJ 선택 마우스 오른쪽 버튼 > 패키지 내용 보기 > Contents > Info.plist

1
2
      <key>JVMVersion</key>
      <string>1.6+,1.7+</string> //버전 변경 = > 1.8

상위 방법으로 손쉽게 가능하다.

그런데 문제는 java 1.8로 수정하니 IntelliJ 메뉴 및 콘솔, 에디터 폰트가 미묘하게 이상하게 변경 되었다.

– 기존 java 1.6

스크린샷 2015-07-08 오후 2.34.46

– 변경 java 1.8

스크린샷 2015-07-08 오후 2.36.38

폰트 설정 문제인가 싶어서 겁나게 메뉴 및 구글링을 하였지만,,,

방법을 찾지 못하여서 포기 하였다,,,

그런데 오늘 IntelliJ 15 릴리즈 소식에 받아서 다시 세팅을 하였는데,,,

역시나 Font 문제가 발생하였다,,,

그래서 얼마 전에 했던 삽질을 다시 좀 하다가 보니,,,

IntelliJ 정식 배포 이외에 IntelliJ 자체적으로 java를 포함하여 배포되는 버전에는

메뉴가 새롭게 추가된 것을 확인 하였다,,,(15 이외 버전은 확인 해보지 않았음,,,)

IntelliJ Preferences > Appearance & Bebavior > Appearance

상위 경로 메뉴에서 보면 Antialiasing 초기 세팅값이 Without LCD rendering 이다,,,

스크린샷 2015-07-08 오후 2.36.05

요놈 때문에 그런데,,,

스크린샷 2015-07-08 오후 2.37.01

상위 처럼 LCD Rendering in IDE and Editor 선택 Apply 하면

기존과 동일하게 font가 보기좋게 바뀐다.

쫌 뒤져보니

기존 java 1.6에서 사용중인 Quartz Graphics Framework 문제인듯 싶은데,,,

아직 명확하게 해결된 건 아닌듯 싶다,,,

삽질 하신 분들에게 조금이라도 도움이 되길,,,

IntelliJ Font rendering 참고 블로그

Posted in: Java, Programing Tagged: Antialiasing, font, IntelliJ

Factory Method 디자인 패턴

2015년 7월 7일 by YongPwi Leave a Comment
  • Template Method과 마찬가지로 상속을 통해 기능확장
  • 슈퍼클래스 코드에서는 서브클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용
  • 슈퍼클래스는 서브클래스가 어떤 클래스 오브젝트를 리턴할지 모름
  • 서브클래스는 다양한 방법으로 오브젝트 생성 메소드를 재정의
  • 서브클래스에서 오브젝트 생성 방법과 클래스를 결정할 수 있도록 미리 정의해둔 메소드 = Factory Method
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
32
33
34
// Book 클래스
public class Book {
    String title;
    String author;
    String price;

    public void print(){
        System.out.println("title = " + title);
        System.out.println("author = " + author);
        System.out.println("prive = " + price);
    }

    public String getTitle(){
        return title;
    }
}

// 여러가지 책
class ComicBook extends Book{
    public ComicBook(){
        this.title = "럭키짱";
        this.author = "김성모";
        this.price = "1000원";
    }
}

// 여러가지 책
class CookBook extends Book{
    public CookBook(){
        this.title = "한신포차";
        this.author = "백종원";
        this.price = "2000원";
    }
}
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
32
// Book 생성 클래스(추상클래스)
public abstract class BookStore {
    public BookStore(){

    }

    public Book orderBook(String type){
        Book book = createBook(type);
        book.print();
        return book;
    }

    abstract Book createBook(String type);
}

// 서브 클래스 실제 사용할 클래스 오브젝트 생성하여 리턴
class Yes24BookStore extends BookStore{

    @Override
    Book createBook(String type) {
        return new ComicBook();
    }
}

// 서브 클래스 실제 사용할 클래스 오브젝트 생성하여 리턴
class KangComBookStore extends BookStore{

    @Override
    Book createBook(String type) {
        return new CookBook();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 고객이 책 구매
public class UserOrder {
    public static void main( String[] args ) {
        BookStore yes24 = new Yes24BookStore();
        BookStore kangcom = new KangComBookStore();
        Book book = yes24.orderBook("bookType");
        System.out.println("yes24 order=" + book.getTitle());
        Book book2 = kangcom.orderBook("bookType");
        System.out.println("kangcom order=" + book2.getTitle());
    }
}

// 출력결과
title = 럭키짱
author = 김성모
prive = 1000원
yes24 order=럭키짱
title = 한신포차
author = 백종원
prive = 2000원
kangcom order=한신포차
Posted in: Java, Programing Tagged: Factory Method, JAVA, 디자인패턴

Template Method 디자인 패턴

2015년 7월 7일 by YongPwi Leave a Comment
  • 변하지 않는 기능은 슈퍼클래스에 생성하고 자주 변경되며 확장할 기능은 서브클래스에 만든다.
  • 슈퍼클래스에 추상 메소드 또는 오버라이드 가능한 메소드를 정의
  • 코드의 기본 알고리즘을 담고 있는 템플릿 메소드 생성
  • 서브클래스에서 추상 메소드 구현 또는 훅 메소드 오버라이드하여 기능 확장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Work {
    // 1. 추상 메소드 또는 오버라이드 가능한 메소드를 정의
    public void workFlow() {
        stepOne();
        stepTwo();
        stepThr();
        stepFor();
    }
    // 2. 일반적인 구현은 기본 클래스에 정의
    protected void stepOne() { System.out.println( "Work.stepOne" ); }
    // 3. 변경 또는 기능확장이 필요한 메소드는 추상 메소드로 선언
    abstract protected void stepTwo();
    abstract protected void stepThr();
    protected void stepFor() { System.out.println( "Work.stepFor" ); }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
abstract class Teacher extends Work{
    // 4. 서브 클래스는 메소드 구현 또는 오버라이드하여 기능 확장
    // 1. 추상 메소드 또는 오버라이드 가능한 메소드를 정의
    protected void stepThr() {
        step3_1();
        step3_2();
        step3_3();
    }
    // 2. 일반적인 구현은 기본 클래스에 정의
    protected void step3_1() {
        System.out.println( "Teacher.step3_1" );
    }
    // 3. 변경 또는 기능확장이 필요한 메소드는 추상 메소드로 선언
    abstract protected void step3_2();
    protected void step3_3() {
        System.out.println( "Teacher.step3_3" );
    }
}
1
2
3
4
5
6
7
8
9
10
class MathTeacher extends Teacher {
    // 4. 서브 클래스는 메소드 구현 또는 오버라이드하여 기능 확장
    protected void stepTwo() { System.out.println( "MathTeacher   .stepTwo" ); }
    protected void step3_2() { System.out.println( "MathTeacher   .step3_2" ); }

    protected void stepFor() {
        System.out.println( "MathTeacher   .stepFor" );
        super.stepFor();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class TemplateMethodDemo {
   public static void main( String[] args ) {
       Work work = new MathTeacher();
       work.workFlow();
   }
}

// 결과
Work.stepOne
MathTeacher   .stepTwo
Teacher.step3_1
MathTeacher   .step3_2
Teacher.step3_3
MathTeacher   .stepFor
Work.stepFor
Posted in: Java, Programing Tagged: JAVA, Template Method, 디자인패턴

Calendar

7월 2015
일 월 화 수 목 금 토
« 2월   9월 »
 1234
567891011
12131415161718
19202122232425
262728293031  

Recent Posts

  • ubuntu bastion 설정
  • Spring Boot properties 암호화
  • Git Repository Bitbucket과 Issue Tracker Redmine 연동 설정
  • Spring Security 동일 session 제어
  • Spring @Mock, @Mockbean, @InjectMock

Recent Comments

  • pzotov (Ubuntu 14.04에서 Sonarqube 6.7.1 service 등록)
  • cours de theatre paris (AWS ELB와 Auto Scaling 연동, nginx)
  • bayern munich (IntelliJ EAP Font rendering)
  • camiseta del chelsea (OS X에서 APP 아이콘 변경)
  • cheap football shirts replica (jQuery Ajax에서 json Array 직렬화)

Copyright © [the-year] [site-link].

Powered by [wp-link] and [theme-link].