728x90

전체 글 288

커맨드 패턴

커맨드는 "명령"이라는 뜻으로 커맨드 패턴은 명령을 클래스화 하는 것을 의미한다. 왜 이런게 필요한가? 결국 확장성을 고려한 것인데 예를들어 로그를 기록하는 기능을 구현한다고 가정하면 일반적으로 Log 클래스를 만들어서 그 안에 fileWrite, DbWrite, ConsoleWrite 메소드를 만들 것이다. 그런데 로그를 엘라스틱 서치에 적재하는 기능이 추가로 필요하게 되었다면 어떨까? Log 클래스에 esWrite 메소드를 만들어도 되지만 이렇게 되면 객체지향 설계원칙 중 개방 폐쇄 원칙 에 위배된다. 확장을 위해 Log 클래스를 변경해야 하기 때문이다. 기존 Log 클래스를 변경하지 않고 확장하려면 어떻게 해야 할까? 여기에서 필요한 것이 단일 책임 원칙 이다. 에초에 단일 책임만 가지도록 클래스를..

[Kotlin] 초기화 없이 속성을 선언하는 방법 lateinit

일단 lateinit 키워드의 의미는 해당 속성의 초기화를 미루겠다는 의미이다. 왜 미루는데? 자바를 기준으로 생각하면 초기화를 미루고 싶으면 일단 생성자에 포함하지 않으면 되자나? 그런데 그렇더라도 초기화가 안되진 않는다. 타입별 초기값으로 자동으로 초기화될 뿐..lateinit 는 아예 이런 초기화도 미룬다는 걸 의미한다. 이런 상황이 왜 필요한지 생각을 해보자. 생성자로 초기화를 강제하진 않지만 포함하고 싶은 속성이 있을 수 있다. 자바의 경우 클래스를 만들 때 아래와 같이 타입만 지정된 속성을 만들면 된다. String str; int i; 이 경우 지정된 기본값이나 null 이 할당된 채로 객체가 생성될 것이다. 즉, 객체 생성시 자동으로 초기화가 되기 때문에 클래스를 만들때는 딱히 지정하지 않..

Backend/Kotlin 2021.11.05

타입스크립트에서 비구조화 할당문법 사용하기

비구조화 할당 문법은 1. 비구조화 할당문법을 타입스크립트에서 사용할 경우 조금 다르게 사용해야 한다. 일반 자바스크립트에서는 아래와 같이 사용할 수 있었다. const object = { a: 1, b: 2, } const { a, b } = object 그런데 타입스크립트에서는 타입을 먼저 선언하고 사용하기 때문에 interface 를 사용한다면 아래와 같이 사용하게 될 것이다. interface TestType { a: number b: number } const object: TestType = { a: 1, b: 2 } const { a, b } = object 타입스크립트에서 타입 선언시 속성키값 우측에 ? 를 포함할 경우 선택적 속성으로 만들 수 있는데 이 경우 선언한 타입 외에 undefi..

Frontend/TypeScript 2021.10.21

인덱스 스캔과 묵시적 형변환

oracle, mysql 모두 동일하니 여기에서는 mysql 을 기준으로 작성한다. 아래와 같은 테이블 있다고 가정해보자. CREATE TABLE TEST ( SEQ bigint(11) NOT NULL AUTO_INCREMENT, ID_INT int(10), ID_VARCHAR varchar(10), PRIMARY KEY (SEQ), KEY IDX_ID_INT (ID_INT), KEY IDX_ID_VARCHAR (ID_VARCHAR) ) 일반적으로 알고 있던 지식은 칼럼을 조건으로 조회할 때 해당 칼럼에 타입과 일치하는 값으로 조회을 해야 하고 그렇지 않으면 타입이 달라 인덱스 스캔이 되지 않는다는 것이었다. 맞는 말이긴 하지만 꼭 우리가 명시적으로 그렇게 해줄 필요는 없다. 만약 ID_INT 를 조건으..

Backend/Database 2021.10.20

SpringBoot에 Sentry 적용 팁

