Skip to content

Commit

Permalink
Create 용어 정리.md
Browse files Browse the repository at this point in the history
  • Loading branch information
deepbig authored May 25, 2024
1 parent 2261c9d commit 9764b3d
Showing 1 changed file with 158 additions and 0 deletions.
158 changes: 158 additions & 0 deletions hong/general/용어 정리.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
### Kotest

> Kotest is a flexible and elegant multi-platform test framework for Kotlin with extensive assertions and integrated property testing.
>
Kotest는 Junit 등에 비해 조금 더 Kotlin 언어에 친화적이며, BDD와 같은 여러 테스트 방식을 지원하여 프로젝트에 가장 적합한 형태의 테스트를 할 수 있다. 또한 확장적인 Assertions 라이브러리를 통해 다양한 형태의 Object를 쉽고 빠르게 검사할 수 있다.

** Kotest는 [multi-platform porject](https://kotlinlang.org/docs/multiplatform.html)이기 때문에 JVM, JavaScript, Native, IOS, Android 등 Kotest test framework는 다양한 플랫폼을 지원한다.

### Querydsl

> Querydsl(Domain Specific Language) is a framework which enables the construction of type-safe SQL-like query for multiple backends including JPA, MongoDB and SQL in Java.
Instead of writing queries as inline strings or externalizing them into XML files they are constructed via a fluent API.
>
QueryDSL은 HQL(Hibernate Query Language)의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크다. JPA와 MongoDB를 프로젝트에서 함께 사용하기 위해 필요한 프레임워크. 또한, JPQL로 작성한 문자열 오류 등 런타임 시점에 에러가 발생하는 문제를 해결하기 위해 사용됨.

**Querydsl 특징:**

- 정적 타입을 이용해서 SQL query를 생성해줌.
- 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인 가능
- 자동 완성 등 IDE의 도움을 받을 수 있음.
- 동적인 쿼리 작성이 편리
- 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있음.

**예제:**

- EntityManager를 통해 JPQL 작성 코드 (Querydsl 미적용):
- 정적 쿼리가 아닌 관계로 문법 오류가 발생하면 어플리케이션 로딩 시점에서 감지하지 못하고, 런타임 에러가 발생한다.

```java
// PostRepositoryTest.java
@DisplayName("hi 내용을 포함하며 댓글이 1개 이상인 Post를 ID 내림차순으로 조회한다.")
@Test
void jpa_findPostsByMyCriteria_Three() {
EntityManager entityManager = testEntityManager.getEntityManager();

List<Post> posts = entityManager.createQuery("select p from Post p where p.content like '%hi%' and p.comments.size > 0 order by p.id desc", Post.class)
.getResultList();

assertThat(posts).hasSize(3);
}
```

- Querydsl를 적용한 코드:
- 반면 QueryDSL은 각종 풍부한 체이닝 메서드와 유틸리티 메서드 및 정적 타입(Q 클래스)을 기반으로 직관적으로 쿼리를 작성한다.

```java
// PostRepositoryTest.java
@DisplayName("hi 내용을 포함하며 댓글이 1개 이상인 Post를 ID 내림차순으로 조회한다.")
@Test
void queryDsl_findPostsByMyCriteria_Three() {
EntityManager entityManager = testEntityManager.getEntityManager();

JPAQuery<Post> query = new JPAQuery<>(entityManager);
QPost qPost = new QPost("p");

List<Post> posts = query.from(qPost)
.where(qPost.content.contains("hi")
.and(qPost.comments.size().gt(0))
).orderBy(qPost.id.desc())
.fetch();
assertThat(posts).hasSize(3);
}
```

### gRPC

> RPC: Remote Procedure Call의 약자로 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 함수나 프로시저를 실행할 수 있게하는 **프로세스 간 통신 기술**.
>
쉽게 설명해서 MSA 구조로 서비스를 만들게 되면, 다양한 언어와 프레임워크로 개발되는 경우가 있는데, 이런 구조에 RPC를 이용하여 언어에 구애받지 않고, 원격에 있는 프로시저를 호출하여 고유 프로그램의 개발에 집중할 수 있게 해주는 기술이다.

gRPC는 구굴이 개발한 어떤 환경에서든 실행할 수 있는 최신 오픈소스 고성능 RPC framework.

서버 측은 정의한 서비스 규격에 따라 인터페이스를 구현하고 gRPC 서버를 실행하여 클라이언트 호출을 처리한다. 클라이언트 측에서는 서버와 동일한 방법을 제공하는 stub이 있다.

gRPC 특징:

- Stub
- stub는 RPC의 핵심 개념으로 Parameter 객체를 Message로 Marshalling/Unmarshalling하는 레이어.
- 서버와 클라이언트는 서로 다른 주소 공간을 사용하므로 함수 호출에 사용된 매개 변수를 꼭 변환해줘야 한다. 그렇지 않으면 메모리 매개 변수에 대한 포인터가 다른 데이터를 가리키게 되기 때문이다.
- 서비스 담당별 stub
- client의 stub은 함수 호출에 사용된 파라미터의 변환(marchalling) 및 함수 실행 후 서버에서 전달된 결과의 변환 담당.
- server의 stub은 클라이언트가 전달한 매개 변수의 역변환(unmarshalling) 및 함수 실행 결과 변환을 담당
- 프로토콜 버퍼(Protocol Buffers)
- gRPC는 IDC(Interface Definition Language)로 protocol buffer를 사용한다.
- protocol buffer는 직렬화 데이터 구조이다. 어떤 언어나 플랫폼에서도 통신 프로토콜이나 데이터 저장을 사용할 때, 구조화된 데이터를 전환하게 해주는 방법.
- 직렬화의 종류: 대표적으로 Json, XML
- 프로토콜 버퍼는 하나의 프로그래밍 언어가 아니라 여러 프로그래밍 언어를 지원하기 때문에, 특정 언어에 종속성이 없는 형태로 데이터 타입을 정의하게 되는데, 이 파일을 `proto file` 이라고 하며, `protoc compiler` 로 컴파일파면 데이터에 접근할 수 있는 각 언어에 맞는 형태의 데이터 클래스를 생성해줌.

### Squadcast

> Squadcast’s Reliability Automation Platform is built upon SRE principles, leveraging automation and deep analytics to surface critical issues, streamline response for quick resolutions, and provide you with the analytics and insights to embrace a culture of learning.
>
- Squadcast는 App 알림 / 문자 / 전화를 통한 알람 및 팀별로 서비스 생성과 Escalation 정책을 설정할 수 있음.
- Squadcasts는 불필요한 monitoring과 logging 기능을 제외하고 SRE에 초첨을 두어 onCall app on-call app에서 불필요한 monitoring, logging 알림을 받지 않으며 해당 이슈에 대한 적절한 담당자에게 알림이 갈 수 있게 해줌.

### GPG Key

> GPG stands for GNU Privacy Guard, an implementation of public key cryptography, which can be used both for the more standard operations of encryption keys (encrypt/decrypt), and for message verification via signature.
>
GPGfks PGP(Pretty Good Privacy: 전자 메일을 해독 및 암호화하ㄴ고 디지털 서명 및 파일 암호화를 통해 전자 메일 메시지를 인증하는 데 사용되는 보안 프로그램)를 기반으로 만든 소프트웨어로 여러가지의 암호화를 지원하면 디폴트는 RSA 알고리즘 사용.

사용 이유:

- GitHub에서 이 GPG key를 등록하면 커밋, 태그에 로컬로 서명하여 사람들에게 변경 내용의 출처에 대한 신뢰를 줄 수 있음. 검증된 커밋이라는 태그가 달림 (검증 = 내 자로를 파일 단위로 암호화 하고 누군가가 내 파일을 건드리지 않았다는 것을 확인. 즉, 사인된 자료를 받는 사람이 정말로 송싱자가 그 자료를 보냈는지, 자료가 변현되지는 않았는지 확인함.)

### helm chart

쿠버네티스는 container orchestration, 즉 컨테이너를 쉽고 빠르게 배포/확장하고 관리를 자동화해주는 툴이다. 쿠버네티스를 활용하면 다수의 컨테이너화된 어플리케이션을 쉽게 배포할 수 있다.

쿠버네티스를 활용한 어플리케이션 배포에 가장 기본이 되는 것은 yaml 파일이다. 쿠버네티스의 오브젝트를 정의하고 생성할 때 yaml 파일 형식을 활용하기 때문이다.

쿠버네티스를 통해 어플리케이션을 배포하다보면 비슷한 틀과 내용을 공유하고, 내부 값만 일부 변경하면 되는데, 어플리케이션마다 모두 yaml 파일을 만들어줘야 하다보니 매우 번거롭다.

이런 문제점을 해결해주기위해 있는 것이 바로 `helm`이다. `helm`은 쿠버네티스에서 어플리케이션을 배포하기 위해 사용되는 대표적인 패키징 툴이다. helm을 이용하면 원하는 어플리케이션을 쿠버네티스에 손쉽게 설치할 수 있다.

그리고 `helm-chart` 는 쿠버네티스 리소스를 하나로 묶은 패키지에 해당하고 이 또한 yaml 파일 형식으로 구성돼 있다. 즉 helm 으로 차트를 관리하는 목적은 여러 개의 yaml 파일들을 관리하기 쉽게 하기 위한 것이다. 즉 helm을 활용하면 컨테이너 배포뿐만아니라 어플리케이션을 배포하기 위헤 필요한 쿠버네티스 리소스를 모두 패키지 형태로 배포해주는 역할을 한다.

### npmrc

> npm gets its config settings from the command line, environment variables, and `npmrc` files. The `npm config` command can be used to update and edit the contents of the user and global npmrc files.
>
npmrc 파일은 npm에서 설정을 저장해두는 파일로서 내장(built-in), 전역(global), 사용자(user), 프로젝트(project) 이렇게 4가지 범위의 `npmrc` 파일이 존재한다.

먼저 내장 설정은 npm이 설치된 경로에 있는 `npmrc` 파일에 명시되어 있으며 모든 기본 설정을 담고 있다. 전역 설정은 같은 컴퓨터를 사용하는 다른 사용자와 모든 프로젝트에 광범위하게 적용되기 때문에 일반적으로 잘 건드리진 않음.

따라서 주로 사용자 범위와 프로젝트 범위에서 npmrc 파일을 다루고, 보통 파일 앞에 `.` 을 붙여 기본적으로 숨긴 파일이 된다. 사용자 범위의 `.npmrc` 파일은 운영체제의 사용자 홈(home) 디렉토리에 위치하고, 프로젝트 범위의 `.npmrc` 파일은 프로젝트 최상위(root) 디렉토리에 위치한다.

npm config command

npmrc 파일을 열어서 직접 편집하려면 오타의 위험도 있고 npmrc 파일이 여러군데 있으니 관리도 쉽지 않을 것이다. 따라서 npm은 여러 npmrc 파일을 손쉽게 관리할 수 있도록 `npm config` 커맨드를 제공해주고 있다.

`npm config` 커맨드를 사용할 때는 `--location` 또는 `-L` 옵션을 통해서 범위를 지정해줄 수 있다. 이 옵션을 global 로 설정하면 전역, user로 설정하면 사용자, project로 설정하면 프로젝트 범위가 적용된다.

### Secure coding

> Secure coding is the practice of developing computer software in such a way that guards against the accidental introduction of security vulnerabilities. Defects, bugs and logic flaws are consistently the primary cause of commonly exploited software vulnerabilities.
Through the analysis of thousands of reported vulnerabilities, security professionals have discovered that most vulnerabilities stem from a relatively small number of common software programming errors. By identifying the insecure coding practices that lead to these errors and educating developer on secure alternatives, organizations can take proactive steps to help significantly reduce or eliminate vulnerabilities in software before development.
>
소프트웨어를 개발함에 있어 개발자의 실수, 논리적 오류 등으로 인해 소프트웨어에 내포될 수 있는 보안취약점을 배제하기 위한 코딩 기법을 뜻 한다. 핵심은 개발자의 실수나 논리적 오류로 인해 발생할 수 있는 문제점을 사전에 차단하여 대응하는 것.

secure coding guide

secure coding은 개발 단계에서 적용되기 때문에 개발자의 코딩 작업이 핵심 대상이 됨. 그러나 개발자로서 취약점을 모두 고려하는 프로그래밍은 어려운 일. 따라서 소프트웨어 개발 보안 가이드를 기반으로 7가지 유형의 보안 취약점을 피해서 개발하면 됨

- 7가지 유형:
- 입력 데이터 검증 및 표현: 프로그램 입력값에 대한 검증 누락 또는 부적절한 검증, 데이터 형식을 잘못 지정하여 발생하는 보안 약점.
- 보안 기능: 보안기능(인증, 접근제어, 기밀성, 암호화, 권한 관리 등)을 부적절하게 구현 시 발생하는 보안 약점.
- 시간 및 상태: 동시 또는 거의 동시 수행을 지원하는 병렬 시스템, 하나 이상의 프로세스가 동작되는 환경에서 발생할 수 있는 보안 약점.
- 에러처리: 에러를 처리하지 않거나, 불충분하게 처리하여 에러정보에 중요정보(시스템 등)가 포함될 때 발생하는 보안 약점.
- 코드 오류: 타입변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범하는 코딩 오류로 인해 유발되는 보안 약점.
- 캡슐화: 중요한 데이터 또는 기능성을 불충분하게 캡슐화 하였을 때, 인가되지 않은 사용자에게 데이터 누출이 가능해지는 보안 약점.
- API 오용: 의도된 사용에 반하는 방법으로 API를 사용하거나, 보안에 취약한 API를 사용하여 발생할 수 있는 보안 약점.

0 comments on commit 9764b3d

Please sign in to comment.