전체 글 120

비즈니스 도메인 분석하기

DDD를 공부하는 이유 복잡한 문제를 해결하고 우아한 솔루션을 만들고 신중하게 규칙과 구조, 행동을 만들어서 완전히 새로운 세상을 만든다. 비즈니스 도메인 주요 활동 영역 페덱스 - 배송 서비스 스타벅스 - 커피 아마존 - 클라우드 날방 - 방송? 하위 도메인 비즈니스의 세분화된 영역 - 목표를 달성하기 위해 서로 상호작용하는 도메인 핵심 하위 도메인 경쟁업체와 다르게 수행하고 있는 것 - 모방하기 어려워야한다. 경쟁 우위 자주 변경 될 수 있다. - 한번의 시도로 해결되지 않는다. 사내에서 구현되어야 한다. (전략적인 투자) 우버 - 승차 공유 서비스(같은 방향으로 향하는 손님을 매칭해서 비용을 절감) 구글 검색 알고리즘 - 광고 플랫폼의 중요한 구성요소 날방 - 쇼핑몰에 pip를 붙여서 할 수 있는것..

2022년 회고

1월달에 쓰려고 했는데 지금 씁니다. 일단 2022년 쿠버네티스, 엔트미디어를 이용한 송출서버 만들기, 카프카 공부 등 새로운 것을 많이 한 해였던것 같다. 그리고 대기업 이력서를 써보면서 아직 부족하다는 것을 많이 느낀것 같다. [회사에서] 일단 작년에 회고록 쓴것을 보면 불만도 있고 불안도 있어보였다. 하지만 점차 변화하며 괜찮아진것 같다. 2022년 초에 같이 일하는 과장님하고 어느정도 컨벤션같은 틀을 잡고 일을 해서 나름 자기만족하며 일을 했었던것 같다. 하지만 과장님이 퇴사를 하시고 프로젝트 백엔드 관련된 것(소켓 서버 및 여러가지 서버 관리)을 거의 내가 받았다. 다행히 새로 들어온 사람이 있어서 같이 일을 하며 정리해갔다. 그리고 새로 들어온 사람이 20살인데 사실 나보다 경력이 많은…(나는..

멀티 PK일 경우 순서가 중요하다..

1. PK 컬럼 순서가 중요하다. 인덱스 구성에서 의도하지 않은 순서의 Primary Key Unique Index가 생성된다. 많은 인덱스가 생성되므로 입력/수정/삭제 시 불필요한 내부 작업이 증가해 성능에 악영향을 미친다. 1.1. PK 구성과 인덱스 이용 pk 순서를 잘못했을 경우 index가 먹지 않아 full scan을 하게 된다. create table multi_pk_test2 ( student_number varchar(255) not null, test_year datetime not null, semester int not null, test_a varchar(255) null, test_b varchar(255) null, PRIMARY KEY (student_number, test_..

데이터베이스 2022.11.23

Spring boot에 Facade 패턴 적용

Facade란? "건물의 정면"을 의미로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미 class TV() { var channel: Int = 0 set(value) { field = value println("Channel is set to $value") } var volume: Int = 0 set(value) { field = value println("Volume is set to $value") } } class Remote() { fun on(tv: TV) { println("TV is on") } fun off(tv: TV) { println("TV is off") } fun setChannel(tv: TV, channel: Int)..

Spring boot에 전략패턴 적용

전략 패턴의 배경 예시 입니다 :) 인프런에 비즈니스 로그인(Account)이 있고 일반 로그인(User)이 있다. public interface Login { public void login(); } public class User implements Login { public void login() { System.out.println("일반 유저가 로그인 한다.") } } public class Account implements Login { public void login() { System.out.println("비즈니스 유저가 로그인 한다.") } } 예시 만들기 어렵네..(좀 어거지임) 근데 여기서 login 메서드를 ‘일반 유저가 또 로그인을 한다.’ 라고 하고 싶을 경우 메서드를 직접 바..

webClient 와 feignClient

Deprecated 된 rest template를 대체하는 HTTP 클라이언트 블로그에 쓰는 글들은 여기에 있습니다.(정리가 좀 필요할 것 같지만) https://github.com/YuSunjo/spring-boot-example feignClient interface를 작성하고 기존의 spring boot 처럼 사용해서 복잡도가 낮고 은근 친숙함 netflix에서 만들어졌다고 하네요. 요즘 MSA에서 많이 사용한다고 합니다. (제대로 해보지 않아서 ㅠ) import dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2021.0.0" } } dependencies { ... // fe..

4장 - 함수형 프로그래밍

https://balldev.tistory.com/18 함수형 프로그래밍 & 람다 & 메소드 참조 함수형 프로그래밍 일단 함수형 프로그래밍의 등장 배경을 보겠습니다. 일단 명령형 프로그래밍 기반에서 소프트웨어의 크기가 커졌습니다. 그래서 스파게티 코드를 유지 보수할 수가 없어졌 balldev.tistory.com 4.1 알고리즘에서 fold 사용하기 fold 함수를 사용해 시퀸스나 컬렉션을 하나의 값으로 축약시킨다. inline fun Iterable fold( initial : R, operation: (acc:R, T) -> R ): R 첫번째 인자: 누적자의 초기값 두번째 인자(람다): 두개의 인자를 받아 누적자를 위해 새로운 값을 리턴 예시 // 합 fun sum(vararg nums: Int) ..

jpa comment를 custom annotation으로 만들기

배경 보통 jpa를 할 때 comment를 달기 위해서는 @Column(columnDefinition = ...) 이렇게 해야한다. @Entity public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; @Column(columnDefinition = "varchar(10) not null comment '이름'") private String name; private String description; } 코드에 주석처리로 처리 할 수 있겠지만 DB에 설명이 있기 위해서는 코멘트를 적어야한다. (혼자 개발하는게 아니니까?) 아 근데 매번 저렇게 추가하는거 귀찮은데? 어노테이션으로 comment..

3장 - 코틀린 객체 지향 프로그래밍

객체 초기화, getter, setter, 나중 초기화, 지연 초기화, 싱글톤, Nothing 이해하기 3.1 const와 val의 차이 런타임 보다는 컴파일 타임에 변수가 상수임을 나타내야 한다. 컴파일 상수(컴파일 시점)에 const 변경자를 사용한다. 실행 시간(런타임)에 val 키워드를 사용한다. (java final) 그렇다면 const를 지원하는 이유는 뭘까? 컴파일 상수 함수나 클래스의 생성자에게도 결코 할당 될 수 없고 오직 문자열이나 기본 자료형으로 할당 되어야함(클래스의 프로퍼티나 지역변수로 할당 할 수 없으며 문자열 또는 래퍼타입) 컴파일 타임 상수는 반드시 객체나 동반 객체 선언의 최상위 속성 또는 멤버여야 한다.(보통 companion objet에 쓰임) getter, setter..

동등성, 동일성 연산(==, ===)

동등성 동일성 동등성(equals) 오브젝트 서로가 완전히 동일 값이 같은지 동일성(==) 동일한 정보를 가지고 있는 오브젝트 같은 메모리에 다른 오브젝트가 존재하는 경우 주소값이 같은지 자바 == 원시 타입일 경우 두 피연산자의 값이 같은지 비교 참조 타입일 경우 두 주소값을 비교 (동일성 검사) equals 참조타입의 동등 (동등성 검사) 코틀린 == 원시타입일 경우 두 피연산자의 값이 같은지 비교 참조 타입일 경우 equals로 비교 (== 가 내부적으로 equals) === 주소값을 비교하고 싶다면 ===을 사용 코틀린에서 주의할 점 val a : String = "hello world" val b : String = "hello world" println(a == b) // true printl..

언어/코틀린 2022.07.18