1. git에서 pull request merge의 3가지 전략
https://im-developer.tistory.com/182 참고
- Create a merge commit
- 기본 머지
- 하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합친다.
- 각각의 브랜치에 남은 커밋을 히스토리에 그대로 남긴다.
- 어떤 브랜치에서 어떻게 만들어져서 머지가 되었는지 상세하게 파악할 수 있다.
- 히스토리가 자세하게 남아서 보기 어려울 수 있다는 단점이 있다.
- Squash and merge
- 개발용 브랜치에 있던 내용들을 하나로 합쳐서 중앙 브랜치에 하나의 커밋으로 저장하는 전략
- 기존 변경사항들이 어떻게 변했는가보다 머지가 되었다에 좀 더 집중한 전략
- 남아있는 정보량이 비교적 적기 때문에, 개발용 브랜치에서 언제 어떤 코드를 바꿨는지에 대한 정보를 잃을 수 있다는 단점이 있다.
- Rebase and merge
- 이미 존재하는 Rebase라는 기능을 이용해서 브랜치를 머지하는 것이다.
- 모든 커밋들이 합쳐지지 않고 각각 main 브랜치에 추가된다.
- 히스토리의 base를 직접 옮겨서 처리하는 방식이기 때문에 개발용 브랜치에서 변경한 내용을 중앙 브랜치에서 변경한 것처럼 바꿔버릴 수 있다.
- 어느 시점에 머지가 되었는지 나중에 판단하기 어렵다.
2. 테스크 코드 (필요성, 장단점)
- 테스트 코드란 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드
- 필요성 : 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있고, 코드 수정이 필요한 상황에서 유연하고 안정적인 대응을 할 수 있다. 이는 서비스의 품질 및 안정성과 직결되어 있다.
- 장점
- 코드 및 서비스의 품질을 향상시킨다.
- 개발자가 더 빠르게 기능의 동작 방식을 이해하는 데 도움이 되는 문서로 작용할 수 있다.
- 리팩토링 작업을 진행할 경우 이전에 작성한 테스트 코드를 통해 서비스에서 동작하는 기능에 대한 안정적인 확장 및 품질 향상이 가능하다.
- 단점
- 테스트 코드 작성은 단순한 작업이 아니므로 개발 시간이 늘어날 수 있다.
- 서비스의 기능이 변경되거나 확장될 때마다 테스트 코드로 함께 수정해야 하기 때문에 추가적인 유지보수 비용이 발생할 수 있다.
- 오버 엔지니어링 발생 : 개발 과정에서 소프트웨어의 요구사항보다 더 복잡하고 정교하게 코드를 작성하는 것
- 테스트 코드 작성 방법을 익히는 데 시간이 소요된다.
3. 동기 vs 비동기 vs 블로킹 vs 논블로킹
https://www.youtube.com/watch?v=oEIoqGd-Sns 참고
- 동기
- 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미
- 비동기
- 시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음을 의미
- 블로킹
- 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
- 논블로킹
- 다른 주체의 작업에 관련없이 자신의 작업을 하는 것
- 블로킹 vs 논블로킹은 다른 주체가 작업할 때 자신의 제어권이 있는지(논블로킹) 없는지(블로킹)로 볼 수 있다.
- 동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지(동기) 아닌지(비동기)로 판단할 수 있다.
- 4가지 조합
- 동기+블로킹 : 작업을 넘겨주고 그 작업이 끝날 때까지 대기했다가 작업이 완료되고 제어권과 결과가 넘어오면 바로 처리를 한다. 예) 자바에서 입력 요청을 할 때 사용한다. (입력을 받을 때까지 다른 작업을 하지 않고 기다렸다가 입력을 받으면 처리)
- 동기 + 논블로킹 : 자신의 제어권을 가지고 일을 하다가 중간중간에 다른 작업에 결과가 나왔는지 물어보다가 결과가 나오면 가지고 와서 업무를 처리한다. 예) 해당 데이터를 가져올 때까지 유저에게 정보의 로드율이 얼만큼인지 보여줄 때 사용한다.
- 비동기 + 블로킹 : 다른 작업을 할 동안 결과에는 관심이 없지만 기다렸다가 결과를 가지고 나중에 처리한다.
- 비동기 + 논블로킹 : 다른 작업이 진행될 동안 자신의 작업을 이어서 하다가 다른 작업이 끝나서 결과가 넘어오면 그 결과를 나중에 처리한다.
4. TCP의 3-way handshake란?
- TCP 프로토콜을 이용해서 통신하는 프로그램은 데이터를 주고받기 전에 먼저 연결을 진행하는 과정을 말한다.
- SYN : 연결 설정. 시퀀스 번호를 랜덤으로 설정하여 세션을 연결하는 데 사용
- ACK : 응답 확인. 패킷을 받았다는 것을 의미
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RECV : SYNC 요청을 받고 상대방의 응답을 기다리는 중
- 동작방식
- Client → SYN → Server : 클라이언트가 서버에게 접속을 요청하는 SYN 플래그를 보낸다.
- Server → SYN + ACK → Client : 서버는 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV 상태로 바뀌어 SYN+ACK 플래그를 클라이언트에게 전송한다. 그 후 서버는 다시 ACK 플래그를 받기 위해 대기상태로 변경된다.
- Client → ACK → Server : SYN+ACK 상태를 확인한 클라이언트는 서버에게 ACK를 보내고 연결 성립이 된다.
5. 함수형 프로그래밍의 특징 및 장점(명령형 프로그래밍과 비교)
- 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임
- 순수 함수
- 동일한 입력에는 항상 같은 값을 반환한다.
- 함수의 출력은 오로지 그 함수에 입력된 값에만 의존한다.
- 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다.
- 불변성
- input의 불변성을 유지해야 순수함수의 순수성 유지가 의미가 있다.
- 참조의 투명성
- 함수 외부에 의존하는 코드가 없고, 함수 사용자 입장에서는 유효한 매개변수만 전달하면 된다.
- 동일한 매개변수에 대해서는 항상 동일한 결과가 나온다,
- 예외를 던지지 않는다.
- 데이터베이스, 파일 시스템, 네트워크 등의 외부 기기로 인해 동작이 멈추지 않는다.
- 장점
- 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다.
- 머러티 코어 혹은 여러 연산 프로세스를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.
- 상태변화에 따른 부작용에서 자유로워지기 때문에 순수하게 기능 구현에 초점을 맞추어 설게할 수 있다.
함수형 프로그래밍 | 명령형 프로그래밍 |
상태 변경을 지양하고 불변성 유지 | 상태 변경 중심 |
외부 상태에 의존하지 않아 부작용 최소화 | 함수가 외부 상태에 의존해 부작용을 일으킬 가능성 높음 |
데이터의 불변성 강조 | 변수와 객체의 값을 자유롭게 변경 가능 |
상태 변이가 없고 부작용이 없으므로 병렬성와 동시성 쉽게 처리 | 상태 변이와 부작용이 많아 병렬성과 동시성 관리 어려움 |
6. 웹이란?
- 전 세계 인터넷에 연결된 수많은 기기들이 서로의 정보를 공유하는 공간
- 하이퍼텍스트로 표현되는 여러 문서들을 컴퓨터를 통해 모니터에 출력
- 하이퍼텍스트는 HTML로 작성되며 HTTP 프로토콜을 통해 주고받게 된다.