Sentry 는 에러수집과 모니터링을 지원하는 툴이다. 온프레미스와 클라우드 버전이 존재하는데 사내 기 구축된 것을 사용했기 때문에 구축 부분은 생략하고 SpringBoot 연동하는 과정의 팁만 간단하게 정리해둔다. Gradle 기준 아래와 같은 의존성이 필요하다. 이렇게 되면 Exception 발생시 Sentry에 수집되어 확인할 수 있다. 물론 Exception 을 catch 로 잡았다면 당연히 수집되지 않는다. dependencies { compile 'io.sentry:sentry-spring-boot-starter:1.7.30' } 그리고 application.yml 파일에도 아래와 같은 구성이 필요하다. sentry: dsn: {client-key} # enable-tracing: false ..

Base/Monitering 2021.10.16

Github 조직 저장소 구성 팁

Github 에 조직 저장소를 구성한다면 일단 Organization 을 생성하고 그 하위에 Repository를 생성 한다. 개인저장소에 공동작업자를 생성하는 것과는 조금 다른 개념인데 다수의 Repository 를 조금 더 포괄적인 Organization 단에서 관리할 수 있게 된다. Organization 를 구성할 경우 각 Repository 의 공동작업자를 추가하는게 아니라 Organization 자체에 구성원을 추가해서 관리하게 된다. 기본적으로 Organization 의 구성원으로 추가되어야만 Github 로그인시 해당 Organization 을 확인할 수 있고 구성원의 권한은 Repository 까지 상속된다. Organization 에 구성원을 추가할 때는 Owner 또는 Member 권..

ETC 2021.10.14

Github ssh 연동 with Jenkins

ssh 연동 자체는 매우 간단하다. 맥북 로컬을 기준으로 보면 터미널에서 ssh-keygen 으로 비밀키와 공개키를 생성하고 아래와 같이 Github 에 SSH keys 항목에 공개키를 등록해주면 된다. 이렇게 되면 로컬에서 Github 을 ssh 방식으로 접속을 시도할 때 자동으로 로컬 .ssh 디렉토리 하위에 생성된 비밀키가 ssh 통신에 사용되고 Github 에서는 이에 대응되는 공개키가 등록되어 있는 것이 확인되면 접속이 성공하는 방식이다. 결국 로컬 .ssh 하위에 생성된 비밀키가 우리가 생각하는 id/password 같은 인증정보가 되는 셈인데 이를 자동으로 셋팅해서 넘겨주니 id/password 입력 같은 과정이 필요없게 된다. 로컬이 아니라 Jenkins 같은 외부 서버 ssh 접속을 할 ..

ETC 2021.10.14

typescript .d.ts 파일

일단 타입스크립트 환경에서는 기본 자바스크립트와는 다른 별도의 문법이 사용된다. 변수나 함수를 정의할 때 타입을 선언하는 것인데 일반 브라우저에서는 이 코드가 당연히 동작하지 않는다. 실제로 동작이 가능하도록 코드를 변환해주는 컴파일 과정이 필요한데 이를 타입스크립트 컴파일러가 담당한다. 이런 컴파일 과정에서 타입을 체크해서 지정되지 않는 타입이 대입되었거나 할 경우 컴파일 에러를 발생시킨다. 이를 위해 타입스크립트는 기본적으로 string, number 같은 자바스크립트의 기본타입에 대한 정보가 있어야 하는데 이를 정의해놓은 파일이 lib.d.ts 파일이다. 해당파일은 프로젝트에서 node_modules/typescript/lib/lib.d.ts 로 확인할 수 있고 타입스크립트 컴파일러는 컴파일시 해당..

Frontend/TypeScript 2021.10.08

NextPage 함수형 컴포넌트는 어떻게 작성해야 할까?

일단 CNA 에서 제공하는 예제에서는 NextPage 컴포넌트 생성시 화살표 함수를 사용하고 있다. 그런데 리액트에서 함수형 컴포넌트 생성시에는 함수선언문이 선호된다고 한다. https://velog.io/@velopert/create-typescript-react-component 통일을 위해 NextPage 컴포넌트 생성시에도 함수선언문을 사용하는게 좋을 거 같긴한데 궁금한 점. 1. 리액트에서 함수형 컴포넌트 생성시 왜 함수선언문이 선호되는걸까? 위 링크에서도 자세한 이유는 설명하지 않고 그냥 해외 유명 개발자들이 그렇게 사용한다고 안내하고 있다. 구체적인 이유를 알고 싶다.. 2. NextPage 컴포넌트의 경우 화살표 함수를 변수에 담아서 그것을 리턴하고 있는데 변수 타입을 NextPage로 지..

Frontend/NextJS 2021.10.01
728x90