개키우는개발자 : )

Basic Framework 개념(1) 본문

JAVA/Spring Framework

Basic Framework 개념(1)

DOGvelopers 2019. 1. 30. 11:16
반응형


Framework 의 개념

학습 목표





1.SW 재사용성을 높일 수 있는 방안들



1-1 복사(copy) & 붙이기(Paste)



기본적인 재사용 방식으로 비슷한 예제를 다른 Source 에서 복사해서 사용함.


예를들어 날짜를 제공하는 Date 타입을 String 타입으로 변환하는 코딩을 하고, 클래스 B에서 동일한


로직이 필요하여 복사했다고 가정한 경우


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test;
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
public class A {
    public static void main(String[] args) {    
        Calendar date = Calendar.getInstance();
        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String formatDate = simple.format(date.getTime());
        
        //default 값
        System.out.println(date.getTime());
        //format 된 값
        System.out.println(formatDate);
    }    
}
 
cs

1
2
Wed Jan 30 10:56:07 KST 2019
2019-01-30 10:56:07
cs


현재 시간을 나타내는 소스코드가 필요할 경우 복사(copy) & 붙이기(Paste) 를 통해 B class에 붙여넣기로 


코드를 작성한 후 JDK 버전 변경 및 기능 변경이 필요할경우 A,B class 모두 수정을 해야하는 


번거로운 일이 생기게 됩니다.




1-2 메서드 호출


자주 사용되고, 유사한 기능들을 모아 메서드로 정의하여 재사용 하는 방법.


같은 class 내의 today 기능을 메서드 생성합니다. 서로의 메서드는 같은 기능을 가지고있지만


today1 메서드는 String 타입의 static method 이고 , 다른 메서드는 void 메서드 입니다.


서로 호출하는 방법이 달라 그냥 두개의 예시를 코드로 작성해봤어요..ㅋㅋ


서로의 차이는 나중에 다른 포스트에서 설명하겠습니돠~


1
2
3
4
5
6
7
8
9
10
11
12
13
//String 타입의 static method 생성
public static String toStringToday1() {
    Calendar date = Calendar.getInstance();
    SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return simple.format(date.getTime());
}
//void method 생성
public void toStringToday2() {
    Calendar date = Calendar.getInstance();
    SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String sdate = simple.format(date.getTime());
    System.out.println(sdate);    
}
cs


같은 class 내의 메서드를 호출 합니다. 메서드 형식에 따라 호출 방법이 달라요


1
2
3
4
5
6
7
8
public static void main(String[] args) {
    //static 과 void 의 호출 방법이 서로 다릅니다.
    //String 타입의 static method 호출
    System.out.println(A.toStringToday1());
    //void method 호출
    new A().toStringToday2();
        
}
cs


1
2
2019-01-30 12:16:36
2019-01-30 12:16:36
cs


그렇지만 메서드의 Signature 를 변경하면 이 메서드를 사용하는 모든 클래스에 영향을 줍니다.


Signature[] = {메서드 명, 리턴 타입, 아규먼트 개수,타입 등등..}


Copy & Paste 보단 진보된 방식이지만 작업 영역간의 결합도(Coupling)문제는 여전히 존재합니다.




1-3 클래스 재사용(상속) 


자주 사용되고, 유사한 기능들을 모아 메서드로 정의하여 재사용함.


사실 밑의 예제 같은 형식으로는 사용하지 않습니다 ㅠ 감안 하고 봐주세요 ㅋ



기능을 담당 하고 있는 클래스 입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
 
public class DateUtil {
    //void method 생성
    public void toStringToday2() {
        Calendar date = Calendar.getInstance();
        SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sdate = simple.format(date.getTime());
        System.out.println(sdate);
    }
}
cs


해당 기능을 person 클래스에서 생일을 호출하는 기능으로 사용하기위해 객체화 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package test;
 
public class Person {
    
    //생일 메서드
    public void birthDate() {
        //날짜 에 관련된 클래스 호출
        DateUtil birthday = new DateUtil();
        birthday.toStringToday2();
    }
    public static void main(String[] args) {
        new Person().birthDate();
    }
}
cs


부모 클래스가 가지고 있는 기능을 그대로 상속받아 자식 클래스가 재사용을 합니다.


1
2
3
4
5
6
7
8
9
package test;
 
public class Student extends Person{
    
    @Override
    public void birthDate() {
        super.birthDate();
    }
}
cs


DateUtil 클래스의 메서드가 변경된후 부모 클래스의 값이 변경되지 않으면 나머지 상속받은 클래스들은


영향을 받지 못합니다.


1-4 AOP (Aspect Oriented Programming)


*관심의 분리(Seperatrion of Concerns)


AOP는 OOP를 대체하는 기술이 아니라 OOP를 Support하는 역할을 한다.


AOP 가 핵심관심모듈의 코드를 직접 건드리지 않고 필요한 기능이 동작하도록 하는 데는 


위빙(Weaving)이라고 하는 특수한 작업이 필요하다.


즉, AOP에서 위빙 작업을 통해 핵심모듈 사이사이에 필요한 횡단 관심 코드가 동작하도록 엮어지게 만든다.


-AOP는 OOP를 더욱 OOP 답게 만들어 줄 수 있다.



상속,AOP 에 관한 예제 또는 설명은 따로 포스팅할정도로 내용이 많지만 


재사용성의 방안으로 크게 4가지를 분류해보았습니다.


Framework 의 첫번째 개념에 간략하게 작성해 봤습니다.


다음 포스트는 디자인패턴과 프레임워크의 관련성에 대한 이해에 대하여 작성해보도록 하겠습니다.


반응형

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

IoC 컨테이너와 DI(Dependency Injection)  (2) 2019.02.06
프로젝트 시작하기  (0) 2019.01.30
Spring Framework 의 개요  (0) 2019.01.30
Basic Framework 개념(3)  (0) 2019.01.30
Basic Framework 개념(2)  (0) 2019.01.30
Comments