- 참고: https://velog.io/@citron03/web3.js%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

 

 

- web3는 각 사용자가 노드가 되어 탈중앙화된 분산네트워크를 구성하여, 네트워크에서 정보를 읽거나 쓸 뿐만 아니라, 서비스를 제공할 수도 있는 이코노미를 의미한다.
- ⛲ web1은 클라이언트(사용자)가 서버로부터 컨텐츠를 제공받기만 했던 웹을 의미한다.
- 🎡 web2는 AJAX의 등장으로 클라이언트가 서버와 상호작용을 하여 서버에 데이터를 기록할 수 있는 웹을 의미한다.
- web2에서 소수의 플랫폼 기업이 사용자의 개인정보를 제공받아 이를 통해서 광고와 같은 수익을 창출하였다.
- 또한, web2에서는 해커들이 악의적으로 사용자들의 개인정보를 탈취하는 문제가 있다. ⚓ 또한, 개인 정보의 보안은 플랫폼 기업에 의존해야 한다.
- web3는 위와 같은 문제를 해결하고자 등장하였다.
- web3는 중앙집중적인 플랫폼 이코노미를 벗어나, 모든 참여자가 플랫폼이 될 수 있는 분산형 인터넷을 의미한다. ✈ web3는 이를 구현하기 위해서 블록체인 기술을 사용한다.
- web3에서는 모든 데이터가 공유되며, 동시에 암호화 기술을 통해 개인정보의 제공없이 사용자는 신원을 식별할 수 있다.

 

[0] CLI(command-line interface) 시스템 환경 세팅
 
 
1. openai 라이브러리 설치
$ pip install --upgrade openai
 
 
 
 
2. OPENAI API KEY 환경 변수 추가
$ export OPENAI_API_KEY="{OPENAI_API_KEY}"

 

 

 


 
 
 
 
[1] 학습 데이터 생성
 
<prompt와 completion는 무엇인가?>
- prompt: 쉽게 말해, 요청문(명령문 또는 질문)이다.
- completion: 쉽게 말해, prompt에 대한 응답문이다.
 
 
 
<명령어>
$ openai tools fine_tunes.prepare_data -f {LOCAL FILE}
 
 
 
<생성되는 TRAINING FILE(학습 데이터 파일) 이름>
{LOCAL FILE 이름}_prepared.jsonl
 
 
 
 
<LOCAL FILE 포맷 조건>
- 지원하는 파일 확장자 종류: CSV, TSV, XLSX, JSON, JSONL
- 데이터 구조: prompt와 completion가 서로 1:1 대응하여 쌍을 이루는 데이터 목록
- prompt와 completion 작성 조건:
   => "TRAINING FILE(학습 데이터 파일) 포맷 조건"에 맞게 학습 데이터 파일이 생성되도록 포맷 작성.
   =>  학습 데이터량이 많을수록 또는 prompt와 completion 포맷을 최적화할수록 prompt가 다양한 포맷으로 입력되더라도 원하는 completion을 응답 받을 수 있다.
 
 
 
 
 

 
 
 
 
[2] 학습 모델 생성
 
<명령어>
$ openai api fine_tunes.create --training_file {TRAINING FILE의 ID 또는 파일 경로} --model {GPT v3.0 BASE MODEL}
 
 
<TRAINING FILE(학습 데이터 파일) 포맷 조건>
- prompt 포맷 조건:
   => 문장의 끝에는 동일한 suffix(예를 들어, "\n\n###\n\n")가 존재해야 한다.
- completion 포맷 조건:
   => 문장의 시작에는 공백(whitespace)이 존재해야 한다.
   => 문장의 끝에는 특정 stop sequence(예를 들어, "###")가 존재해야 한다.
 
 
<GPT v3.0 BASE MODEL 종류>
- text-curie-001
- text-babbage-001
- text-ada-001
- davinci
- curie
- babbage
- ada

 

 

 


 

 

 

