디자인 패턴
객체지향 프로그래밍에서 공통적인 디자인 문제를 발견하고 해결하는 가이드라인
장점
- 공통적인 SW 디자인 문제를 해결하는 데 도움이 됨
- 재사용을 통해 개발 시간 단축
- SW 구조 파악 용이해 커뮤니케이션 쉬움
단점
- 객체 지향 설계, 구현 위주로 사용됨
- 초기 비용 부담
분류
| 생성(Creational) 패턴 | 객체의 생성과 관련된 패턴으로 객체의 생성 로직을 숨김으로써 유연성 향상시킴 추상 팩토리 / 빌더 / 팩토리 메서드 / 프로토 타입 / 싱글톤 |
| 구조(Structural) 패턴 | 클래스와 객체의 구성에 관련된 패턴 어댑터 / 브릿지 / 컴퍼지트 / 데커레이터 / 퍼사드 / 플라이웨이트 / 프록시 |
| 행위(Behavioral) 패턴 | 객체와 객체간의 통신에 관련된 패턴 옵저버 / 책임 연쇄 / 커맨드 / 이터레이터 / 인터프리터 / 미디에이터 / 메멘토 / 테이트 / 스트래티지 / 템플릿 메서드 / 비지터 |
싱글톤 패턴
- 전역 변수를 사용하지 않고 객체를 하나만 생성하여 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
- 애플리케이션이 시작될 때 어떤 클래스가 최초로 한 번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용
- 고정된 메모리 영역을 할당받아 한 번의 new로 인스턴스를 사용하기 때문에 메모리 낭비 방지
- 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉬움
애자일
일정 주기를 가지고 실질적인 코딩을 통해 개발을 진행하며 그때그때 필요한 요구들을 더하고 수정하며 진행하는 방법
문서보다 작동하는 SW을 더 중시하고, 고객과의 협력을 가장 중요하게 생각함
- 장점 : 파악된 문제점을 초기에 해결 가능하고 사용자 피드백에 대해 빠르게 대응할 수 있음
- 단점 : 개발자 중심의 방법론이고, 불완전하고 예측 불가능한 요소(비용, 시간)의 불안성을 가짐
- 사용 : 고객의 요구사항이 많거나 변경 가능성이 많을 경우
폭포수 모델
분석 → 설계 → 개발/구현 → 테스트 단계를 순차적으로 진행해 프로그램을 만듦
하향식 접근으로 전 단계의 작업이 모두 완료되어야 다음 진행이 가능하고, 절차적 프로그래밍 기법
장점 : 오랜 기간 사용되어온 모델로 다양한 사례가 풍부하고 검증된 방식으로 업무 진행 가능
단점 : 사용자 피드백에 대한 빠른 대응이 어렵고, 테스트 단계에서 결함이 발견되면 치명적임
사용 : 주로 고객 요구사항이 단순하고 변경 가능성이 낮거나, 프로젝트 규모와 난이도가 높지 않을 때 사용
윈도우와 리눅스
윈도우
- 사용자의 편리에 초점을 맞춤
- 장점
- 한 번에 여러 프로그램을 열어 놓고 수행 가능
- 그림 형태인 아이콘으로 이뤄지는 GUI 환경 제공
- 명령 입력이 아닌 사용자의 행동으로 기능들이 수행됨
- 도움말 기능이 풍부해 별도 매뉴얼이 필요 없음
- 단점
- 사용자가 직접 코드를 수정할 권한이 없음
- 계정에 대한 전체 관리자 액세스 권한을 갖기 때문에 바이러스가 시스템을 공격하면 전체 시스템 손상 우려
리눅스
- 장점
- 오픈소스로 무료로 사용 가능
- 악성코드에 노출되는 윈도우에 비해 사용자가 적은 덕분인지 덜 노출됨
- 네트워크 사용을 전제로 설계되기 때문에 불가피한 상황을 제외하고는 서버가 항상 가동되어 안정적
- 윈도우에 비해 가벼운 성능을 가짐
- 다중 사용자와 멀티태스킹이 강점인 유닉스를 기반으로 설계되어 다중 작업에 뛰어남
- 단점
- 초기 진입 난도가 높음
- 커널과 여러 SW가 배포될 때 정리가 잘 되지 않았음
- 실시간 처리가 약함
- 종류 : 우분투, 레드햇...
차이점
- 신뢰도 : 리눅스가 윈도우보다 뛰어남
- 성능 : 리눅스는 네트워크가 과부하가 걸렸을 때 최적화된 성능을 보이진 않지만 서버 OS로 적합하고 윈도우는 과부하를 감당해내지 못함
- 구축비용 : 리눅스는 오픈소스로 무료 배포되어 있고, 윈도우 서버용은 가격이 비쌈
- 리눅스는 빠른 속도와 보안을 제공하는 반면 윈도우는 사용 편의성을 제공
- 리눅스는 많은 기업에서 보안 목적의 서버 및 OS로 사용하는 반면 윈도우는 개인이나 게이머가 사용
Docker
컨테이너 기반의 가상화 기술
기존에는 OS를 가상화해왔는데 이러한 방식은 상당히 무겁고 느려 한계가 많았음
이를 극복하고자 프로세스를 격리시킨 컨테이너를 통해 가상화를 하는 Docker 등이 등장
컨테이너
애플리케이션을 환경에 구애받지 않고 실행하는 기술
왜 굳이 사용?
- 서버 시장이 클라우드로 옮겨지게 되면서 가상 서버를 여러 대를 사용하게 되었음
- 서버 개수가 많아지면서 각 서버에 소프트웨어 설치 및 설정하는 것에 한계를 가지게 되었고, 이걸 해결하기 위해 사용
- 서버에 깔린 OS와 서비스 운영을 위한 환경(JAVA, MYSQL, node.js 등)을 분리해 패키징하여 배포하는 방식
- 패키징을 하게 되면 마치 가상 이미지 파일과 비슷하여 이미지라고 부르는데, 확장성이 매우 뛰어남
- 클라우드 플랫폼에 이미지를 통해 배포를 하게 되면 자동확장이 가능해지고 공장에서 틀에 물건을 찍어내듯이 서비스 확장이 가능
장점
- 쉽고 빠른 실행환경 구축
- HW 자원 절감
- Docker Hub와 같은 공유 환경 제공
단점
- 개발 초기의 오버헤드
- 리눅스 친화적
활용
- Spring Boot 애플리케이션 만들기
- DockerFile 만들기
- DockerFile 빌드해 Dockr Image 만들기
- Docker Image 기반으로 컨테이너 생성 및 배포하기
Docker File : 서버 운영 기록 코드화
Docker Image : 도커 파일을 실행할 시점
Jira
일정과 Issue를 관리하는 협업용 소프트웨어
스크럼 보드를 활용해 주로 프로젝트의 할 일과 이슈를 관리했음
사용법
- 가장 큰 단위인 프로젝트 스크럼 보드를 생성
- 그 안에 보통 2주 단위의 스프린트를 생성
- 프로젝트 기능 요구 사항에 맞춰 에픽을 생성
- 큰 틀인 에픽에 세부적으로 진행될 스토리, 이슈, 버그 등을 선택하여 생성
- 각각의 스토리, 이슈 등을 생성할 때 스프린트를 지정하거나 백로그에서 Drag&Drop으로 스프린트에 지정
활용 경험
- 프로젝트를 진행할 때 기획 1주, 전반적인 큰 기능 구현 2주, 세부 기능 및 완성 3주로 나누어서 스프린트 생성
- 각각의 스프린트의 에픽에는 큰 기능 예를 들어 회원 기능, 게시판 기능과 같은 큰 틀로 생성
- 각각의 에픽에는 스프린트를 시작하는 날 오전 스크럼 회의를 통해 스토리와 이슈 등을 생성해 스토리 포인트 부여
- 매일 오전 스크럼 회의를 통해 전날의 작업을 완료하거나 오늘 할 일들을 진행시킴
서버 확장을 위한 방법
갑작스러운 사용자의 증가, 사업 확장 등의 이유로 많은 서버 용량과 성능이 필요할 때 확장시키는 방법
Scale Out
- 여러 대의 서버를 두어 트래픽을 분산시키는 형태로 트래픽 관리
- 기존 서버만으로 용량이나 성능의 한계가 있다면 비슷한 사양의 서버를 추가 연결해 병렬 컴퓨팅 구현
- 수평 스케일링이라고도 함
- 장점
- 지속적으로 확장 가능
- 비교적 저렴한 서버 사용으로 비용 부담이 적음
- 여러 서버에 분산처리를 하기 때문에 전면 장애의 가능성이 적음
- 단점
- 서버가 여러 대기 때문에 로드밸런싱이 필수적으로 동반되어야 함
- 활용 : 모든 서버가 동일한 데이터를 가지고 있어야 하므로 데이터 변화가 적은 웹서버에 적합한 방식
로드밸런싱 : 한 대의 서버로 부하가 집중되지 않도록 트래픽 관리
Scale Up
- 기존의 HW보다 높은 사양으로 업그레이드하는 방식
- 높은 서버 성능을 통해 많은 트래픽 관리
- 성능이나 용량 증강을 목적으로 디스크를 추가하거나 메모리 성능을 업그레이드시키는 방식
- 수직 스케일링
- 장점
- 단순 교체 작업이기 때문에 구현과 설계가 쉬움
- 단점
- 성능 확장에 한계가 있음
- 성능 증가에 따른 비용에 대한 부담 증가
- 한 대의 서버에 부하가 집중되어 장애 영향도가 큼
- 활용 : 한 대의 서버에서 모든 데이터를 처리하므로 데이터 갱신이 빈번하게 발생하는 데이터베이스 서버에 적합
DevOps
SW의 개발과 운영의 합성어로 개발자와 기술 전문가 간의 소통, 협업 및 통합을 강조하는 개발환경이나 문화
웹과 앱
웹은 브라우저를 통해 동작하며 사용 단말기에는 제한이 없고 서버 환경에 따른 보안이 필요
앱은 각 OS마다 독립적으로 동작하며 OS에 따라 단말기에 제한이 걸리고, 스토어 환경에 따른 보안이 이뤄짐
브라우저 URL 입력 시 발생하는 일
- 브라우저 창에 URL을 입력하고 Enter를 누르면 서버에 그 요청이 전송됨
- 해당 페이지에 존재하는 여러 자원(text, image...)이 보내짐
- 브라우저는 해당 자원이 담긴 html과 스타일이 담긴 css를 W3C 명세에 따라 해석 (랜더링 엔진이 역할 수행)
- 랜더링 엔진은 우선 HTML 파싱 과정을 시작해 문서에 존재하는 어휘와 구문을 분석하며 DOM트리 구축
- CSS 파싱 과정을 통해 모든 CSS정보를 스타일 구조체로 생성
- DOM 트리와 CSSDOM트리를 연결시켜 랜더 트리를 생성
- 랜더 트리를 통해 문서가 시각적 요소를 포함한 형태로 구성된 상태가 됨
- 화면에 배치를 시작하고 UI 백엔드가 노드를 돌며 형상을 그림
- 이때 빠른 브라우저 화면 표시를 통해 '배치와 그리는 과정'은 페이지 정보를 모두 받고 한꺼번에 진행되지 않음
- 자원을 전송받으면 기다리는 동시에 일부분 먼저 진행하고 화면에 표시
명령형 프로그래밍
선언형 프로그래밍과 반대되는 개념으로 프로그래밍 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 것
함수형 프로그래밍
부수효과를 없애고 순수 함수를 만들어 모듈화 수준을 높이는 프로그래밍 방법
부수효과 : 객체의 상태를 변화시키는 것 (파라미터 포함)
순수 함수 : 부수효과가 없는 함수로 동일한 인자를 주었을 때 항상 같은 값을 리턴하는 함수
장점
- 코드의 동작을 추론하기 쉬움
- 멀티스레드에서 안정성 지원
- 재사용 가능하고 테스트하기 쉬움
클라우드
인터넷만 연결되어 있으면 언제 어디서나 메인 컴퓨터에 저장시킨 데이터를 이용할 수 있는 것
Iaas
인프라로서의 서비스로 서버, 네트워크, OS, 스토리지를 가상화하여 제공하고 관리 ex) AWS, MS에저...
Paas
플랫폼으로서의 서비스로 소프트웨어 개발을 위한 플랫폼을 가상화하여 제공하고 관리 ex) Windows 에저...
Saas
소프트웨어로서의 서비스로 클라우드 환경에서 동작하는 응용프로그램을 서비스화하여 제공하고 관리 ex) 구글앱...
Ajax
클라이언트에서 서버가 비동기적으로 통신하는 기술로 HTTP 요청 시 XMLHttpRequest라는 객체를 생성해 수행
캐시 메모리
CPU의 레지스터와 메모리 사이에서 캐싱을 통해 병목 현상을 완화하는 것
PC(Program Counter)
다음에 실행될 명령어의 주소가 들어있는 레지스터
명령어가 인출되면 자동으로 다음 명령어를 가리키도록 주소 값이 증가함
CDN(Content Delivery Network)
지리적 제약 없이 전 세계 사용자에게 빠르고 안전하게 콘텐츠를 전송할 수 있는 콘텐츠 전송 기술
Clean Code
가독성이 좋은 코드
구현
- 네이밍이 잘 되어야 함
- 오류가 없어야 함
- 중복이 없어야 함
- 의존성을 최대한 줄여야 함
- 클래스 혹은 메서드가 한 가지 일만 처리해야 함
리팩토링
프로그램의 외부 동작은 그대로 둔 채, 내부의 코드만을 수정하여 개선하는 것을 말함
코드의 가독성을 높이고 유지 보수에 도움이 됨
언제?
- 유사한 내용이 세 번 이상 반복할 때(삼진 규칙)
- 새로운 기능을 추가할 때 (어떤 부분을 수정해야 할지 더 쉽게 판단할 수 있기 때문)
- 버그를 수정할 때
- 코드 리뷰를 할 때
TDD(Test-Driven Development)
매우 짧은 개발 사이클을 반복하는 SW 개발 프로세스 중 하나로 테스트 주도 개발이라고 함
기존의 프로세스는 설계 → 개발 → 테스트의 과정을 반복하지만,
TDD는 설계 → 테스트 → 개발 과정에서 설계와 테스트 과정을 계속해서 반복하는 방식
장점
- 객체지향적인 코드 개발
- 설계 수정 시간의 단축
- 디버깅 시간 단축
- 유지 보수 용이성
- 테스트 문서의 대체 가능
단점
- 개발 시간의 증가 : 사전에 필요한 지식을 습득하고 개발 환경을 구축해야 함
Django와 Spring
Django
- Python 언어를 사용하여 개발하는 프레임워크
- 주요 기능
- MVC패턴 기반 MVT
- ORM
Spring
- Java언어를 사용하여 개발하는 프레임워크
- 주요 기능
- DI(의존성 주입)
- AOP(관점 중심 프로그래밍)
Error
컴파일 에러
- 컴파일 시 발생하는 에러로 구문 오류로 컴파일할 수 없다는 의미
- 에러 발생 시 발생한 부분을 알려줌
- 유형
- Syntax Error : 누락된 부분이 있는 경우
- 괄호가 안 맞는 구문 에러
런타임 에러
- 프로그램 실행 시 발생하는 에러로 컴파일된 후 실행하면서 에러 발생
- 개발 설계 미숙으로 발생하는 에러이며 개발자가 직접 역추적해 원인을 확인해야 함
- 유형
- Nullpointer
- 0으로 나눈 경우
- 무한 루프
변수 명명법
규칙
- 대소문자 구분되며 첫 글자는 문자 거나 '_', '$'로 시작해야 함
- 하나 이상의 글자여야 하고, 길이 제한은 X
- 예약어 사용 불가
- 첫 글자가 소문자인 명사로 지정하는 것을 권장
- 뜻이 있는 단어(쉽게 알아볼 수 있는 단어) 사용 권장
헝가리안 표기법(Hungarian Case)
자료형에 따라 구분하기 쉬운 명명법 ex) iballcount
카멜 표기법(Camel Case)
단어와 단어 사이를 대문자로 표시하는 명명법으로 낙타 등과 닮아서 Camel표기법으로 명명됨 ex) ballCount
파스칼 표기법(Pascal Case)
카멜과 유사하지만 각 단어의 모든 첫 글자를 대문자로 나타내는 명명법 ex) BallCount
스네이크 표기법(Snake Case)
단어와 단어 사이를 _(언더바)를 이용해 구분하는 명명법 ex) ball_count
'Study > Tech Interview' 카테고리의 다른 글
| Spring 면접 (0) | 2021.06.09 |
|---|---|
| OS 면접 #2 (0) | 2021.05.30 |
| OS 면접 #1 (0) | 2021.05.30 |
| Java 면접 (0) | 2021.05.28 |
| Data Structure 면접 (0) | 2021.05.24 |
댓글