www.youtube.com/playlist?list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T
복습용 강의 정리 - 1강
위 강의의 학습로드맵 (이해 순서)
느슨한 결합력과 인터페이스 -> | DI (Dependency injection) -> | MVC |
AOP -> | 트랜잭션 | |
Servlet Filter -> | 인증과 권한 |
선행학습이 필요
ㅇ 자바
ㅇ MVC
ㅇ SQL
스프링의 매력
ㅇdependency injection
gmlwjd9405.github.io/2018/11/09/dependency-injection.html
위 사이트 좋다.
+위키백과의 '의존성 주입' 설명 정리
ㅇ 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉
ㅇ 의도 : 객체의 생성과 사용의 관심을 분리하는 것
ㄴ 가독성, 코드 재사용을 높인다.
ㅇ 어떤 서비스를 호출하려는 클라이언트는 그 서비스의 구성을 모른다.
이 때 서비스는 사용될 수 있는 객체를 말하고, 클라이언트는 다른 객체를 사용하는 객체이다.
ㅇ 클라이언트는 서비스 제공에 대한 책임을 외부 코드(주입자)로 위임한다.
ㅇ 의존성 주입은 프로그램 디자인이 '결합도'를 느슨하게 되도록 하고, '의존관계 역전 원칙'과 '단일 책임 원칙'을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것이다.
ㄴ 어!! 아까 공부한 용어가 나온다. OOP의 5대 원칙 SOLID에서 S와 I에 해당하는 내용.
ㄴ 단일 책임 원칙 : 객체는 단 하나의 책임만 가져야 한다.
ㄴ 의존 역전 원칙 : 의존 관계를 맺을 때 이야기인데, 최대한 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.
ㄴ결합도 이야기는 아직 잘 이해가 안간다. "의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈간의 결합도를 낮출 수 있다"라고 한다.
ㅇ 이해를 돕기 위한 내용
ㅇ 적용 유형 - 이거 읽으니까 조금 더 알겠다.
ㄴ자바 배울 때 기억난다. 생성자로 의존성을 주입할 수 있고, 세터로 의존성을 주입할 수 있고, 인터페이스 구현을 통해 의존성을 주입할 수 있다.
ㅇtransaction management
참고
--> Java EE의 기능을 커버한다. "자바로 웹개발 한다"고 하면 "Java SE + Java EE" 또는 "Java SE + Spring"인데, Java EE의 기능을 Spring이 커버한다.
--> 웹개발시 "MVC, 트랜잭션, 인증과 권한" 이 세가지만 되면 웬만한 건 만들 수 있다고 한다.
복습용 강의 정리 - 2강
2강 요약
2강에서는 느슨한 결합력과 인터페이스에 대한 설명을 한다.
기업형 어플리케이션을 만든다고 하면 다양한 레이어를 만들게 된다.
그런 레이어들에 대한 유지보수를 어떻게 할 것이냐?
ㅇ 소스코드를 수정해서 유지보수 할 수 있지만 이는 위험이 있다!
ㄴ 소스코드가 항상 있어야 하는 거고,
ㄴ 소스코드는 자꾸 열어 수정해 배포하는 것은 위험부담이 있다.
그래서 이런 소스코드를 건들지 않고 변경할 수 있게끔 하는 외부 설정파일이 필요하다.
Spring이 그럴 때 필요한 설정파일을 제공한다는 이야기를 하며 강의를 마치신다.
세부적인 내용
참고로 지금 작성하는 도식들은 강의 영상에 있는 내용과 멘트를 따라한 것이다.
강의 정말 좋다. 공부하실 분께 추천~.~
기업형 어플리케이션은 이런 레이어들로 구성된다.
Service 레이어 : 사용자 요구를 담당, 요구에 대한 데이터를 필요로 함
Data Access Object : 그 데이터소스에 접근하는 방법과 기술이 담겨 있다. 자바를 이용해서 데이터를 제공받을 수 있는 Dao.
만약 B1 내용이 변경된다면 어떻게 해야 할까?
ㅇ B1 소스코드를 구해 수정한다.
ㅇ B1은 두고 새로 하나 만든다. 덮쓰!
전자: 위험이 있다!
ㄴ 소스코드가 항상 있어야 하는 거고,
ㄴ 소스코드는 자꾸 열어 수정해 배포하는 것은 위험부담이 있다.
후자: 그럼 Service가 수정이 되어야 한다.
다음 접은글과 같이 수정이 되어야 한다는 말.
<Service의 수정이 이루어져야 한다면>
Private B1 b = new B1();
b.getData();
Private B2 b = new B2();
b.getData();
즉, 다음과 같은 수정이 이루어진다.
그렇지만 위 방법도 소스코드를 직접 건드려야 하기에 결합력이 높다.
변경사항을 수정해야 하는데, 소스코드를 구해서 수정을 해야만 한다면 결합력이 굉장히 높은 것이다.
소스코드 없이 바꿀 수 있을까? 즉, 결합력을 어떻게 낮출까?
-- 인터페이스의 이용과 외부파일의 필요성
자 먼저 인터페이스를 끼워넣어보면 이렇다.
이용하는 서비스는 달라지는 게 아니다.
인터페이스를 추가했다. 즉, 굳이 B1, B2라는 클래스명 이용할 필요 없이, 기능에만 집중한 B라는 이름으로 구현하고자 한다. 자료형 자체를 B 인터페이스형을 쓰자는 것.
인터페이스를 추가했으니 이제 Service랑 Dao를 결합시키는 작업을 해야 하는데, 그건 UI가 하게 한다!
이걸 다음과 같이 설명했다.
private B b = new B2();
b.getData();
이게 아니라
B b = new B1();
service.setB(b)
이렇게!! 저 setB(b) 부분이 DI라고 한다. (아직 잘 모르겠다)
그~런~데~
저 보라색 표시 해놓은 B1.. 이 소스코드를 수정하지 않는 방식을 생각해보아야 한다.
이유는 아까 설명했다.
저런 소스코드를 수정하지 않는 방식?
저런 소스코드 없이 바꿀 수 있게 하기 위해서 어떻게 해야 할까?
"객체 생성과 조립을 위한 외부 설정을 한다!"
저 코드를 그냥 들어내고, 생성할 객체를 외부파일, 외부설정에 의해서 저게 생성될 수 있도록 해주는 거다. (XML, Annotation 이라고 써두셨던데 아직 잘 모르겠다.)
그럼 이런게 어떻게 가능할까?
강의를 참고하시라 하신다: "자바 객체지향 강의 33강 : 새로운 객체로 변경하기"
내일 보고 여기 이어서 쓰겠다.
Spring이 이런 결합할 때 필요한 설정파일을 제공한다고 한다.
이제 다음 시간에 배울 것은, Spring하면 떠오른다고 하는 DI와 IOC컨테이너이다.
다음 포스팅에서 보자.
어 근데 1강에서 내가 이렇게 작성한 이력이 있다.
"결합도 이야기는 아직 잘 이해가 안간다. "의존 관계 설정이 컴파일시가 아닌 실행시에 이루어져 모듈간의 결합도를 낮출 수 있다"라고 한다."
그런데 2강을 듣고 나니까 조금 더 이해가 간다. 컴파일시가 아닌 실행시에 이루어진다는 말이 조금은 와닿는다. UI에 의존관계 설정을 넘긴다는 거지?
'JAVA' 카테고리의 다른 글
클래스의 정렬(대소판정)기준 | comparable, compareTo, comparator, compare | 자연정렬(natural ordering) (0) | 2021.06.28 |
---|---|
[Java] String.format() | 문자열 형식 지정하기 | %%%ds가 뭘까? | %% (0) | 2021.06.24 |
안드로이드 - 챕터10, 지도와 GPS (0) | 2021.01.28 |
안드로이드 생존코딩(오준석) - 챕터9 전자액자 Fragment 상세설명 - 안드로이드 스튜디오 4.1 (0) | 2021.01.25 |
동반객체와 팩토리 패턴 | companion object, Factory Method Pattern (0) | 2021.01.24 |