일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- javascript fetch
- javascript async
- 스프링부트
- spring 모듈 프로젝트
- 준영속상태
- springboot gradle 모듈 프로젝트
- 코프링
- js fetch
- 코틀린 클래스
- javascript async await
- JavaScript
- js api 호출
- jpa 영속성
- javascript api 호출
- JPA플러시
- jpa준영속
- js async await
- js await
- JS
- gradle 모듈 프로젝트
- JPA
- JPA준영속 상태
- ja async
- springboot 모듈
- jpa 플러쉬
- spring gradle 모듈
- JPA플러쉬
- Flutter
- jpa 플러시
- 코틀린
- Today
- Total
매일 한줄 코딩
4주차 - 아키텍처란? (DIP) 본문
💡 아키텍처란?
- 위키피디아 : 컴퓨터 구조(computer architecture)는 컴퓨터 과학에서 컴퓨터 시스템의
기능(functionality), 조직(organization), 구현(implementation)에 대한 법칙과 방법을 통칭한다
- 클린아키텍처 : 소프트웨어 시스템의 아키텍처란 시스템을 구축했던 사람들이 만들어낸 시스템의 형태다.
- Ralph Johnson (GoF) : the important stuff Whatever that is. (중요한것들 뭐든간에)
- 아키텍처의 구조
- 요구사항
→ 기능 : 기획서, 화면기획서 등 (funtional)
→ 비기능 : 품질(non funtional)
기능 / 비기능 으로 나뉜다. - 상황
일정, 인력 등 - 모든 것은 절충 (trade off)
모든 결정에는 반대급부가 있음.
→ 현재 상황에 가장 적합한 것을 선택한다.
완벽한 아키텍처는 없다. - 어떻게보다 왜가 더 중요
어떻게 하냐보다 왜 써야하는지가 중요하다.
- 요구사항
- 예컨데, 요구사항대로 개발할때 인력이 부족하다면 요구사항을 줄이거나 일정을 늘려서 개발한다거나, 무조건적으로 신기술을 쓴다는 것 보다 왜 써야하는지에 초점을 두고 신기술이 아니더라도 개발하는 목적에 맞다면 선택하여 아키텍처를 구성하는것이 좋다.
💡아키텍처를 결정할때 가장 늦게 결정하는 것이 좋은 것이라고 한다.
예를들어, 어떠한 데이터를 저장할때..
DB에 저장할지, 파일에 저장할지, 디바이스에 저장할지 등등
가장 늦게 결정할 수 있는게 가장 좋은 아키텍처라고 한다.
이는, 어떠한 행위를 개발할 때 제약이 있는 구조가 아니라 열려있는 구조로 아키텍처를 구성하는 것이라고 생각된다.
💡아키텍처에도 상위/하위수준 이 존재한다.
ex) 파일암호화 개발
- 상위수준
- A 파일을 암호화해서 B파일에 저장한다.
- 하위수준 (저수준)
- A파일을 읽는다
- 읽은 데이터를 RSA 알고리즘을 사용하여 암호화한다.
- 암호화 한 것을 B파일에 저장한다.
public File encryp(File file) {
...
file.read....; //파일 읽는다. (A파일 읽기)
...
byte[] encryptedBytes = cipher.doFinal(encryptText.getBytes());
String encryptedText = new String(encryptedBytes, "UTF-8"); // 암호화한다.
...
...
...
File encrypFile = ... ; // 암호화한 파일을 저장한다. (B파일 읽기)
return encrypFile;
}
이러한 구조의 소스에서
상위수준은 encryp(...)를 부르는 메서드 혹은 encryp(...)메서드 의 행위들이 될 것이고,
하위수준은 encryp(...)메서드 안에 있는 실제 구현기술이 될 것이다.
이때에, 하위수준에 구현을 변경한다고하면 그에따라 상위수준들도 영향을 받게된다.
여러군데에서 암호화 하는 메서드를 호출한다고 할때, 그 내용(구현)을 바꾸면 여러군데 모두 영향이 간다는 이야기이다.
💡프로그래밍을 하다보면 상위와 하위수준이 섞여있는 경우가 많다.
그런경우 구현변경 때문에 다른코드에도 영향을 받게된다.
이렇게 되면, 역할과 책임이 깨지는 상황이 발생한다.
위의 문제는 상위수준(고수준)이 하위수준(저수준)을 직접 의존하고 있기 때문이다.
그렇다면, 어떻게하면 하위수준을 바꾸어도 상위수준에 영향을 주지 않을 수 있을까.?
✔️**의존을 반대로 하면 된다.** 그것을 DIP(Depending Inversion Principle) 라고 한다.
※ 이하 상위수준은 고수준, 하위수준은 저수준으로 표현.
- 기존 상태
- 고수준인 encryp 내에서 어떠한 암호화 구현을 하는 저수준을 직접 의존 하기때문에 아래와 같이 표현하였다.
- 개선 상태
- interface를 하나 만들어 저수준이 고수준인 인터페이스를 의존하는 형태로 바꾸었다.
위와 같은 형태로 인터페이스를 하나 만든다음, 저수준이 고수준을 의존하는 상태로 의존의 방향을 역전시켰다.
이는 3주차에 배웠던 추상화 중.. OCP같이 형태가 비슷하다.
- OCP와 DIP는 목적이 다르다.
OCP는 확장에 초첨을 두는 것이고,
DIP는 의존의 방향을 역전시켜 저수준의 구현이 고수준에게 영향이 가지않게 하는 의존성에 초점을 둔 것이다.
기존 상태에서는 고수준이 직접 저수준을 의존하고 있었지만,
개선한 상태에서는 저수준이 고수준을 의존하고 있게 된다.
그렇게 된다면, 저수준의 구현부분이 바뀌더라도 고수준이 호출하는 것은 바뀌지 않아도 되는 것이다.
- 위키피디아 : 컴퓨터 구조(computer architecture)는 컴퓨터 과학에서 컴퓨터 시스템의
기능(functionality), 조직(organization), 구현(implementation)에 대한 법칙과 방법을 통칭한다
- 클린아키텍처 : 소프트웨어 시스템의 아키텍처란 시스템을 구축했던 사람들이 만들어낸 시스템의 형태다.
- Ralph Johnson (GoF) : the important stuff Whatever that is. (중요한것들 뭐든간에)
- 아키텍처의 구조
- 요구사항→ 기능 : 기획서, 화면기획서 등 (funtional)
- → 비기능 : 품질(non funtional)
- 기능 / 비기능 으로 나뉜다.
- 상황
- 일정, 인력 등
- 모든 것은 절충 (trade off)모든 결정에는 반대급부가 있음.
- → 현재 상황에 가장 적합한 것을 선택한다.
- 완벽한 아키텍처는 없다.
- 어떻게보다 왜가 더 중요
- 어떻게 하냐보다 왜 써야하는지가 중요하다.
- 예컨데, 요구사항대로 개발할때 인력이 부족하다면 요구사항을 줄이거나 일정을 늘려서 개발한다거나, 무조건적으로 신기술을 쓴다는 것 보다 왜 써야하는지에 초점을 두고 신기술이 아니더라도 개발하는 목적에 맞다면 선택하여 아키텍처를 구성하는것이 좋다.
💡아키텍처를 결정할때 가장 늦게 결정하는 것이 좋은 것이라고 한다.
예를들어, 어떠한 데이터를 저장할때..
DB에 저장할지, 파일에 저장할지, 디바이스에 저장할지 등등
가장 늦게 결정할 수 있는게 가장 좋은 아키텍처라고 한다.
이는, 어떠한 행위를 개발할 때 제약이 있는 구조가 아니라 열려있는 구조로 아키텍처를 구성하는 것이라고 생각된다.
💡아키텍처에도 상위/하위수준 이 존재한다.
ex) 파일암호화 개발
- 상위수준
- A 파일을 암호화해서 B파일에 저장한다.
- 하위수준 (저수준)
- A파일을 읽는다
- 읽은 데이터를 RSA 알고리즘을 사용하여 암호화한다.
- 암호화 한 것을 B파일에 저장한다.
public File encryp(File file) {
...
file.read....; //파일 읽는다. (A파일 읽기)
...
byte[] encryptedBytes = cipher.doFinal(encryptText.getBytes());
String encryptedText = new String(encryptedBytes, "UTF-8"); // 암호화한다.
...
...
...
File encrypFile = ... ; // 암호화한 파일을 저장한다. (B파일 읽기)
return encrypFile;
}
이러한 구조의 소스에서
상위수준은 encryp(...)를 부르는 메서드 혹은 encryp(...)메서드 의 행위들이 될 것이고,
하위수준은 encryp(...)메서드 안에 있는 실제 구현기술이 될 것이다.
이때에, 하위수준에 구현을 변경한다고하면 그에따라 상위수준들도 영향을 받게된다.
여러군데에서 암호화 하는 메서드를 호출한다고 할때, 그 내용(구현)을 바꾸면 여러군데 모두 영향이 간다는 이야기이다.
💡프로그래밍을 하다보면 상위와 하위수준이 섞여있는 경우가 많다.
그런경우 구현변경 때문에 다른코드에도 영향을 받게된다.
이렇게 되면, 역할과 책임이 깨지는 상황이 발생한다.
위의 문제는 상위수준(고수준)이 하위수준(저수준)을 직접 의존하고 있기 때문이다.
그렇다면, 어떻게하면 하위수준을 바꾸어도 상위수준에 영향을 주지 않을 수 있을까.?
✔️**의존을 반대로 하면 된다.** 그것을 DIP(Depending Inversion Principle) 라고 한다.
※ 이하 상위수준은 고수준, 하위수준은 저수준으로 표현.
- 기존 상태
- 고수준인 encryp 내에서 어떠한 암호화 구현을 하는 저수준을 직접 의존 하기때문에 아래와 같이 표현하였다.
- 개선 상태
- interface를 하나 만들어 저수준이 고수준인 인터페이스를 의존하는 형태로 바꾸었다.
위와 같은 형태로 인터페이스를 하나 만든다음, 저수준이 고수준을 의존하는 상태로 의존의 방향을 역전시켰다.
이는 3주차에 배웠던 추상화 중.. OCP같이 형태가 비슷하다.
- OCP와 DIP는 목적이 다르다.
OCP는 확장에 초첨을 두는 것이고,
DIP는 의존의 방향을 역전시켜 저수준의 구현이 고수준에게 영향이 가지않게 하는 의존성에 초점을 둔 것이다.
기존 상태에서는 고수준이 직접 저수준을 의존하고 있었지만,
개선한 상태에서는 저수준이 고수준을 의존하고 있게 된다.
그렇게 된다면, 저수준의 구현부분이 바뀌더라도 고수준이 호출하는 것은 바뀌지 않아도 되는 것이다.
'IT서적 & 세미나 > 사내 세미나' 카테고리의 다른 글
6주차 - CQRS (0) | 2022.03.03 |
---|---|
5주차 - 영역과 로직 (0) | 2022.03.03 |
3주차 - 추상화란? 어떨때 추상화를 하면 좋을까? (0) | 2021.12.21 |
2주차 - 캡슐화란? 자바에서 캡슐화 하는 이유. (0) | 2021.12.11 |
1주차 - 프로그래밍의 기능과 역할 (0) | 2021.12.11 |