프레임워크를 쓰는 목적
- 절차 간소화
- 표준화 -> 분업 가능 -> 비용,시간 줄어든다
Spring의 특징
- EJB(enterprise java bean)에 비해서 가볍다
- Ioc (DI)를 쓴다
- AOP (관점지향 프로그래밍)
- Container
서블릿 컨테이너 : url이 들어왔을 때 주소에 대응되는 객체(서블릿)을 만들어서 서비스시킨다.
스프링 컨테이너 또한 같은 역할이다. 다만 객체 = bean
결합도 coupling
프로그램 : 핵심 로직 + 부가로직 (입력, 로그처리, 예외처리 등)
결합도가 낮은 프로그램이 좋다. (느슨한 연결)
결합도가 높으면?
결합도가 높을 때
SamsungTV
package polymorphism;
public class SamsungTV {
public void powerOn() {
System.out.println("SamsungTV -- 전원 켠다");
}
public void powerOff() {
System.out.println("SamsungTV -- 전원 끈다");
}
public void volumeUp() {
System.out.println("SamsungTV -- 소리 올린다");
}
public void volumeDown() {
System.out.println("SamsungTV -- 소리 내린다");
}
}
LgTV
package polymorphism;
public class LgTV {
public void turnOn() {
System.out.println("LgTV -- 전원 켠다");
}
public void turnOff() {
System.out.println("LgTV -- 전원 끈다");
}
public void soundUp() {
System.out.println("LgTV -- 소리 올린다");
}
public void soundDown() {
System.out.println("LgTV -- 소리 내린다");
}
}
TVUser
package polymorphism;
public class TVUser {
public static void main(String[] args) {
//유사한 2개의 클래스의 사용을 변경하기 위해서
//일일이 바꿔줘야 하므로 결합도(Coupling)이 높은 프로그램
SamsungTV tv = new SamsungTV();
// LgTV tv = new LgTV();
// LgTV로 바꾸면 쓸 수 없다. 비슷한 기능인데도 불구하고 고쳐야 될 것이 많다.
// 이러한 것을 결합도가 높다고 한다
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();
}
}
결합도를 낮추기 위해 메서드 명을 똑같이 했다.
TVUser
package polymorphism;
public class TVUser {
public static void main(String[] args) {
/*
결합도가 앞의 프로그램보다 낮아졌다.
메서드명의 표준을 선행 클래스에 맞춰서
클래스 선언만 교체해도 잘 돌아간다.
*/
// SamsungTV tv = new SamsungTV();
LgTV tv = new LgTV();
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();
}
}
TV interface를 이용
package polymorphism;
// 아예 tv의 표준을 정한다
public interface TV {
public void powerOn();
public void powerOff();
public void volumeUp();
public void volumeDown();
}
TVUser
package polymorphism;
public class TVUser {
public static void main(String[] args) {
/*
인터페이스로 표준을 정한다
인터페이스 변수에 어떤 자식 객체를 저장하냐에 따라
동작이 달라진다.
*/
// TV tv = new SamsungTV();
TV tv = new LgTV();
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();
}
}