[Spring] 스프링 공부 정리
스프링 공부 정리
너무 내용이 많다.. 어려운건 아닌데
토비의 스프링 참고
정리할 구절
UserDao 만드는 중
~이렇게 템플릿 메소드 패턴 또는 팩토리 메소드 패턴으로 관심사항이 다른 코드를 분리해내고, 서로 독립적으로 변경 또는 확장할 수 있도록 만드는 것은 간단하면서도 매우 효과적인 방법이다.
하지만 이 방법은 상속을 사용했다는 단점이 있다. 1) Java는 다중 상속이 안되고, 2) 상속을 통한 상하위 클래스의 관계는 생각보다 밀접하다는 것. 3) 확장된 기능인 DB 커넥션을 생성하는 코드를 다른 DAO 클래스에 적용할 수 없다는 것
DAO의 확장
~변화의 성격이 다르다는 건 변화의 이유와 시기, 주기 등이 다르다는 뜻이다. UserDao는 JDBC API를 사용할 것인가 DB 전용 API를 사용할 것인가. 어떤 테이블 이름과 필드 이름을 사용해 어떤 SQL을 만들 것인가. 어떤 오브젝트를 통해 DB에 저장할 정보를 전달받고, DB에서 꺼내온 정보를 저장해서 넘겨줄 것인가와 같은 관심을 가진 코드를 모아둔 것. 따라서 이런 관심사가 바뀌면 그 때 변경이 일어난다.
OCP 개방 폐쇄 원칙
클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
프레임워크
프레임워크는 제어의 역전 개념이 적용된 대표적인 기술이다. 프레임워크는 라이브러리와 달리 프레임워크가 애플리케이션 코드를 사용하여 애플리케이션 흐름을 제어한다.
애플리케이션 코드는 프레임워크가 짜놓은 틀에서 수동적으로 동작해야 한다.
Spring(Spring MVC) vs Spring boot 차이
Spring Boot는 스프링 프레임워크의 서브 프로젝트. 독립 컨테이너에서 동작할 수 있기에 Java만 설치되어 있으면 됨. 빌드 후 jar파일이 생성되고, 별도의 서버 설치 없이 임베디드 톰캣이 자동으로 실행됨. 프로젝트 생성 시에 기존의 Spring에서 하듯 복잡한 설정이 아닌 통합된 설정파일인 application.yml으로 쉽게 간단하게 사용 가능.
언제 쓰는가? Web 기반 어플리케이션은 Tomcat이든 WAS든 web container가 설치되어있어야함.
하지만 비교적 규모가 작은 형태의 애플리케이션을 실행시키기 위해 그보다 큰 WAS를 따로 설치하기엔 그닥 효율적이지 않음. 이런 경우 Spring boot를 쓰는게 적당하다 여겨짐
디자인 패턴 부분
-
템플릿 메소드 패턴
상속을 통해 부모클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. 변하지 않는 기능은 부모클래스에 만들어두고 자주 변경되며 확장할 기능은 서브클래스에서 만들기도 한다.
부모클래스에서는 미리 추상 메소드 또는 오버라이드 가능한 메소드를 정의해 두고 이를 활용해 코드의 기본 알고리즘을 담고 있는 템플릿 메소드를 만든다.
부모클래스에서 디폴트 기능을 정의해두거나 비워뒀다가 서브클래스에서 선택적으로 오버라이드할 수 있또록 만들어둔 메소드를 훅(hook) 메소드라고 한다. 서브클래스에서는 추상 메소드를 구현하거나, 훅 메소드를 오버라이드하는 방법을 이용해 기능의 일부를 확장한다.
public abstract class Super{ public void templateMethod(){ //기본 알고리즘 코드 hookMethod(); abstractMethod(); } protected void hookMethod(){} -> 선택적으로 오버라이드 가능한 훅 메소드 public abstract void abstractMethod(); -> 서브클래스에서 반드시 구현해야 } public class Sub1 extends Super{ protected void hookMethod(){ ... } public void abstractMethod(){ ... } }
-
팩토리 메소드 패턴
- 서브클래스에서 구체적인 오브젝트 생성 방법을 결정하게 하는 것
- 템플릿 메소드 패턴과 마찬가지로 상속을 통해 기능을 확장하게 하는 패턴, 구조도 비슷.
- 부모클래스 코드에서는 서브클래스에서 구현할 메소드를 호출해서 필요한 타입의 오브젝트를 가져와 사용한다. 이 메소드는 주로 인터페이스 타입으로 오브젝트를 리턴하므로 서브클래스에서 정확히 어떤 클래스의 오브젝트를 만들어 리턴할지는 부모클래스에서는 알필요없다.
- 팩토리 메소드 패턴과 일반적으로 부르는 팩토리 메소드는 다르다.
-
싱글턴 패턴
-
팩토리 패턴
-
전략 패턴
컨텍스트 -> 전략
전략A 전략B
바뀌지 않는 부분은 컨텍스트로, 바뀌는 부분은 전략으로 만들고 인터페이스를 통해 유연하게 전략을 변경할 수 있도록 구성한다.
클라이언트의 중요성 : 컨텍스트를 사용하는 클라이언트는 컨텍스트가 사용할 전략을 컨텍스트의 생성자 등을 통해 제공해주는게 일반적이다.
-
템플릿/콜백 패턴
DI
UserDao와 JdbcContext, DataSource의 의존관계
UserDao가 JdbcContext에 의존적, JdbcContext는 Datasource에 의존적
이 경우는 인터페이스를 사용하지 않는 DI
-
JdbcContext를 bean객체로 만들어 DI하는 방법
- JdbcContext는 Singleton 객체로 관리됨
-
JdbcContext를 모든 Dao객체마다 하나씩 생성하는 방법
- DataSource를 UserDao에게 DI하고
- UserDao 내에서 Datasource를 이용해 JdbcContext 객체 생성
스프링이란 무엇인가?
스프링은 오픈소스이다
스프링의 목적
EJB의 실패
비즈니스 로직과 기술적인 코드를 최대한 분리한다. 여기에 AOP를 활용
비즈니스 로직 자체의 복잡함을 해결하려면 DI보다는 객체지향 설계 기법이 더 중요
결국 모든 스프링의 기술과 전략은 객체지향이라는 자바 언어가 가진 강력한 도구를 극대화해서 사용할 수 있도록 돕는 것
POJO 프로그래밍
-
특정 규약(contract)에 종속되지 않는다.
-
특정 환경에 종속되지 않는다.
-
단순히 평범한 자바 객체를 사용했다고 POJO가 아니다. 객체지향적인 자바 언어의 기본에 충실하게 만들어져야 하기 때문.
스프링의 기술
IoC, DI, AOP, PSA
DI
-
부가 기능의 추가
- 데코레이터 패턴
- 트랜잭션 기능을 부여했던 상황
-
인터페이스의 변경
- 때로는 사용하려고 하는 오브젝트가 가진 인터페이스가 클라이언트와 호환되지 않는 경우가 있다. 또는 여러 종류의 인터페이스를 가졌지만 사실은 비슷한 기능을 담당하는 오브젝트를 바꿔가면서 사용하고 싶을 때도 있다.
- A가 C 오브젝트를 사용하려 한다고 해보자. A는 원래 B 인터페이스를 사용하도록 만들어져 있고 C는 B인터페이스를 구현하지 않았다. 이 때 DI를 통해 A가 B의 구현 오브젝트를 받도록 만들어져 있다면 B 인터페이스를 구현했으면서 내부에서 C를 호출해주는 기능을 가진 어댑터 오브젝트를 만들어 A에 DI해주면 된다.
- 이를 좀더 일반화해서 아예 인터페이스가 다른 다양한 구현을 같은 방식으로 사용하도록, 중간에 인터페이스 어댑터 역할을 해주는 레이어를 하나 추가하는 방법도 있다. DI의 응용 방법중 하나이자 스프링의 대표 기술로도 분류되는 일관성 있는 서비스 추상화PSA가 그런방법이다.
-
템플릿/콜백
- 반복적으로 등장하지만 항상 고정적인 작업 흐름과 그 사이에서 자주 바뀌는 부분을 분리
-
싱글톤과 오브젝트 스코프
- DI할 오브젝트의 생명주기를 제어 가능
-
테스트