daily-document's People
daily-document's Issues
개인문서
웹 프론트
웹 퍼블리싱
bootstrap 디자인 보다 ant 디자인이 개인적으로 훨씬 깔끔하다고 느낌
https://ant.design/
React
react life cycle 한글 문서
https://jaeyeophan.github.io/2018/01/02/React-tips-for-beginners/
Mapbox
크롬 extention 추천
zenhub (github projects 보다 괜찮음)
jsonviewer (json 깔끔하게 보고 싶을때 )
liner (웹 페이지 밑줄 긋는 기능)
디자인
intellij 잘쓰기
몽고
index 만들때 background 를 true 로 해야함
안그럼 서비스에 영향을 줌!
https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/
SQL 레벨업
postgresql getting started with docker
https://docs.docker.com/samples/library/postgres/#connect-to-it-from-an-application
$ docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres
psql (9.5.0)
Type "help" for help.
postgres=# SELECT 1;
?column?
----------
1
(1 row)
# docker run -it --rm --link 연결시킬 postgresql도커이름 postgres psql -h postgres -U postgres
docker run -it --rm --link postgresql:postgres postgres psql -h postgres -U postgres
Git
Gitflow 가 과연 좋을까?
필자는 Gitflow 가 좋다기 보단 브랜치 전략을 세우는게 좋다는걸 얘기하고싶다. 브랜치 전략이 있으면 프로젝트 개발 방식 패턴을 빠르게 익히고, 팀의 다른 개발자의 작업을 방해하지 않으면서도 자신의 작업을 통합할 수 있다.
릴리즈 방식을 정하고 그에 맞게 브랜치 전략을 세우면 된다.
브랜치 전략은 크게 3가지 종류가 있다.
-
[메인라인 브랜치 (Github Flow)] 모든 커밋을 한 브랜치만 사용한다.
https://guides.github.com/introduction/flow/
로컬/개발/리얼환경 에 따른 브랜치가 있는게 아니라 단순하다. 다른 전략들에 비해 브랜치 depth 가 짧아서 코드에 문제가 없음이 명백한 프로젝트 또는 문제가 있어도 이슈가 안되는 프로젝트에 적합하다. -
[기능별 브랜치 배포]
메인라인에서 master 에 바로 머지하지 않고, 통합 브랜치에 먼저 머지한다. 기능 브랜치는 한사람이 여러 기능을 개발할때를 포함하여 기능마다 브랜치를 만든다. 어떤 기능을 마스터 브랜치에 언제 통합할지를 결정할 수 있다. 기능브랜치에서 오래걸리는 기능을 개발할땐 통합브랜치에 내용을 자주 pull 해야한다. 기능별로 브랜치를 따기 때문에 어떤 기능을 위한 브랜치인지 처음보는 사람은 이해가 어려울 수 있다. -
[정기 배포 브랜칭 전략 (Git Flow)]
기능/개발/품질보증/제품완성으로 훨씬 세분화된 브랜치 전략이다.
필자는 앱/웹프론트와 협업이 필요한 API 서버에서 기능별 브랜치 전략을 사용한다. 상황에 따라 기능을 통합에 추가할지 말지 결정하고, 테스트환경에 통합브랜치를, 리얼 환경에 마스터브랜치를 적용하고 있다. 단 급하게 리얼에 반영이 필요한 상황은 정기배포 브랜치 전략의 hotfix 브랜치를 사용하여 보완하고 있다.
Gitflow 의 경우 실제 개발 프로세스가 간소화 되어있다면 Gitflow 를 사용하는건 오버 스펙일 수 있다고 생각된다.
Cloud Platform
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
cd training-data-analyst/CPB100/lab2b
bash ingest.sh
head earthquakes.csv
bash install_missing.sh
python3 transform.py
gsutil cp earthquakes.* gs://<YOUR-BUCKET>/earthquakes/
gsutil acl ch -u AllUsers:R gs://<YOUR-BUCKET>/earthquakes/*
gcloud auth list
gcloud config list project
git clone https://github.com/GoogleCloudPlatform/training-data-analyst
cd training-data-analyst/CPB100/lab3a
less cloudsql/table_creation.sql
head cloudsql/*.csv
gsutil cp cloudsql/* gs://<BUCKET-NAME>/sql/
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
chmod +x cloud_sql_proxy
./cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:3306 &
mysql -u root -p --host 127.0.0.1
use recommendation_spark;
show tables;
select * from Rating;
select * from Accommodation where type = 'castle' and price < 1500;
앱 API 추적하기
Spring
AOP
-
AOP가 뭐야?
관점 지향 프로그래밍 입니다.
Transaction 같이 재사용 가능한 기능들을 비즈니스 로직에서 분리하고 유연하게 적용할 수 있는 방법인데,
여기서 Transaction 같은 재사용할 수 있는 기능을 관점이라 합니다.
프록시는 클라이언트가 타깃에 접근하는 방법을 제어하고, 타깃에 부가적인 기능을 부여해주기 위해 존재합니다. -
AOP 왜쓰는거야?
OOP만으로는 모듈화 하기 힘든 부가 기능을 효과적으로 모듈화하도록 도와주는 기술입니다. -
AOP 어떻게 동작하는 거지?
다이내믹 프록시는 아래 reflect 예시와 같이 리플랙션 기능을 이용해서 프록시를 만듭니다.
리플랙션은 자바의 코드 자체를 추상화해서 접근하도록 만든 것입니다.
String name = "test";
int expected = name.length();// 4
Method lengthMethod = String.class.getMethod("length");
int actual = (int) lengthMethod.invoke(name); // 4
스프링은 내부적으로 리플랙션을 사용해서 빈 정의에 나오는 클래스이름을 가지고 빈 오브젝트를 생성합니다.
문제는 다이내믹 프록시 오브젝트는 이런 식으로 프록시 오브젝트가 생성되지 않는것 입니다.
클래스 자체를 내부적으로 다이내믹하게 새로 정의해서 사용하기 때문입니다.
다이내믹 프록시는 Proxy.newProxyInstance()
라는 스태틱 팩토리 메소드를 통해서만 만들 수 있습니다.
프록시에 팩토리 빈을 이용한 DI까지 더해주면 번거로운 프록시 생성 코드도 제거할 수 있습니다. new ProxyFactoryBean()
그럼 타깃 오브젝트에 상관없이 독립적으로 만들어 질 수 있다. 싱글톤 빈으로 등록 가능합니다.
(다이내믹 프록시라는 런타임 코드 자동생성 기법을 이용)
이때 스프링은 어드바이저를 이용하여 자동으로 프록시를 생성합니다. DefaultAdvisorAutoProxyCreateor 는 빈으로 등록된 모든 어드바이저 내의 포인트컷을 이용해 전달 받은 빈이 프록시 적용대상인지 확인하고, 내장된 프록시 생성기에게 현재 빈에 대한 프록시를 만들게 하고, 만들어진 프록시에 어드바이저를 연결해줍니다. 빈 후처리기는 프록시가 생성되면 원래 컨테이너가 전달해준 빈 오브젝트 대신 프록시 오브젝트를 컨테이너에게 돌려줍니다. 컨테이너는 최종적으로 빈 후처리기가 돌려준 오브젝트를 빈으로 등록하여 사용합니다.
참고로 스프링에서는 프록시를 사용하지만,
Aspectj 에서는 프록시가 아닌 바이트코드 직접 생성과 조작해서 aop를 구현합니다.
Aspectj 를 사용하면 타깃 오브젝트를 직접 수정해버려, 스프링같은 DI 컨테이너의 도움을 받지 않아도 됩니다.
프록시는 타겟이 메소드 뿐인데, 바이트코드를 직접조작하면 필드값도 수정가능하고 여러 가지 강력한 기능을 제공합니다.
- 참고자료
https://www.slideshare.net/AnselmKim/3-aop-ltw
https://docs.spring.io/spring/docs/2.0.x/reference/aop.html
https://www.baeldung.com/aspectj
아래는 참고자료에 내용입니다.
프록시 개념은 데코레이터 패턴에서 나온것이고, 동작원리는 JDK 다이내믹 프록시와 DI를 이용
자동 프록시 생성기에 의해 만들어진 프록시와 빈 처럼 수동으로 등록한 프록시의 차이점
- 자동 프록시 생성기가 만들어 주는 프록시는 새로운 빈으로 추가되는 것이 아니라 매 대상 타깃 빈을 대체
- 결과만 본다면 수동이나 자동이나 프록시가 클라이언트와 타겟 사이에 DI를 통해 끼어들어서 부가 기능을 제공했기 때문에 똑같아 보 일 수 있다.
- 하지만 등록된 빈의 관점으로 보면 자동에서는 타겟 오브젝트가 빈으로 직접 노출되지 않는다.
자동 프록시 생성기의 특징
- 1. AOP 적용은 @Autowired 타입에 의한 의존관계 설정에 문제를 일으키지 않는다.
- 직접 타깃 오브젝트의 인터페이스를 구현한 프록시를 적용한 경우에는 클라이언트가 @Autowired 를 사용할 수 없다.
- 자동 프록시 생성기를 사용하는 프록시 AOP에서는 이런 문제가 발생하지 않는다.
- 2. AOP 적용은 다른 빈들이 Target 오브젝트에 직접 의존하지 못하게 한다.
- XML 이나 애노테이션을 통해 빈으로 등록된 타겟 클래스를 프록시 안에 감춰 버린다.
- 프록시는 근본적으로 타겟 클래스와 동일한 인터페이스를 구현해야 하므로, 프록시 빈은 인터페이스 타입을 갖게 될것
## 프록시 종류
- 아무런 인터페이스도 구현하지 않은 타깃 클래스에 AOP 적용하는 법
- 1. 타깃 클래스 자체를 인터페이스처럼 사용
- 2. 클라이언트가 타깃 클래스에 의존하는 것은 변하지 않음
- 3. 타깃 클래스를 상속한 서브 클래스를 만들어서 이것을 프록시로 사용
- 4. 프록시를 만들기 위한 클래스 상속 > public 메소드를 모두 오버라이드해서 프록시 기능으로 전환
- 5. 제약조건
- final 클래스와 final 메소드에는 적용이 안됨 = 타깃 클래스의 생성자가 두번 호출됨
- 강제로 클래스 프록시를 만들도록 설정
- 클래스 프록시를 강제하면, 인터페이스가 있더라도 무시하고 클래스 프록시를 만듬
- proxy-target-class="true"로 설정해주면, 인터페이스의 존재와 상관없이 클래스 프록시가 만들어진다.
## Aspect
- 포인트컷 : 안에 포트트컷 표현식을 넣어서 정의
- 어드바이스 : @Before, @After @Aspect 클래스 안에 여러 어드바이스 선언
## Aspect AOP
번거로운 클래스 파일의 바이트코드를 조작을 필요로 하는 이유?
- 프록시 방식으로는 어드바이스를 적용할 수 없는 조인 포인트와 포인트컷 지시자를 지원하기 위해
- 자바의 프록시 기법을 이용해서는 특정 오브젝트가 생성된 시점이나 특정필드를 읽을 지점에 어드바이스를 추가할 방법이 없다.
- 이런 조인 포인트에 어드바이스를 추가하려면 조인 포인트 위치의 코드를 변경하는 수 밖에 없다. 그래서 AspectJ는 복잡하지만 바이트코드 자체를 조작하는 방식을 선택
스프링 AOP 와 Aspect AOP 를 동시에 적용하는 것은 피하는 것이 좋다.
* <p>Naturally, as this is to be processed by Spring AOP's proxy-based model,
* only method execution pointcuts are supported.
intellij lombok 안될때
Shell
curl https://url -o output.file.name
tar zcvf test.tar.gz test # 압축하기
tar zxvf test.tar.gz # 압축풀기
x : 묶음을 해제
c : 파일을 묶음
v : 묶음/해제 과정을 화면에 표시
z : gunzip을 사용
f : 파일 이름을 지정
p : 권한(permission)을 원본과 동일하게 유지
JVM
BASIC
https://blog.takipi.com/jvm-architecture-101-get-to-know-your-virtual-machine/
JVM 안에 여러 쓰레드가 있고,
쓰레드 안에 스택이 있고,
스택 안에 프레임이 있음
프레임 안에는 2가지가 있는데,
디자인
figma
layout 8pt
R = rectangle
cmd + drag
option + scroll
space + 화면움직이면
화면 움직임 가능
option + cmd + t 가운데
option + h
option + v 두도형으로 가운데 정렬
option -> 비율 pt 알려줌
cmd + r 이름바꾸기
opt + cmd +c,v 복붙 스타일
sift + a 프레임화
APM
JAVA
객체 지향
-
객체 지향이 뭐예요?
Object Oriented Programming
객체가 상태와 기능을 갖고 있어서, 객체들끼리 소통하는식으로 프로그래밍을 하는거예요.
객체가 각자 자기만의 역할과 책임을 갖고 객체들끼리 협력 하는 거예요.예를 들어 면접관이라는 객체가 있고, 면접자라는 객체가 있고, 면접결과라는 객체가 있으면
면접관이 면접자에게 질문을 던지고 면접자는 답변하고,
면접관은 의견을 듣고 면접결과에 A면접자에 대한 평가를 기록해두고,
면접결과는 면접자에게 합격했는지 알려주는 거죠.
면접관이 면접자의 자세한 정보를 알고 있지 않아요,
질문만 던질 수 있고 평가를 해서 괜찮은 사람인지 평가하는 역할을 갖고 있어요.
또 면접자는 자신이 어떻게 평가되는지는 알진 못하고, 나중에 면접결과를 받아 합격했는지 알 수 있죠. -
객체 지향은 왜 쓰는 거예요?
기능별로 잘게 잘게 분리해서 정리해두는 거예요.
면접관은 면접자가 동생이 있는지 형이 있는지 관심없고, 그 저 면접자에 괜찮은 개발자인지에 대한 평가를 하는데에 집중하게 되는거죠. -
객체 지향 장,단점은 뭐가 있을까요?
객체 지향을 위해 끊임없이 고민해야해요. 객체를 최대한 하나의 책임만 갖도록 나누고, 역할을 부여하고, 객체들끼리 소통해야하고 등등 굉장히 객체지향적으로 코드를 짜려고 굉장히 고민을 많이 해야해요. 그리고 객체지향적으로 짜다보면 객체 생성하고 상태기능 만들고 코드양이 굉장히 많아져요. 그래서 객체지향언어인 JAVA는 intellij 나 eclipse 같은 ide 가 없으면 사실 불가능하죠. -
SOLID 원칙 들어보셨나요? SOLID 설명해줄 수 있어요?
SRP : Single Responsibility Principle, 단일 책임 원칙
객체는 오직 하나의 책임을 가져야 한다.OCP : Open Close Principle, 개방-폐쇄 원칙
객체는 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 원칙
예를 들어 버스도착예정정보API에서 버스도착예정정보가 각 지자체마다 제공하는 데이터는 다른데, 도착예정정보라는 객체는 서비스에 사용할 정보만 알고 싶어해요. 서울시에서는 혼잡도 정보를 제공하고, 경기도는 제공하지 않는다던지, 서울시는 이 버스가 A정류장에 도착했는지, 막 출발했는지에 대한 상태코드를 1도착,2출발 로 두고 경기도는 1정차,2출발,3도착 이렇게 제공할 수도 있는거죠. BusArrival 라는 객체는 혼잡도에 대한 정보를 조회할수도, A정류장에 도착했는지 출발했는지도 알 수 있는데, 하위 모듈인 SeoulBusArrival 이나 GyeonggiBusArrival이 어떤 데이터를 갖고있고 어떤 기능을 하는지 알 필요가 없는거죠.LSP : Liskov Substitution Principle, 리스코프 치환 원칙
자식 클래스는 언제나 부모 클래스를 대체 할 수 있다는 원칙
예를들어 자바에 List 라는 인터페이스가 있고, 그 구현체인 ArrayList, LinkedList 가 있어요. List대신 ArrayList 나 LinkedList로 대체 할 수 있다는 거죠. 그얘기는 또 List가 ArrayList 와 LinkedList 로 대체할 수 있으니 넌 그냥 List 만 쓰면되 라는 의미를 갖고 있는 거죠.ISP : Interface Segregation Principle, 인터페이스 분리 원칙
인터페이스를 작게 나눠가져서 역활을 정리해라DIP : Dependency Inversion Principle, 의존성 역전 원칙
추상적인 상위 모듈이 하위 모듈에 의존해서는 안된다는 원칙SOLID 원칙이 위반 되는 상황: public static 메서드는 SOLID 원칙을 깨뜨린다. 상속 받아 기능 확장 못할 수 없어, 객체 지향상 좋지 않지만 강력하다.
Go Lang
Go는 GoRoutine 이라는 비동기 매커니즘을 제공한다. Erlang 에서 영향을 받은 것으로 각각의 고류틴은 병렬로 동작하여 메시지 채널을 통해 값을 주고 받는다. 고루틴을 사용하면 이벤트 처리, 병렬 프로그래밍이 간단해진다.
처음시작할때 읽어보면 좋을듯
https://1ambda.github.io/golang/golang-tutorial/
치트시트
https://github.com/a8m/go-lang-cheat-sheet#basic-syntax
GC 에 대해
https://engineering.linecorp.com/ko/blog/go-gc/
외워두면 편한 명령어들
go get .../.
# go get 이 안먹혀서 하나씩 package 설치
go get "github.com/cridenour/go-postgis"
./configure
make
make install
C관련 라이브러리가 안먹힐때
확인확인!!!
export C_INCLUDE_PATH=/usr/local/include
golang 괜찮은 라이브러리 모음집
https://github.com/avelino/awesome-go#database
괜찮은 블로그
https://jaehue.github.io/post/how-to-use-golang-context/
개발자 맥북 세팅~!
- 크롬 설치
- 사용자 로그인 : babbayo
- 익스텐션설치 : zenhub, keep
- 서브라임텍스트 설치
- 패키지 설치 : emmet, highlight, convertToUTF8
- intellij
- preference - editor.codestyle scheme expert-import 하기
- #4, #3
- https://ink1234.tistory.com/10
- xcode
- spectacle
- redis-tool: medis https://github.com/luin/medis
- sourcetree
- sourcetree 에서 터미널을 실행할때 최근 버전은 실행되지 않는 문제가 있다! 이전 버전을 설치하고 최근걸 설치하면 문제가 사라진다고 한다! https://community.atlassian.com/t5/Sourcetree-questions/macOS-Catalina-Terminal-Button-Always-Opens-in-Home-Folder/qaq-p/1238466
잡다한 이야기
프로그래머스 2019 개발자 설문조사 리포트
https://programmers.co.kr/pages/dev-survey-2019
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.