스프링 웹개발을 할 때 크게 3가지 범주로 나눌 수 있다.
1. MVC <- DI <-느슨한 결합력과 인터페이스
2. 트랜잭션 <- AOP
3. 인증과 권한 <- Servlet Filiter
오늘은 느슨한 결합력과 인터페이스에 대해 공부하였다.
UI - Service - Dao 에서 어떤 객체를 수정해야 한다면 어떻게 해야 할까 ?
Dao 에 코드를 바꾸는 방법, 혹은 코드를 추가하는 방법 ??
그렇게 되면 Service에서도 수정을 해야한다. 굉장히 번거로운 일이 된다.
소스코드를 수정해야만 바꿀 수 있다는 것은 결합력이 높은 것이다.
결합력을 낮추기 위해서는 인터페이스를 사용하여야 한다.
UI - Service - <<interface>> - Dao
인터페이스를 만들어 결합력을 낮춘다. 그리고 생성한 객체를 외부파일, 설정에 두고
XML, 어노테이션에 의해서 생성이 될 수 있도록 한다.
인터페이스란
인터페이스란 일종의 추상클래스이다. 추상클래스처럼 추상메서드를 갖지만 추상
클래스보다 추상화 정도가 높아서 추상클래서와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를
구성원으로 가질 수 없다.
인터페이스를 작성할 때는 Class 대신 interface를 사용한다.
접근제어자로 public 또는 default 를 사용할 수 있다.
일반적인 클래스의 멤버들과 달리 인터페이스는 제약사항을 가지고 있다.
모든 멤버변수는 public static final 이어야하며, 이를 생략할 수 있다.
모든 메서드는 public abstrct 이어야하며, 이를 생략할 수 있다.
클래스가 아닌 인터페이스로부터만 상속받을 수 있다. 또한 다중상속이 가능하다.
Option에는 Alarm, PowerOff, PowerOn 의 기능이 있다.
interface Option {
public void Alarm(int hour) ;
public void PowerOff();
public void PowerOn();
}
인터페이스를 통해 실제로는 상속받아 구현된 method를 호출할 수 있다. 그 부분에 대한 것은 아래와 같다.
class Phone implements Option {
public void Alarm(int hour) {
System.out.print("핸드폰 알람이 울렸습니다!!");
}
public void PowerOff() {
System.out.print("핸드폰이 종료됩니다");
}
public void PowerOn() {
System.out.print("핸드폰이 켜집니다");
}
}
Alarm과 PowerOn/Off라는 method를 오버라이딩 하지 않았다면 컴파일중 에러가 발생했을 것이다.
어떤 프로젝트를 개발하기 전에 interface를 먼저 설계하고 interface대로 테스트 코드를 작성한 다음,
하나하나씩 interface를 상속받아 실제 기능을 구현해 나가는 것도 JAVA interface활용의 한 예시라고 볼 수 있다.
또는 부모클래스로 인터페이스를 둠으로써 자신이 정의한 클래스의 멤버변수나 내부 함수를 감추고자 할때도 유용하게 사용될 수 있다.