NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.
NoSQL 는 비관계형 데이터베이스로 Join이 불가능하고 스키마에 맞추지 않는 일관성을 포기하였지만,
Scale-out 을 쉽게 할수 있고 Key value dm로 쌍으로 저장되고 속도가 굉장히 빠른 편입니다.
보통은 데이터 변경 확장이 될수 있을 경우에 사용하는것이 좋다고 생각합니다.
RDBMS 는 관계형 데이터베이스로 NoSQL 과 반대로 Join이 가능하고 스키마에 맞추어 일관성있는 데이터 구조를 가지고 있습니다. 또한, 서로 다른 테이블을 외래키로 Join을 할수 있다는 점이 큰 특징입니다. 다만, 스키마로 인해 데이터가 유연하지 못합니다.
보통은 데이터 구조가 정해져있을 경우에 사용하는것이 좋다고 생각합니다.
mvc 패턴에 대해서 설명해주세요.
MVC 패턴은 Model view Controller 3가지의 디자인 패턴입니다.
Model 은 데이터와 비즈니스 로직을 관리하고
View 는 레이아웃과 화면을 처리하고
Controller 는 명령을 모델과 뷰 부분으로 라우팅을 합니다.
MVC 패턴을 쓰게 되면 관심사 분리로 코드의 가독성과 코드 관리에 도움이 됩니다.
RDBMS의 정규화에 대해 설명해주세요.
RDBMS의 정규화는 중복을 최소하 하도록 설계 방식입니다.
중복을 최소하 하게 되면, 효과적인 검색 알고리즘 생성 가능과 저장 공간의 최소화 할수 잇습니다.
또한, 데이터 구조의 안정성을 유지 시킬수 있습니다.
반대인 비정규화도 존재합니다.
정규화와 다르게 중복을 허용해주게 하도록 설계 방식입니다.
이렇게 될시 Join 연산 감소로 속도 빠릅니다. 다만,
데이터 간의 일관성이 깨질수 있습니다.
Primary Key, Foreign Key에 대해 설명해주세요.
기본키는 테이블내에 단 하나만 존재하고, 유니크하고 공백이 될수 없습니다. 즉, 유일성과 최소성을 가지며
튜플을 식별하기 위해 반드시 필요한 키입니다. 하지만
테이블내에 기본키가 존재하지 않을수 있습니다. 다만, 기본키가 없는 테이블을 생성할시에 튜플을 식별하기 어려움이 있을수 있습니다.
외래키는 2개의 테이블의 데이터 간 연결을 설정하고 Join을 할수 있도록 도와주는 키 입니다.
예를 들면 고객 테이블과 주문테이블간의 외래키를 설정하여 고객테이블을 조회할때 Join 을 통해 주문 테이블의 데이터 까지 함께 가져올수 있습니다.
HTTP 메서드에 대해 설명해주세요.
HTTP 매서드는 클라이언트와 서버 사이에 이루어지는 Request Response 데이터 전송 방식을 말합니다.
주로 쓰이는 매서드는
GET
POST
PUT
PATCH
DELETE 가 존재하고
GET 은 리소스를 조회할때
POST 는 요청 데이터 처리 주로 등록을 할때
PUT 은 리소스 전체 수정할때
PATCH 는 리소스 부분 수정할때
DELETE 는 리소스를 삭제 할때 쓰입니다.
하지만 원래는 GET은 Body가 존재하지 않아 쿼리스트링을 통해 데이터 전달을 하였지만,
2014년도부터는 GET 은 Body가 허용이 되었습니다. 하지만 특정 클라이언트 또는 서버에서는 GET body 가 무시되는경우가 많아 잘 쓰지 않습니다.
이외에도 매서드가 존재하지만 잘 쓰이지는 않습니다.
CORS(Cross Origin Resource Sharing)에 대해 설명해주세요.
CORS 는 다른 도메인에서 리소스에 접근할때 발생되는 보안 제한을 관리하기 위한 매커니즘입니다.
저는 이번 부트캠프에서 CORS 를 만나봤습니다. 프론트의 React와 함께 개발을 진행하다 CORS 가 뜨고 서로 통신을 못하는 상황이 되서 WebMvcConfigurer 를 확장하여 전역으로 CORS 설정을 하여 통신이 올바르게 작동하도록 하였습니다. 하지만 Security 을 도입하자 또 다시 CORS 에러가 떴고 별도의 CORS 설정이 필요하다는 점을 알게 되어 CorsConfigurationSource 인터페이스를 이용하여 또다시 설정했습니다.
쿠키, 세션의 개념과 차이를 설명해보세요
쿠키와 세션의 큰 차이점은 제가 생각하기에는 바로 Cookie 는 클라이언트에게 저장이 되고 Session 은 서버에 저장이 됩니다.
Cookie 는 만료날짜를 지정할수 있고 보통은 로그인 상태 유지 광고 이런쪽으로 사용이 됩니다. 또한 Token을 쿠키에 저장하거나 로컬 스토리지에 저장하여 쓰이는 편입니다.
Session 은 고유의 ID 가 존재하여 서버 측에서 유저 정보를 저장하는 방식입니다. 또한, 클라이언트가 웹 사이트를 방문할때 세션은 생성되고 웹 사이트를 나갈때 세션은 종료됩니다. Session 을 이용한 로그인 방식에는 Stateful 즉 유상태 서버에 세션과 유저 정보를 저장하여 서버에서 관리하는것입니다.
TCP/UDP에 대해서 설명해주세요.
TCP 는 높은 신뢰성과 데이터 전송하기전 연결을 설정합니다.
제가 생각하는 TCP 프로트콜은 안전하게 전송할수 있는 프로트콜이라고 생각합니다.
보통은 이메일, 웹 브라우징, 파일전송에 쓰입니다.
UDP 는 신뢰성이 없고, 연결 설정이 없이 데이터를 전송합니다.
UDP 프로트콜은 빠르게 전달할때 쓰이는 프로트콜이라고 생각합니다.
그래서 보통은 스트리밍, 온라인 게임 에 쓰입니다.
http, https 차이점에 대해 설명해주세요
http는 서버 클라이언트 모델을 따라 데이터를 주고 받기 위한 프로트콜로 TCP 프로트콜 위에서 작동한다. 다만,
제 3자가 정보를 조회를 할수 있기 때문에 보안 문제가 있었다. 이러한 문제점을 개선 할려고 만든 것이
https 이다. https 는 데이터 암호화가 추가 된 프로트콜로 해당 도메인에 SSL 인증서를 받아 적용을 할시에 https 프로트콜을 쓸수 있도록 하였다.
DI, IoC에 대해 설명해주세요.
DI 는 의존성 주입으로 말하고 객체가 의존하고 있는 객체의 주입을 하는 방식을 이야기합니다.
스프링 기준 주입 방식에는 생성자 세터 필드 주입 방식이 있고, 공식적으로는 생성자 주입 방식을 권고 하고 있습니다.
IoC 는 역전의 제어로 스프링이 없던 시절, 의존성이 필요한 객체를 개발자가 직접 관리하였는데 이것을 스프링에게 위임하여 개발자는 비즈니스 로직 구성에만 집중할수 있도록 만든 것입니다. 흔히 IoC 컨테이너 DI 컨테이너 라고 부르는것으로 알고 있습니다. 해당 객체를 IoC 컨테이너에 넣어놓고 해당 객체를 관리해주고 있습니다.
객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?
객체지향 프로그래밍은 필요한 데이터를 클래스로 추상화 시켜 상태와 행위를 가진 객체를 만들고 객체들간의 관계를 모델링 하여 설계하는 프로그래밍 방법입니다. 장점은 크게 추상화, 캡슐화, 상속, 다형성으로 설명할수 있습니다.
추상화는 클래스나 객체들의 공통된 속성과 행위를 묶어 두는것을 말하는데 이는 결국 다형성과도 연결이 됩니다.
클래스의 다형성은 공통의 기능과 속성을 미리 정의를 해두고 해당 구현체에서 동일한 매서드로 다른 행동을 할 수 있게 해줍니다. 즉, 서로 상호적으로 작용하여 코드의 재사용성, 유지보수성을 극대화 해줍니다.
대용량 트래픽 발생 시 어떻게 대응해야 하나요?
대용량 트래픽 발생할때 웹 사이트나 애플리케이션의 안전성과 성능을 유지할려면 로드 밸런싱을 통해 Scale-out 을 진행하여 분산처리 하도록 할수 있고, 캐싱을 이용하여 빠르게 접근할수 있도록 할수 있습니다 그리고 데이터베이스에 대한 쿼리 최적화나 Index 알고리즘을 적용시켜 좀더 성능을 이끌어 낼수 있습니다. 또한 장애조치에 필요한 모니터링 서비스를 구축해야 하고 성능 테스트를 통해 성능 지표를 확인하고 클라우드 서비스를 활용 할수 있습니다.
ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?
만약 쿼리가 복잡해질경우에는 JPQL 이나 QueryDSL 로 대체하여 사용하는것이 좋을것 같습니다. 다만 JPQL 은 문자열 형태로 작성을 해야 하므로 개발자의 실수가 있을시 에러를 바로 찾을수 없지만 QueryDSL 은 확실한 에러가 나오기 때문에 QueryDSL 를 선호하긴 합니다. 복잡한 쿼리도 이런 방법을 통해 해결할수 있을것 같습니다.
OSI 7계층에 대해 아는대로 설명해주세요.
OSI 7계층은 네트워크 통신 프로세스를 7개의 계층으로 나눈 표준 모델입니다.
1번째 물리계층으로 케이블 허브가 있고
2번째 데이터 링크 계층으로 스위치가 있습니다
3번째로 네트워크 계층 라우터가 있고
4번째로 전송계층으로 TCP UDP 같은 프로트콜을 포함합니다.
5번째로 세션 계층,
6번째, 표현 계층,
7번째로 응용계층이 있습니다.
세션 기반 인증과 토큰 기반 인증의 차이에 대해 설명해주세요.
세션 기반 인증은 서버의 세션 저장소에 저장되는 방식입니다. 사용자에게는 저장된 세션 정보의 Session ID 를 발급합니다.
토큰 기반 인증은 인증 정보를 클라이언트가 직접 들고 있는 방식입니다. 토큰정보를 가지고 서버에 접근하고 해당 토큰을 검증하기만 하면 됩니다.
다만, 세션과 토큰의 큰 차이점은 Stateful 과 Stateless 인것 같습니다. 세션 기반 인증은 해당 세션을 저장하는 공간이 따로 필요한 방면 토큰은 따로 저장해야 되는 공간이 없습니다. 이러한 이유로 세션은 사용자가 많아지면 많아질수록 서버에 부담이 커지고 확장성도 고려 해봐야 합니다. 다만 토큰 방식은 JWT 예를 들자면 시크릿 키 만 있을시에 확장성을 고려 하지 않아도 되고 서버의 부담도 작습니다. 하지만 보안의 문제도 있습니다. 세션은 서버가 저장해놓지만 토큰은 클라이언트에게 저장을 해놓고 쓰기 때문에 탈취 당하면 서버에서 막을수 없습니다.
JWT, Refresh, Access Token에 대해서 설명해주세요.
먼저 JWT 는 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격입니다.
헤더, 페이로드, 서명 이렇게 세 부분으로 나누어 토큰 발급이 되고 알고리즘을 선택하여 암호화 할수 있습니다.jwt 공식사이트에서 토큰은 해석이 가능하지만 시크릿 키 가 없을 경우 수정해도 아무 소용이 없습니다.좋은점은 시크릿 키 만 가지고 있다면 복호화 암호화 둘다 가능하고 JWT 에게 위임하여 따로 관리할 필요가 없습니다.Access Token은 입장권 같은것 입니다. 해당 Token 을 가지고 접근하게 되면 서버는 시크릿키를 통해 검증을하고 통과 시켜줍니다. 하지만 이러한 입장권이 보안상 유효기간을 짧게 잡고 있습니다 이럴 경우 Access Token 을 계속 발급 을 시키거나 다시 계속 로그인을 해야 되는 상황이 오는데 이럴때 쓰는 Refresh Token이 있습니다. 재 발급용 토큰이라고 생각하면 좋다고 생각합니다. Refresh Token 은 자체가 유효한지 확인하고 저장공간에 두었던 원본 Refresh Token 과 비교하여 유효 하다면 Access Token 을 다시 바꿔주는 역할을 합니다.만약 Refresh Token이 만료가 되었다면 Access, Refresh Token 을 전부 재 발급해 줍니다.
OAuth에 대해서 설명해주세요.
OAuth는 외부 소셜 계정을 기반으로 간편히 회원가입 로그인 할수 있는 프로트콜이 OAuth 입니다.
사용자들에게 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 접근 권한을 부여 할수 있습니다.
예를 들면 Kakao 에 로그인을 먼저하고 그 로그인 한 Token 을 가지고 서버에 보내주면 확인 절차 이후 로그인이 성공 되는 구조를 가지고 있습니다. 이렇게 되면 Kakao 서버에서 해당 유저의 아이디, 비밀번호 정보를 관리 해줌으로써 보안에 대해 생각을 안해도 되고, 인증 처리만 하면 되니 편리 합니다.
CI/CD에 대해서 설명해주세요.
CI/CD 란 지속적 통합, 지속적 배포 입니다. 애플리케이션 개발 단계를 자동화 하여 애플리케이션을 더욱 짧은 주기로 제공하는 방법 입니다. 이러한 구축을 하는것을 CI/CD 파이프 라인이라고 이야기 하며 실제로 제가 GithubAction 을 써서 CI/CD 파이프라인을 구축하여 AWS 에 배포를 해보았는데, 원하는 스크립트를 생성하여 자동화 작업을 구축하니 매우 편리하였습니다.
TDD에 대해서 설명해주세요.
TDD 는 테스트 주도 개발입니다. 유닛 테스트를 작성하고 이를 통과하는 코드를 추가하여 단계를 반복하여 구현합니다.
먼저 3단계로 분리할수 있는데 1번째 실패하는 테스트 코드 추가, 2번째 테스트 통과하기 위한 프로덕션 코드 작성 3번째 중복 코드 제거 및 일반화 등의 리팩토링을 수행합니다. 이 3단계를 사용하여 불필요한 설계를 피할 수 있고 정확한 요구 사항에 집중 할수 있습니다. 다만 불편한 점도 있습니다. 가장 큰 단점은 생산성의 저하입니다. 처음부터 2개의 코드를 작성해야 하고 중간 테스트를 통해 2개의 코드를 고쳐야 되는 부분이 있어 생산성이 떨어집니다. 하지만 이렇게 작성을 해도 이후에는 문제가 없는지 먼저 진단 받고, 재설계 시간을 단축할수 있기 때문에 많이 사용하는것 같습니다.
프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.
먼저 프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말합니다. 메모리에 실행되고 있는 프로그램의 인스턴스들이고 각각 메모리 영역을 할당 받습니다. 기본적으로는 프로세스당 최소 1개의 스레드를 가지고 있습니다.
다음은 쓰레드 입니다. 쓰레드는 프로세스 내에서 실행되는 여러 흐름의 단위 입니다. 프로세스는 다른 프로세스의 메모리에 직접 접근할수 없습니다. 또한 프로세스내에 스레드들은 각각 Stack 만 따로 할당받지만 Code, Data, Heap 영역은 공유합니다. 또한, 자바 스레드라고 일반 스레드와 거의 차이가 없고, JVM 가 운영체제의 역할을 해줍니다. Java 에서는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM 에 의 스케줄되는 실행 단위 코드 블록입니다.
멀티프로세스와 멀티쓰레드의 특징에 대해 설명해주세요.
멀티프로세스는 두개 이상 다수의 프로세서가 협력적으로 하나 이상의 작업을 동시에 처리하는것입니다. 즉, 병렬처리를 뜻합니다. 멀티쓰레드는 하나의 프로세스에 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는것이지만, 멀티 프로세스보다 메모리 적은 공간을 차지하는 장점이 있지만 하나의 스레드 장애로 전체 스레드가 종료 될 위험이 있습니다. 또한 멀티프로세스는 독립된 메모리 영역이기 때문에 작업량이 많을수록 오버헤드가 발생하여 성능 저하가 발생될수 있습니다.
쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.
쿼리 최적화는 CPU 메모리를 불필요하게 쓰이는 부분과 불필요한 쿼리문을 날리는 부분을 줄이고, 효율적으로 쓸수 있도록 하는것입니다. 예를 들면 Spring 의 쿼리매서드는 Join 을 쓰지 않고 두개의 쿼리로 조회를 해오지만 이점을 QueryDSL 이나 JPQL 로 하나의 쿼리로 가져올수 있고, 필요한 데이터 부분만 가져오게 된다면 쿼리 최적화라고 할수 있습니다. 실제로 쿼리 최적화로 성능 개선을 한 경험을 가지고 있습니다.
DB 로직 최소화를 하려면 어떻게 해야 할까요?
DB 로직 최소화를 할려면 데이터베이스와 관련된 작업을 최적화 하고 효율적으로 처리하는 방법을 적용해야 하는데 대표적인 예시로 일관된 데이터 모델링과 비즈니스 로직 분리, 조회 최적화, 인덱스 활용등이 있습니다. 실제로 DB 로직 최소화 한 경험으로는 데이터 캐싱을 해보았습니다. 자주 사용되는 count 쿼리를 Redis 에 저장을 해놓고 데이터 일관성을 위해 생성 삭제 부분에 Redis count 를 조절하여 관리 하고 사용해본 결과 성능 개선에 큰 도움이 되었습니다.
테스트코드에 대해서 아는대로 설명해주시고 활용 경험에 대해서 답변해주세요.
테스트코드는 개발자가 작성한 코드를 실행하고 예상된 결과가 나오는지 확인하는데 사용합니다. 보통 유닛 테스트 통합 테스트 시스템 테스트 사용자 인수 테스트 등 다양한 종류가 있으며 실제로 유닛 테스트와 통합 테스트를 진행 해본결과 중복 로직을 방지 할수 있었고, 최소한의 안전 보장이 되고, 재 설계를 할 시간을 줄임으로써 초기 자원이 많이 들지만, 내가 무엇을 만들고 있는지 정확하게 인지할수 있었고, 결합고와 의존성이 낮은 코드를 지향하게 된것 같습니다.
Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요
Array 는 동일한 타입의 요소들로 이루어진 데이터 구조로, 각 요소는 인덱스로 접근할수 있고,
LinkedList 는 노드들의 집합으로 각 노드는 데이터와 다음 노드를 가리키는 참조로 구성됩니다.
Array 는 0(1)의 시간 복잡도로 특정 위치의 요소에 접근할수 있고 연속된 메모리 공간을 사용하므로, 메모리 관리에 있어서 오버헤드가 작습니다. 다만 중간에 있는 요수 추가 삭제하는 작업은 0(n) 의 시간 복잡도로 비효율적입니다.
LinkedList 는 주어진 노드를 기준으로 추가 삭제는 0(1) 의 시간 복잡도를 가지지만, 노드의 위치를 찾는것은 O(n) 의 시간 복잡도로 비효율적입니다. 이로써 Array 는 데이터 접근이 주 로직일때 많이 쓰는것 같고, Linked List 는 데이터 수정이 주 로직일때 많이 쓰이는것 같습니다.
AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.
AWS EC2 는 탄력성과 다양성, 다른 AWS 서비스 통합으로 쓸수 있어 사용하는 것 같고,
S3 는 내구성과 가용성, 보안, 통합과 호환성이 좋아 사용하는것 같습니다. 실제로 AWS EC2 로 Spring 서버를 올리고 S3 에서 이미지 처리한적이 있습니다. Spring 서버를 EC2 에 올렸을 때 Scale-up 을 해야 되는 사항이 있었는데 이미지를 생성하여 손쉽게 Scae-up 을 할수 있었고, S3는 해당 이미지를 볼수 있도록 액세스 제어와 버킷 정책을 이용해 url 로 보여줄수 있었습니다.
정렬 알고리즘에 대해서 아는대로 설명해주세요.
정렬 알고리즘은 데이터 요소들을 특정 순서대로 나열하는 방법인데, 대표적인 알고리즘을 말씀 드리면
버블 정렬, 선택 정렬, 삽입 정렬, 머지 정렬, 퀵 정렬등이 있습니다.
- 버블 정렬 (Bubble Sort)
- 원리: 배열의 인접한 요소들을 비교하여 큰 값을 뒤로 보내는 과정을 반복합니다.
- 시간 복잡도: 평균 및 최악의 경우 O(n^2)
- 장점: 구현이 간단합니다.
- 단점: 효율성이 낮아 큰 데이터셋에 적합하지 않습니다.
- 선택 정렬 (Selection Sort)
- 원리: 배열에서 최소 (또는 최대) 값을 찾아 앞쪽부터 순서대로 재배열하는 과정을 반복합니다.
- 시간 복잡도: 항상 O(n^2)
- 장점: 간단하게 구현할 수 있습니다.
- 단점: 효율성이 낮습니다.
- 삽입 정렬 (Insertion Sort)
- 원리: 각 스텝에서 하나의 데이터 요소를 적절한 위치에 삽입하는 방법으로 정렬합니다.
- 시간 복잡도: 최선의 경우 O(n), 평균 및 최악의 경우 O(n^2)
- 장점: 작은 데이터셋에서는 빠르며, 대부분 정렬된 배열에서 효율적입니다.
- 단점: 데이터셋이 크면 비효율적입니다.
- 머지 정렬 (Merge Sort)
- 원리: 배열을 두 부분으로 나눈 다음 정렬하고, 두 정렬된 부분을 병합하는 방법입니다.
- 시간 복잡도: O(n log n)
- 장점: 안정적이며, 큰 데이터셋에서도 효율적입니다.
- 단점: 추가적인 메모리를 필요로 합니다.
- 퀵 정렬 (Quick Sort)
- 원리: 피벗(pivot) 값을 선택하고, 피벗을 기준으로 작은 값들은 왼쪽으로, 큰 값들은 오른쪽으로 분할한 후 재귀적으로 정렬합니다.
- 시간 복잡도: 평균 및 최선의 경우 O(n log n), 최악의 경우 O(n^2)
- 장점: 추가 메모리 없이 인플레이스로 정렬이 가능하며, 일반적으로 빠른 편입니다.
- 단점: 최악의 경우 시간 복잡도가 O(n^2)입니다. 이를 방지하기 위해 피벗 선택 전략이 중요합니다.
'TIL' 카테고리의 다른 글
2023.08.28 (0) | 2023.08.29 |
---|---|
2023.08.27 (0) | 2023.08.27 |
2023.08.19 (0) | 2023.08.19 |
2023-08-17 - JMeter / 성능 개선 (0) | 2023.08.17 |
2023.08.17 (0) | 2023.08.17 |