[3] 학습 모델 테스트
 
1. OpenAI Playground 사이트 접속 (https://platform.openai.com/playground)
 
2. 다음과 같이 항목 설정
- Mode: Complete
- Model: (학습시킨 모델명으로 설정)
- Temperature: (기본적으로 0으로 설정)
- Maximum length: (completion 데이터의 최대 길이보다 크게 설정)
- Stop sequences: (completion 포맷의 suffix로 설정)
- (나머지 항목들은 그대로 두기)
 
3. prompt 입력 후 [Submit] 버튼 클릭
 
4. 생성된 응답 값 확인

1. API는 영원하다!
2. 하위 호환성을 지켜주세요.
3. 고객 사용 사례에서 거꾸로 만드세요.
4. 오류가 명시적인 API를 만드세요.
5. 바로 목적과 사용법을 이해할 수 있는 API를 만드세요.
6. 구현 세부 정보는 누출되지 않게 신경을 쓰세요.

- 참고: www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC

 

 

역할

- 지정한 IP 주소(IP Address)에 데이터 전달

- 패킷(Packet)이라는 통신 단위로 데이터 전달

 

 

한계

- 비연결성

  • 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷 전송

- 비신뢰성

  • 중간에 패킷이 사라지면?
  • 패킷이 순서대로 오지 않으면?

- 프로그램 구분 못함

  • 같은 IP를 사용하는 서버에서 통신하는 애플리케이션이 둘 이상이면? (ex. 하나의 PC로 스트리밍 음악을 들으면서온라인 게임을 하는 경우)

- 참고: https://m.cafe.daum.net/fixshop/Eolw/21?q=D_Zr7V3tcjm6o0&

 

- OCX란 하나의 객체 연결 및 삽입(OLE) 맞춤형 컨트롤으로서, 윈도우 응용프로그램에서 사용되기 위한 특수 목적 프로그램이다. OCX는 윈도우 크기 조정이나 스크롤바의 움직임 등을 처리하는 기능을 제공한다.

- OLE는 문자, 그림, 소리, 동영상 등 여러가지 종류의 정보 양식을 가지고 있는 복합 문서를 지원하기 위해 설계되었다. 윈도우 데스크탑, 즉 바탕화면은 복합 문서의 대표적인 예이며, 마이크로소프트는 이를 구축하기 위해 OLE를 사용하였다.

- 마이크로소프트는 이제 OCX를 ActiveX control이라 부른다. OCX나 ActiveX control은 실제로 DLL 형태로 구현된다 (DLL은 수많은 애플리케이션에서 사용될 서브 프로그램으로 생각할 수 있다. 각각의 애플리케이션 프로그램은 DLL 또는 OCX/ActiveX control 객체에 대해 컨테이너가 된다). 비주얼베이직과 C++은 OCX와 ActiveX control을 만들기 위해 많이 사용된다.

 

 

 

OLE(Object Linking and Embedding, OLE)

- 객체 연결 삽입(Object Linking and Embedding, OLE)은 마이크로소프트가 개발한 기술로서 문서와 기타 객체에 연결과 삽입을 도와주는 연결규약이다. 용어 사전에서는 간단히 "윈도우의 각종 응용 프로그램 사이에서 서로 데이터를 공유할 수 있는 기능"으로 정의하고 있다.[1] 개발자들에게는 OLE 사용자 지정 컨트롤(OCX)를 제공함으로써 사용자 지정 UI 요소를 개발하고 사용할 수 있게 하고 있다. 

- 참고: https://bkjeon1614.tistory.com/27

- 참고: https://woongsin94.tistory.com/378

 

 

구조

1. Presentation Layer

- 사용자 인터페이스를 제공하는 계층이다.

- 정적 데이터를 제공하고 Web Server를 의미한다.

- Front-end라고 불린다.

- 비즈니스로직이나 데이터관리 코드를 포함하면 안 된다.

 

2. Application Layer

- 비즈니스 로직을 처리하는 계층이다.

- 동적 데이터를 제공하고 Web Application Server를 의미한다.

- Midleware 또는 Back-end라고 불린다.

 

3. Data Layer

- DB 또는 File System 데이터에 대한 접근 및 관리하는 계층이다.

- 주로 DB 서버를 의미한다.

'IT > Architecture' 카테고리의 다른 글

모노리틱(Monolithic) vs 마이크로서비스(Microservices)  (0) 2020.05.27
Microservice Architecture  (0) 2018.07.10

- Activity: 눈에 보이는 화면을 관리하는 실행 단위.

- Service: 화면을 가지지 않은 실행 단위. 백그라운드 프로세싱.

- Bradcast Receiver: OS가 메세지를 받으면 실해오디는 실행 단위.

- Content Provider: 저장된 데이터를 제공하기 위해 실행되는 실행 단위.

 

안드로이드 애플리케이션은 4대 구송 요소들을 통합 관리하는 번들 개념이다.

[10분 테코톡] 닉의 Spring vs Spring Boot

- 영상: https://www.youtube.com/watch?v=6h9qmKWK6Io

 

 

내용 정리

 

 

 

 

"Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

스프링 부트는 독립적이고 상용 수준의 스프링 기반 애플리케이션을 쉽게 만들 수 있게 해준다.

 

 

<비교>

  Spring  Spring Boot
Dependency 설정 모든 의존성을 버전까지 정확하게 설정 간략해지고 버전 관리도 권장 버전으로 자동 설정
Configuration 설정 설정량이 많다 설정량이 적다
서버 구동 시간 외부에서 다운 받아 설치과정 필요 - 톰캣과 jetty를 내장 서버(embedded server)로 갖추고 있어서 절반 가까이 단축
- 내장 서블릿 컨테이너 덕분에 jar 파일로 간단 배포 가능

 

- application.properties vs application.yml   =>  application.yml이 더 읽기 쉽다. 

 

- yml의 의미: YAML Ain't Markup Lanuage

 

 

<Spring Boot의 특징 정리>

1. 간편한 설정

2. 편리한 의존성 관리 & 자동 권장 버전 관리

3. 내장 서버로 인한 간단한 배포 서버 구축

4. 스프링 Security, Data JPA 등의 다른 스프링 프레임워크 요소를 쉽게 사용

'IT > Spring Framework' 카테고리의 다른 글

AtomicInteger와 Integer 비교  (0) 2020.04.25
@Transactional Rollback 조건  (0) 2020.03.19
@Transactional 사용 목적  (0) 2019.10.24
@Component, @Service, @Repository, @Controller의 차이  (0) 2019.06.10
Netty 개념  (0) 2019.01.19

[우아한테크세미나] 2020123 우아한모노리스 by 박용권님

 

내용정리

- 영상: https://www.youtube.com/watch?feature=youtu.be&v=SrQeIz3gXZg&app=desktop 

- 소스: https://github.com/arawn/building-modular-monoliths-using-spring

- 슬라이드: https://www.slideshare.net/arawnkr/ss-224478403

 

<모노리틱의 주요 단점과 한계>

1. 예상치 못한 결합 => 변경에 의한 영향이 크기 때문

2. 높은 테스트 비용 => 변경에 의한 영향이 크기 때문

3. 늦은 출시 싸이클 => 변경에 의한 영향이 크기 때문

4. 부족한 장애 내성

5. 단일 확장성 => 애플리케이션의 복사로 이루어지는 수평 확장

 

 

<마이크로서비스의 주요 장점>

1. 확장성

2. 조직 부합성  =>  "콘웨이의 법칙": 소프트웨어 구조는 개발 조직의 커뮤니케이션 구조를 닮는다.

3. 회복성

4. 배포 용이성

5. 조합성

6. 기술 이기종성

7. 대체 가능성

 

=> 한마디로, "자율적"

 

 

"The goal of software delivery is to minimize the lead time to business impact. Everything else is detail."

by Dan North ( https://dannorth.net/2013/07/05/are-we-nearly-there-yet )

 

- 해석:

"소프트웨어 개발의 목적은 긍정적인 비즈니스 영향력을 사용자에게 최대한 빠르게 전달하는 것"

 

 

"응집(Cohesion)결합(Coupling)을 다스리는 것이 먼저다"

1. 적은 비용으로 변경할 수 있는 구조 만들기

2. 주어진 상황에 따라 적절한 도구를 선택하자

 

 

<모노리스(Monoliths)의 특징>

- 단일 프로젝트에 모든 코드가 모여있다.

- 시스템 구조가 간결하고, 빠르게 구축할 수 있다.

- 테스트 및 배포 파이프라인 구성이 간단하다.

- 인프라스트럭처 구축과 운용이 간결하다.

 

<마이크로서비스(Microservices)의 특징>

- 시스템을 조직 구조에 맞게 더 적절히 정렬할 수 있다.

- 서비스를 독립적으로 배포 또는 확장할 수 있다.

- 서비스 장애가 시스템 전체 장애로 전파되지 않는다.

- 문제 해결에 특화된 다양한 기술을 도입할 수 있다.

 

 

<모노리스의 유형>

1. 모노리스(Monoliths)

2. 분산된 모노리스(Distributed Monoliths)

3. 모듈형 모노리스(Modular Monoliths)

4. 마이크로서비스(Micreservices)

 

 

"좋은 아키텍처는 시스템이 모노리틱 구조로 태어나서 단일 파일로 배포되더라도, 이후에는 독립적으로 배포 가능한 단위들의 집합으로 성장하고, 또 독립적인 서비스나 마이크로 서비스 수준까지 성장할 수 있도록 만들어져야 한다. 또한 좋은 아키텍처라면 나중에 상황이 바뀌었을 때 이 진행 방향을 거꾸로 돌려 원래 형태인 모노리틱 구조로 되돌릴 수도 있어야 한다."

by '클린 아키텍처' 도서

 

 

* 모듈(Module): 서로 관련성이 높은 클래스 집합을 하나의 논리적인 단위로 묶는 구성요소로서, 이를 자바에서는 패키지라 부른다.

 

* 모듈화(Modularization): 소프트웨어 시스템을 분해(decomposition)하여 서브 시스템들과 컴포넌트들의 그룹으로 묶는 것이다. 주요 목적은 시스템 내에 잘 정의된 경계(Boundary)를 도입해 소프트웨어 복잡성을 다루는 것이다.

 

- 결합(Coupling)은 모듈들 사이(inter-module)의 관계에 집중한다.

- 응집(Cohesion)은 모듈 내부(intra-module)의 상태에 집중한다.

 

 

 

<변경을 수용할 수 있는 소프트웨어 아키텍처>

 

관심사의 분리를 통해 "애플리케이션 핵심을 외부 기술적인 부분들과 분리시키는 것"이 목표이다. 이렇게 분리 된 영역은 필요에 따라 어렵지 않게 변경이 가능해야 한다.

 

 

 

 

 

 

 

 

 

 

 

내부 영역은 도메인 개념을 구현한 코드가 배치되고, 외부 영역은 구현 세부사항(UI, 데이터베이스 등)과 상호작용하는 코드를 배치한다. 반드시 지켜야할 원칙은 외부에서 내부로 접근하는 의존 방향이다. 절대 그 반대로는 안 된다.

 

 

 

 

 

 

 

 

 

1. 도메인 중심으로 응집도 높은 모듈 구성하기

- 도메인을 중심으로 세부사항(DB, Web 등)이 분리된 구조를 만든다.

- 도메인 지향 모듈화와 함께 바운디드 컨텍스트(Bounded Context)를 고려한다.

  ㄴ바운디드 컨텍스트는 도메인 주도 설계(Domain-driven design)에서 전략적 설계에서 언급되는 용어로서, 의미적으로 통일한 컨텍스트의 범주를 표현하는데, 범주 내에서 소프트웨어 모델의 각 컴포넌트들은 컨텍스트에 특화되어 있으며, 컨텍스트 내에서 특정한 의미를 갖고, 특정한 일을 수행한다.

 

 

<모듈화 기법>

1. 계층 구조로 모듈화

2. 도메인 지향 모듈화 (+ 내부적으로 계층 구조를 가진)

3. 수직적 관심사(비즈니스와 응용프로그램에 특화된 기능)  => 비즈니스 로직의 구현에 초점

4. 수평적 관심사(로깅, 보안 등 공통적인 저수준 기능) => 재사용성에 초점

 

 

 

2. 의존성 관리로 느슨하게 결합된 모듈 설계하기

- 모듈관 순환적 의존 관계가 형성되지 않도록 설계한다.
- 참고: '오브젝트' 도서

- 참고:

우아한 객체지향 by 조영호님 https://www.youtube.com/watch?v=dJ5C4qRqAgA&feature=youtu.be

 

<전략적으로 시스템 통합을 돕는 컨텍스트 매핑>

컨텍스트 매핑은 둘 이상의 바운디드 컨텍스트를 통합하는 것을 말한다.

ㄴ도메인 주도 설계(DDD)에서 전략적 설계에서 언급되는 용어로서, 컨텍스트 매핑은 8가지 매핑전략을 제공하는데 상황에 따라 적절하게 전략을 선택해 활용할 수 있다.

 

 

3. 모듈 사이 경계를 넘어오지 못하게 선 긋기

 

4. 멀티프로젝트 구성을 통해 의존성 분리하기

 

5. 모듈 자율성을 지켜주는 컨텍스트 경계 구성하기

- 자율성은 모듈의 내부와 외부를 명확하게 구분하는 것으로부터 나온다. 단일 스프링 IoC 컨테이너에서는 모듈의 내부를 숨기는데 한계가 있다. 이 한계를 극복하고, 모듈의 자율성을 지켜주는 컨텍스트 경계를 구성한다.

 

 

 

<컨텍스트 계층 구조>

 

 

6. 컨텍스트 계층 구조로 모듈을 격리하기

 

 

7. 컨텍스트간 협력을 위한 공개 API 내보내기

 

<컨텍스트 설정 모듈화>

 

8. 시스템 분리와 독립적인 서비스로 성장하기

 

 

<모듈형 애플리케이션 구축을 지원하는 도구>

1. Moduliths

https://github.com/odrotbohm/moduliths

 

 

2. Across Framework

https://across.dev/

 

 

 

 

"software maintenace is not "keep it working like before."

It is "keep it being useful in a changing world" - a great art of its own

by Jessica Keer, Atomist ( https://twitter.com/jessitron/status/728270662414934016 )

 

- 해석:

소프트웨어 유지보수는 이전과 같이 계속 동작하게 하는 것이 아니라,

변화하는 세계에서 계속 유용하게 하는 것이다.

'IT > Architecture' 카테고리의 다른 글

3-Tier Architecture  (0) 2020.12.18
Microservice Architecture  (0) 2018.07.10

공통점: 둘 다 int형을 wrapping한 클래스

차이점: AtomicInteger는 thread-safe하여 동시성(Concurrency)을 보장한다.

'IT > Spring Framework' 카테고리의 다른 글

Spring vs Spring Boot  (0) 2020.05.29
@Transactional Rollback 조건  (0) 2020.03.19
@Transactional 사용 목적  (0) 2019.10.24
@Component, @Service, @Repository, @Controller의 차이  (0) 2019.06.10
Netty 개념  (0) 2019.01.19

+ Recent posts