음~ 오늘도 다 아는 내용~ 하지만 서블릿 재밌어~... 하다가! 갑자기 어려운 내용 쏟아져버리기
아파치와 톰캣
예전에 아파치는 정적 페이지였고 이후 톰캣이 동적 페이지를 만들었다.
나중에 아파치가 톰캣을 인수해서 아파치/톰캣이 되었다. 그래서 동적 페이지를 말할 땐 아파치/톰캣이라 한다. 즉 두 개를 같이 붙여서 말하는 게 동적 페이지라는 뜻.
그냥 아파치라고만 부르면 그건 정적 페이지를 뜻하는 것이다.
참고로 정적 페이지는 단순 Web Server라 하고, 동적 페이지는 Web Application Server라 한다.
추상화
공통된 것들을 추려 기능과 구현의 역할을 나누는 것이다.
예를 들어 인터페이스에는 DB 접속에 연결하기 위한 방법과 정보 등을 작성하고, 이를 구현하는 클래스에서 직접적인 기능을 구현하는 것이다.
추상화한 인터페이스에서는 기능 등을 구현하지 않는다.
다형성
C 인터페이스가 있고, A 클래스와 B 클래스가 C 인터페이스를 구현한다.
C tempA = new A();
C tempB = new B();
예를 들어 위와 같은 방법으로 선언한다고 했을 때 오류가 발생하지 않는 것...이라고 간단히 이해하면 된다.
사실상 추상화와 다형성 같은 개념에 대한 예제들은 이미 정리해놓았기 때문에 복습하는 기분으로 가볍게!
https://mimah.tistory.com/entry/Java-Polymorphism-%EB%8B%A4%ED%98%95%EC%84%B1-%EC%98%88%EC%A0%9C
객체지향 설계(SOLID)
리스코프 치환 원칙 - S
서브 타입(자식 클래스)은 언제나 자신의 기반 타입(부모 클래스)으로 교체할 수 있어야 한다.
인터페이스 분리 원칙 - I
클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다.
한 인터페이스에 너무 많은 역할을 부여하지 말고, 인터페이스를 최대한 잘게 쪼개는 것이다.
의존관계 역전 원칙 - D
상위 레벨의 정책은 하위 레벨의 정책에 의존하면 안 된다.
앞서서 C 인터페이스와 이를 구현한 A, B 클래스가 있다고 가정할 때, 선언 시 C가 아닌 A, B로 하지 말라는 것이다.
A나 B로 선언해버리면 이와 묶여버리기 때문에 어떤 구현 클래스인지 알려면 결국 new 할 때 A로 할지, B로 할지 결정해야 한다. 이를 개발자가 결정해야 한다.
그 러 나 스프링을 사용하면 개발자가 하는 게 아닌 스프링 컨테이너가 해준다.
의존성 주입 - DI(Dependency Injection)
개발자가 new 할당하는 걸 직접 하는 게 아닌 컨테이너에게 나 이거 하고 싶어!라고 알려주는 것이다.
1. 생성자(Constructor) 주입
2. 세터(Setter) 주입
3. 인터페이스(Interface) 주입
위는 대표적인 세 가지 예이다. 근데 보통은 위에 있는 주입을 사용하지 않고 필드 주입 방식을 사용한다고 한다.
근데 필드 주입 방식은 좋지 않다고 한ㄷ
필드 주입 방식으로 해버리는 경우 한 클래스 내에 필드가 너무 많이 들어갈 수 있기 때문에 단일 책임 원칙을 위반할 수 있고, 순환 참조를 하게 될 수도 있다(데드락 싫어용~!)
생성자 주입은 생성자에 @Autowired 어노테이션을 명시해주는 것인데 그동안 스프링 게시판 만들 때 이 방법으로 했어서 아주 뿌듯해~
AOP(Aspect Oriented Programming)
Proxy Pattern
언제 한 번 디자인 패턴 복습을 다시 해야겠다.
PSA(Portable Service Abstraction)
트랜잭션
Global Transactions
Local Transactions
트랜잭션 롤백
관심사의 분리(SoC)
Layered Architecture일 때 레이어들의 결합도를 떨어뜨리는 것이다.