2020년 02월의 MIL
Mar 01, 2020 조회수 336
2020.02, Montly I Learning
<br>
02.01
- 약속
<br>
02.02
- project. podo-dev
- 태그로 검색 시, 대/소문자 태그 구분 제거
- css, header 태그 line-height 변경
- study
- 자동차경주 스텝 3 진행
<br>
02.03
- book. 오브젝트
믹스인
에 대한 내용scala
에trait
키워드를 예제로 공부,- 상속은 is-a관계를 만들지만, 믹스인은 말그대로 코드를 다른 코드에 섞어 넣기 위한 방법이다.
다형성
- 다형성 분류 (매개변수, 포함, 오버로딩, 강제 다형성)
- 상속은 코드의 재사용이 아닌, 다형성을 가능하게하는 타입 계층을 구축하기 위함이다.
- 상속의 메커니즘
- 업캐스팅
- 동적 메소드 탐색
- 동적바인딩
- self 참조
- super 참조
- 데이터 관점에서의 상속
- 자식클래스가 부모클래스의 데이터 접근 가능한 링크가 존재한다.
- 행동 관점에서의 상속
- 클래스 정보는 메모리에 한번 로딩 되고
- 각 객체는 독립된 메모리를 가지며 class 정보를 가리키는 링크가 존재한다.
- 메세지를 수신한 객체는 자신의 클래스에서 적절한 메소드를 찾는다.
- 없다면, 부모클래스를 차례대로 훓어가면서 적절한 메소드를 찾는다.
- 자식클래스에서 부모클래스로 메소드 탐색이 가능하기 때문에,
- 마치 복사본을 가지고 있는것처럼 보인다.
업캐스팅
- 부모클래스 타입으로 자식클래스의 인스턴스를 할당하는것이 가능하다
동적바인딩
- 컴파일 시점이 아니라 실행시점에 호출될 메소드를 결정한다
- book. DDD start!
- 출퇴근길 새로 읽기 시작한책
- 코드 진짜 깔끔하구낭.. https://github.com/madvirus/ddd-start
1장. 도메인 모델의 시작
리딩- 입사 후 여러 서치를 통해서 배웟던 내용이 나왔다.
- 도메인에 대한 이해 ( 개념모델, 구현 모델)
- 도메인 용어를 사용하는 이유, 왜 변수명이 중요할까에 대한 해답.
엔티티
,값타입
,dto
에 차이setter
사용에 문제점
- 요구사항을 보고, 개념모델을 정의하는 과정이 인상깊었다.
- spring-gateway
- gateway + auth server + resoucre server 데모 구현중
- jwt token 사용
- https://github.com/cglee079/podo-gateway-jwt
<br>
02.04
- book. 오브젝트
12장, 다형성
을 읽고 있다.. 갓갓..- self 참조
- 상속은
자동적인 메세지 위임
이다. - super 참조
- 위임과 포워딩의 차이.
- book. DDD Start!
2장. 아키텍쳐
리딩
- lecture. spring-security
@AuthenticationPrincipal
<br>
02.05
- think.
- 요즘 머리에 지식을 밀어넣고 있다는 생각이든다.ㅠ
- 복습의 시간이 필요하다.
- todo.
podo-dev
에 자동 저장 기능이 로컬에 있는데,
작성중 서버에 저장하는 기능을 추가해 게시글 버전 관리(?)를 해볼까한다.
나름 열심히 쓴글인데, 혹시 모를 사고를 방지해보자.ㅜ
- book. 오브젝트
13장 서브클래싱/서브타이핑
리딩- 상속은 서브타이핑을 목적으로 사용해야한다.
- 상속관계는 다형성을 위한 타입계층을 구축하는것으로 사용하는 것이다.
is-a
관계는 행위호환성을 보장해야한다, 어휘를 말하는것이아니다.is-a
관계에 앞에에는클라이언트 관점
을 붙여서 생각해보자.- 클라인트관점에서 동일한 행위를 하는가, 행위보장성을 생각해보자.
- 클라이언트를 격리한채로는 의미있는 검증이 아니다.
리스코프 치환원칙
은 행위호환성에 대한 내용이다리스코프 치환원칙
은 개방폐쇄 원칙이다.리스코프 치환원칙
을 지키지 않는다면, 어떻게 확장에 열려 있다 할 수 있을까?
- book. DDD start!
- 웹을 통해서 배운내용이, 이 책에 다있구나..!
3장, 애그리거트
리딩
- study
자동차경주
코드리뷰자동차경주
가 거의 끝나간다.
<br>
02.06
- book. 오브젝트
13장 서브클래싱/서브타이핑
리딩- 클라이언트 관점에서 자식클래스가 부모클래스를 대신하는것은 무엇을 의미할까?
사전조건
과사후조건
을 확인하자.- 서브타입은 같거나 약한
사전조건
을 정의 할 수 있다. - 서브타입은 같거나 더 강한
사후조건
을 정의 할 수 있다.
14장 일관된 협력
리딩- 비슷한 요구사항과 추상화에
- 일관성 있는 설계를 해야한다.
- 휴대폰 요금제 중
요일별 요금제
,시간별요금제
,구간별 요금제
는 - 비슷한 요구사항이며
요금제
로 추상화하여 역할을 지정 할 수있다. - 하지만 구체적인
@@요금제
는 일관된 설계를 가져야 한다. - 일관된 설계는 코드를 재사용하며, 하나의 코드의 가독으로 다른코드를 직관적으로 이해 할 수 있게 한다.
- 내일은 일관성있는 설계로 전환된 코드를 살펴봐야징.
- book. DDD start!
- 어제 내용을 복습했다.
4장 JPA
리딩jpa
문법에 관한내용인데, jpa를 복습하는 시간이 됬다.
- gateway-jwt.
- gateway, jwt(access, refresh), redis 연동 구현
- 로그아웃했을 때, jwt를 어떻게 관리할까?
- 블랙리스트를 만들자. 외부랑은
redis
로 연동
- etc
- 마이크로서비스간에
http
통신은 안티패턴이다. redis pub/sub
는 데이터 유실이 발생가능한데,- 해결책으로,
redis stream
을 발견했다. spring batch + query dsl
<br>
02.07
- 약속
- book. 오브젝트
14장 일관된 협력
리딩- 변하지 않는것과, 변화는 것을 분리하라
- 캡슐화의 내용
- 캡슐화는 변화는 모든 것을 감추는 것이다
- 데이터 캡슐화
- 객체 캡슐화
- 메소드 캡슐화
- 서브타입 캡슐화
- 일관성있는 협력은
객체캡슐화
,서브타입 캡슐화
와 관련이 깊다.
<br>
02.08
- 약속
- book. 오브젝트
15장 디자인 패턴
리딩- 디자인 패턴에 대한 이해
- 프레임워크에 대한 이해
제어의 역전
을 이제야 깨달았다.
<br>
02.09
- book. 오브젝트
부록B. 타입계층의 구현
리딩- 구체클래스, 추상클래스, 인터페이스
- 구체클래스 보다 추상 클래스를 상속하라.
- 근데 이책에서 나온 여지껀 나온 상속은 구체클래스가 문제였던건가?
- 추상골격클래스
- 아아 이해가안된당 ..ㅠㅠ
- project. podo-dev
- jwt 토큰 적용.
- 게시글 저장 시 history 관리 기능 추가
<br>
02.10
- 약속
- book.오브젝트
부록B. 타입계층의 구현
리딩- 클래스는 타입 정의와, 객체 구현을 동시에 한다.
- 하지만 타입정의와 객체 구현이 다를 수 있다.
- 인터페이스를 통해 타입을 정의하고, 클래스를 통해 구현한다.
- lecture. spring-data-jpa
- 새로 듣기 시작한
김영한
님의 강의 - 일반 jpa를 어떻게 추상화하여,
spring
에서 어떻게 편하게 지원하는지 비교하며 학습 - 전반적으로 복습적인 내용
- 인터페이스로 선언된
repository
를spring
이 구현체를 작성한다. sout(repository.getClass()
해보면proxy
가 찍힌다.- 새로알게된 쿼리 메소드
- docs
find...By
였다. 따라서findPodoHelloBy()
도 되네..? //findAll()
로 호출find...By
==read..By
==query...By
==get...By
getOne()
엔티티를 프록시로 조회한다.delete...by
==remove...by
findDistict
- LIMIT :
findFirst3
,findFirst
,findTop
,findTop3
- 쿼리메소드 사용 시
and
두개 이상이면 너무 길어져서, 따로 쿼리정의해서 사용한다고 함.
- etc
- planetUML 앞으로 사용할 듯 싶다.
- 마크다운으로 UML 그리는 방법.
- 신기한게, 마크다운에서 렌더링하면 이미지로 주입된다.
- 링크는 planetUML 웹사이트인데,
- 렌더링하면서 planetUML 서버쪽에서 렌더링하여서 이미지를 반환하는것 같다.
- 이거 안전할까..??
<br>
02.11
- book. 오브젝트
- 정리한내용을 다시한번 리딩했다.
- 정말 갓책이다..
- 이제부터는 DDD! start에 집중.
- study.
- 자동차 경주가 끝났고, 피드백 내용을 정리해서 공유.
- lecture. spring-data-jpa
CRUDRepository
는spring-boot-data
의존성에 존재한다.- 즉,
jpa
뿐만 아니라, 다른spring-boot-data-**
에서도 사용하도록 추상화했다. - 갓추상화.!
- 즉,
jpa
전체적인 복습내용.@Query
- 특출난 장점 : 쿼리 에러시, 컴파일시에 에러를 띄운다!
Dto
로 반환받기- 인자가 맞는 생성자가 필요하다.
select new study.datajpa.repository.MemberDto(m.id, m.username, t.name from Member m join m.team t
Collection
타입으로 인자 바인딩 가능in
절에서 사용 등.
<br>
02.12
- lecture. spring-data-jpa
- 반환타입
- Collection, Optinal, T 지원
- Stream 지원
- Future도 지원
- 페이징
- 반환타입에 따라 호출하는 쿼리가 달라진다.
- Page : 추가 count 쿼리 호출
- Slice : 추가 count쿼리없이 다음페이지만 확인, limit + 1로 호출
- List : 추가 count 쿼리 없이, 결과만 반한
Slice
는 언제쓸까? 최근에 모바일에서더보기
,인피니트스크롤
같은 경우에 사용.- 페이징보다 무거운것은
count
쿼리이므로, 최적화하면 좋다. Page
가Slice
의 하위계층이므로,Slice s = new Page()
가 가능하므로 조심해야한다.repository
에서page
로 반환하고,slice
로 참조하는 경우, 불필요한 쿼리가 요청된다.- 주의!,
spring-data-jpa
의 page는0
부터 시작한다! Page#map()
메소드 지원stream#map()
같이, 페이지정보는 그대로하고content
를 바꿀 수 있다.entity
를dto
로 사용할때 좋다.Page<Memeber>
->Page<MemberDto>
- 반환타입에 따라 호출하는 쿼리가 달라진다.
- 벌크성쿼리
- 벌크성쿼리 후
db
에는 반영됬지만, 영속성 캐쉬에는 반영되지 않는다. - 따라서
flush()
를 호출해야한다. @Modifying
이 자동으로flush()
를 호출하는줄 알았겄만.. 기본값이false
였다.@Modifying(clearAutomatically = true)
로 작성하자.
- 벌크성쿼리 후
- study.
로또
구현 시작- 객체의 역할, 구현, 책임을 분리하고싶다.
- todo
- 새로운 아이디어가 떠올랐다.
Hello? Link
- 빨리 제작하고싶은데, 시간이 없다..
<br>
02.13
- study.
로또
구현 마무리
- project. podo-dev
tui-editor
에planetUML
을 적용했다.tui-editor/nuxt
에 버그가 있어서 생각보다 오랜 시간을 소비했다.- 관련버그는 제보하려고한다.
- lecture. spring-data-jpa
@QueryHints
@Lock
<br>
02.14
- book. DDD start!
- JPA 관련 부분인 4장, 5장은 스킵하고 6장의 내용을 읽었다.
- 6장에 정말 주옥같은 내용이 많다.
- 개발하면서 고민해왔던것들이 6장에 정리되어있다.
service
를 어느 단위로 나눌까?serviceHelper
를 사용하자.controller
와service
의validate()
- lecture, spring-data-jpa
- 사용자 정의 레포지터리구현
Auditiong
- 도메인 컨버터
- 페이징과 정렬
<br>
02.15
- project. helloprice
- 구조 변경
- 생각보다 오래걸리는 작업.
spring-cloud-stream
이 재밌어서 적용해봄- 크롤 스케줄시, 카프카에 메세지 송신.
- 다중화된 크롤러서버에서 메세지 수신후, 크롤 작업 수행
- 크롤러서버로 로드밸런싱이 가능하게 됬다!
spring-cloud-stream
적용kafka
사용
<br>
02.16 ~ 02.17
- 여행
<br>
02.18
- lecture. spring-data-jpa
- 스프링 데이터 JPA 구현체 분석
- 레포지토리에
@Transactional
선언되어있다.
- 레포지토리에
save()
에서 조회쿼리가 발생하는 이유.Persistance
인터페이스 사용.
- study
- 팀원 코드 리뷰
- etc
tui-editor
를nuxt
전용으로 감싼 프로젝트가 있는데, 버그를 발견해서 제보했다!
<br>
02.19
- 휴식
- book. DDD Start!
7장. 도메인서비스
리딩- 응용서비스와 도메인 서비스의 차이가 잘 이해가가지 않았는데, 정의되 있었다.
- 도메인서비스와 응용서비스가 헷갈린다면,
- 해당 서비스가 도메인 데이터를 계산하거나, 도메인의 상태를 변경한다면 도메인 서비스라 정의 할 수 있다.
- lecture. jpa-querydsl
spring-data-jpa
를 완강하고 이어서queryDsl
강의를 수강.querdydsl
기본 환경 구성
<br>
02.20
-약속
- study
- 코드리뷰 피드백 반영
- ui, logic 분리
map
을 사용했는데, 그보다enum
을 사용해서 정의해봄enum
에서of
를 빨리하기위해, 내부에map
을 선언 관련링크
- book. DDD start!
8장. 트랜잭션
부분은 스킵하고9장. BOUNDED CONTEXT
리딩- 각 컨테스트간에 모델을 어떻게 다루어야하는지에 대한 내용
- 컨텍스트간에 독립된 모델, 때로는 하나의 모델로
- 하나의 모델을 사용할때 단점.
- lecture. jpa-querydsl
<br>
02.21
- book. DDD Start!
10장. 이벤트
리딩- 이벤트를 사용할 때
- 트리거로써
- 외부시스템과의 동기화
- 구현 방법
Events
객체를 이용한 구현MQ
와 연동하여 구현DB
와 연동하여 구현
- 옵저버 패턴과 비슷한느낌이다.
- 최근에 사용한
EmitProcessor
와도 비슷하다. - 적절하게 사용하면 매우 유용할듯?!
- 이벤트를 사용할 때
- lecture. jpa-querydsl
- 세타조인
- 페치조인
- 조인
on절
where
,on절
차이
- 서브쿼리
- 쿼리는 단순히 데이터를 조회하는것이다.
- 데이터를 그룹화해서 가져오고
- 데이터를 필터링해서 가져오고
- 쿼리가 다양한 기능을 제공함으로써, 이 영역을 넘어 쿼리를 활용할 수 있는데,
- 쿼리를 단순히 데이터를 조회하는 용도로 사용하는것이 좋은 방향이다.
<br>
02.22
- study.
- 로또 게임 코드 재리뷰
- blog.
- 헬로프라이스 개발기 작성
<br>
02.23
- project. helloprice
- 테스트코드 작성 및 리팩토링
- 패키지 구조 구체화.
- 상품 도메인 테스트 코드 작성.
- 공부했던 내용을 반영 (오브젝트, DDD Start!, querydsl 등)
왜 이렇게 짰지?
라는 생각이 들었다.
- 피드백 반영( ver. 2.0.5)
- 사진전송시 알림 제거
- 가격 알림 시, 최상단에 요약정보 추가
<br>
02.24
- lecture. jpa-querydsl
- 상수 문자 더하기
- DTO 조회
- setter, 생성자, reflection 방법
@QueryProjection
BooleanBuilder
- study.
- 로또 step2 구현
- blog.
-
헬로프라이스 개발기 리팩토링 후 배포
<br>
02.25
- lecture. jpa-querydsl
- 동적쿼리
- 벌크연산
- sql function
- study.
- 로또 step2 코드리뷰
<br>
02.26
코로나19로 인하여, 재택근무를 시작하게됬다.
- project. podo-dev
- 글작성 시,
editor
가 작아서 불편함을 느꼈는데, on/off
로 크게보기/작게보기를 구현했다.
- simple-project. masksaja
- 일회성 프로젝트를 개발했다.
- 몇몇 마스크 판매점에대해서 재고 알림을 주는 봇을 만들었다.
- 만드는것은 별로 안걸렸는데,
- 오라클 무료 클라우드 서비스를 세팅하는 과정에서 뻘짓을해,, 상당한 시간을 소비하였다.
<br>
02.27
- book. 스프링 부트와 AWS로 혼자 구현해보는 웹서비스
개발자 이동욱
님이 쓰신 책이 출시되어, 리딩하였다.spring-security-oauth2
부분에 흥미가 적용해보려고 한다.
- project. podo-dev
스프링 부트와 AWS로 혼자 구현해보는 웹서비스
내용중spring-boot-starter-oauth2
를 적용했다.- 적용하면서, 많은 부분을 리팩토링했다.
- simple-project. masksaja
- 몇가지 이슈가 있어서 대응했다.
- lecture. jpa-querydsl
- 실무활용
- 동적쿼리 개발 시, 조건 없는 쿼리가 되지 않도록 주의하자.
- query-dsl 페이징 기법
- spring-data-jpa의 sort와, query-dsl의 sort 맞춰주기
QuerydslPredicateExecutor
, 음 안쓸듯..QuerydslRepositorySupport
에 대한 이해
<br>
02.28
- project. podo-dev
- 전체적으로 리팩토링을 진행했다.
- 패키지 구조 변경.
- Service Helper 사용 등
- simple-project. masksaja
- 판매점 관리를 하드코딩에서, DB 영속하게 변경했다.
- blog.
- JpaPagingItemReader 사용 시, ItemReader 타입으로 bean을 등록하지 말자. 를 작성후 배포.
proxy
에 대한 이해가 높아졌다.
<br>
02.29
project. podo-dev
- 전체적인 리팩토링
DDD start!
내용을 반영중이다.
'2020년 02월의 MIL' 관련된 다른글
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.