logo

2020.02, Montly I Learning

<br>

02.01

- 약속

<br>

02.02

- project. podo-dev

  • 태그로 검색 시, 대/소문자 태그 구분 제거
  • css, header 태그 line-height 변경

- study

  • 자동차경주 스텝 3 진행

<br>

02.03

- book. 오브젝트

  • 믹스인에 대한 내용
    • scalatrait 키워드를 예제로 공부,
    • 상속은 is-a관계를 만들지만, 믹스인은 말그대로 코드를 다른 코드에 섞어 넣기 위한 방법이다.
  • 다형성
    • 다형성 분류 (매개변수, 포함, 오버로딩, 강제 다형성)
    • 상속은 코드의 재사용이 아닌, 다형성을 가능하게하는 타입 계층을 구축하기 위함이다.
    • 상속의 메커니즘
      • 업캐스팅
      • 동적 메소드 탐색
      • 동적바인딩
      • self 참조
      • super 참조
    • 데이터 관점에서의 상속
      • 자식클래스가 부모클래스의 데이터 접근 가능한 링크가 존재한다.
    • 행동 관점에서의 상속
      • 클래스 정보는 메모리에 한번 로딩 되고
      • 각 객체는 독립된 메모리를 가지며 class 정보를 가리키는 링크가 존재한다.
      • 메세지를 수신한 객체는 자신의 클래스에서 적절한 메소드를 찾는다.
      • 없다면, 부모클래스를 차례대로 훓어가면서 적절한 메소드를 찾는다.
      • 자식클래스에서 부모클래스로 메소드 탐색이 가능하기 때문에,
      • 마치 복사본을 가지고 있는것처럼 보인다.
    • 업캐스팅
      • 부모클래스 타입으로 자식클래스의 인스턴스를 할당하는것이 가능하다
    • 동적바인딩
      • 컴파일 시점이 아니라 실행시점에 호출될 메소드를 결정한다

- book. DDD start!

  • 출퇴근길 새로 읽기 시작한책
  • 코드 진짜 깔끔하구낭.. https://github.com/madvirus/ddd-start
  • 1장. 도메인 모델의 시작 리딩
  • 입사 후 여러 서치를 통해서 배웟던 내용이 나왔다.
    • 도메인에 대한 이해 ( 개념모델, 구현 모델)
    • 도메인 용어를 사용하는 이유, 왜 변수명이 중요할까에 대한 해답.
    • 엔티티, 값타입, dto에 차이
    • setter 사용에 문제점
  • 요구사항을 보고, 개념모델을 정의하는 과정이 인상깊었다.

- spring-gateway

<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에서 어떻게 편하게 지원하는지 비교하며 학습
  • 전반적으로 복습적인 내용
  • 인터페이스로 선언된 repositoryspring이 구현체를 작성한다.
  • 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

  • CRUDRepositoryspring-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쿼리이므로, 최적화하면 좋다.
    • PageSlice의 하위계층이므로, Slice s = new Page()가 가능하므로 조심해야한다.
    • repository에서 page로 반환하고, slice로 참조하는 경우, 불필요한 쿼리가 요청된다.
    • 주의!, spring-data-jpa의 page는 0부터 시작한다!
    • Page#map() 메소드 지원
      • stream#map()같이, 페이지정보는 그대로하고 content를 바꿀 수 있다.
      • entitydto로 사용할때 좋다. Page<Memeber> -> Page<MemberDto>
  • 벌크성쿼리
    • 벌크성쿼리 후 db에는 반영됬지만, 영속성 캐쉬에는 반영되지 않는다.
    • 따라서 flush()를 호출해야한다.
    • @Modifying이 자동으로 flush()를 호출하는줄 알았겄만.. 기본값이 false였다.
    • @Modifying(clearAutomatically = true)로 작성하자.

- study.

  • 로또 구현 시작
  • 객체의 역할, 구현, 책임을 분리하고싶다.

- todo

  • 새로운 아이디어가 떠올랐다. Hello? Link
  • 빨리 제작하고싶은데, 시간이 없다..

<br>

02.13

- study.

  • 로또 구현 마무리

- project. podo-dev

  • tui-editorplanetUML을 적용했다.
  • tui-editor/nuxt에 버그가 있어서 생각보다 오랜 시간을 소비했다.
  • 관련버그는 제보하려고한다.

- lecture. spring-data-jpa

  • @QueryHints
  • @Lock

<br>

02.14

- book. DDD start!

  • JPA 관련 부분인 4장, 5장은 스킵하고 6장의 내용을 읽었다.
  • 6장에 정말 주옥같은 내용이 많다.
  • 개발하면서 고민해왔던것들이 6장에 정리되어있다.
  • service를 어느 단위로 나눌까?
  • serviceHelper를 사용하자.
  • controllerservicevalidate()

- 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

<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.

<br>

02.29

project. podo-dev

  • 전체적인 리팩토링
  • DDD start!내용을 반영중이다.
CommentCount 0
이전 댓글 보기
등록
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
TOP