JPA
JPA의 특징
- 쿼리를 일일히 작성할 필요가 없어 코드 작업량이 줄어든다.
- 가독성이 뛰어나다.
- 수정이 간편해 유지보수, 리팩토링에 용이하다.
JPA의 한계점
- 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있다.
- 동적 쿼리를 사용하면 가독성이 떨어져 유지보수 시 어려움이 있다.
MySQL
5.7 vs 8.0 차이점
- 사용자 인증방식 변경
- 외래키 이름의 길이(64bit)
- MySQL 8.0과의 호환성 체크 (*추가 공부 필요)
- 인덱스 힌트(*추가 공부 필요)
- GROUP BY 에 사용된 정렬 옵션(*추가 공부 필요)
- 파티션을 위한 공용 테이블 스페이스(*추가 공부 필요)
MySQL 8.0 특징
- 데이터 딕셔너리 업그레이드
MySQL 5.7 버전까지는 데이터 딕셔너리 정보가 FRM 확장자를 가진 파일로 별도로 보관됐었는데, MySQL 8.0 버전부터는 데이터 딕셔너리 정보가 트랜잭션이 지원되는 InnoDB 테이블로 저장되도록 개선됐다. 데이터 딕셔너리 업그레이드는 기존의 FRM 파일의 내용을 InnoDB 시스템 테이블로 저장한다. MySQL 8.0 버전부터는 딕셔너리 데이터의 버전 간 호환성 관리를 위해 테이블이 생성될 때 사용된 MySQL 서버의 버전 정보도 함께 기록한다.
- 서버 업그레이드
MySQL 서버의 시스템 데이터베이스(performance_schema와 information_schema, 그리고 mysql 데이터베이스)의 테이블 구조를 MySQL 8.0 버전에 맞게 변경한다.
UNION vs UNION ALL
UNION과 UNION ALL 모두 여러개의 SQL문을 합쳐 하나의 SQL문을 만들어 준다.
그러나 차이점이 있다.
UNION
- 두 쿼리의 결과 중에서 중복되는 값을 삭제하여 나타낸다.
UNION ALL
- 두 쿼리의 결과 중에서 중복되는 값을 모두 보여준다.
- 중복체크를 하지않기 때문에 속도가 더 빠르다.
PK와 FK
PK 특징
- 엔티티를 식별하는 대표 Key
- Null 값을 가질 수 없고, 중복된 값을 가질 수 없다.
- table당 1개만 지정해야한다.
FK 특징
- 외부 식별자Key로 테이블 간의 관계를 의미한다.
- 두 테이블 간의 종속이 필요한 관계이면 그 접점이 되는 칼럼을 FK로 지정하여 서로 참조할 수 있도록 관계를 맺어준다.
- 테이블 간의 잘못된 매핑을 방지하는 역할도 한다.
원형 링크드 리스트
- 단순 연결 리스트에서 마지막 원소가 널 대신 처음 원소를 가리키게 하면 원형 연결 리스트가 된다.
시간복잡도
- 노드의 삽입과 삭제 시에는 시간 복잡도가 O(1) 이고, 탐색의 경우는 O(N)이다.
스택과 힙
스택
- 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO(Last In First Out) 형식의 자료 구조
- 가장 최근에 스택에 추가한 항목이 가장 먼저 제거될 항목이다.
- 웹 브라우저의 뒤로가기, 실행 취소, 수식의 올바른 괄호 검사를 판단하는데 유용하다.
힙
- 완전 이진 트리를 기초로 하는 자료 구조
- 마지막을 제외한 모든 노드에서 자식들이 꽉 채워진 이진트리
- 최대힙과 최소힙으로 나뉜다. (위 이미지는 최소힙)
- 최대 힙은 부모노드의 값이 항상 자식 노드들의 값보다 크다.
- 최소힙은 부모노드의 값이 자식 노드의 값보다 항상 작다.
- 최댓값 또는 최솟값을 쉽게 뽑기 위한 자료구조임으로 중복을 허용함.
프로세스와 스레드
프로세스
- 실행파일로 존재하던 프로그램이 메모리에 적재되어 CPU에 의해 실행되는 것을 process라고 한다.
스레드
프로세스와 스레드의 비교
- 멀티 프로세스와 멀티 스레드는 양쪽 모두 여러 흐름이 동시에 진행된다.
- 멀티 프로세스에서 각 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있다.
- 멀티 스레드는 프로세스 내의 메모리를 공유해 사용할 수 있다.
- 프로세스 간의 전환 속도보다 스레드 간의 전환 속도가 더 빠르다.
swagger
백엔드 입장에서 swagger의 단점
- 테스트 코드 없이도 문서를 생성할 수 있기에 API 문서를 신뢰하기 어렵다.
- 컨트롤러 코드에 swagger 코드가 아주 많이 작성되어야 한다.
JWT
JWT에 대해서 얼마나 알고 있는지?
.
을 기준으로 좌측부터 Header, Payload, Signature를 의미하는 문자열의 조합이다.
- Header 에는 JWT 에서 사용할 타입과 해시 알고리즘의 종류가 담겨있다.
- Payload 는 서버에서 첨부한 사용자 권한 정보와 데이터가 담겨있다.
- Signature 에는 Header, Payload 를 Base64 URL-safe Encode 를 한 이후 Header 에 명시된 해시함수를 적용하고, 개인키(Private Key)로 서명한 전자서명이 담겨있다.
- 전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다.
- 암호화(전자서명)에는 개인키를, 복호화(검증)에는 공개키를 사용한다.
점근성능 시간복잡도
- 입력크기(실제 처리하는 데이터 개수) n이 무한대로 커짐에 따라 결정되는 성능
- 데이터 개수가 증가하면 알고리즘 성능결정에 가장 큰 요인은 무엇인지 따지는 것
- 수행시간의 다항식 함수에서, 데이터 개수가 증가할 수록(입력크기가 증가할 수록) 최고차항이 성능결정요인에 가장 큰 요인이 됨
- 계수 없이 최고차항만으로 시간복잡도를 표현
TCP/IP 4계층
4계층 : Application Layer
- OSI 7 Layer에서 세션계층 , 프레젠테이션계층, 애플리케이션 계층에 해당한다. (5, 6, 7계층)
- 응용프로그램들이 네트워크서비스, 메일서비스, 웹서비스 등을 할 수 있도록 표준적인 인터페이스를 제공한다.
- TCP/IP 기반의 응용 프로그램을 구분할 때 사용한다.
- 프로토콜 : HTTP, FTP, Telnet, DNS, SMTP
3계층 : Transport Layer
- OSI 7 Layer에서 전송계층에 해당한다.
- 네트워크 양단의 송수신 호스트 사이에서 신뢰성 있는 전송기능을 제공한다.
- 시스템의 논리주소와 포트를 가지고 있어서 각 상위 계층의 프로세스를 연결해서 통신한다.
- 정확한 패킷의 전송을 보장하는 TCP와 정확한 전송을 보장하지 않는 UDP 프로토 콜을 이용한다.
- 데이터의 정확한 전송보다 빠른 속도의 전송이 필요한 멀티미디어 통신에서 UDP 를 사용하면 TCP보다 유용하다.
- 통신 노드 간의 연결을 제어하고, 자료의 송수신을 담당
- 프로토콜 : TCP, UDP
2계층 : Internet Layer
- OSI 7 Layer의 네트워크 계층에 해당한다.
- 인터넷 계층의 주요 기능은 상위 트랜스포트 계층으로부터 받은 데이터에 IP패킷 헤더를 붙여 IP패킷을 만들고 이를 전송하는 것이다.
- 통신 노드 간의 IP 패킷을 전송하는 기능 및 라우팅 기능을 담당
- 프로토콜 : IP, ARP, RARP, ICMP, OSPF
1계층 : Network Access Layer
- OSI 7 Layer에서 물리계층과 데이터링크 계층에 해당한다.
- OS의 네트워크 카드와 디바이스 드라이버 등과 같이 하드웨어적인 요소와 관련되 는 모든 것을 지원하는 계층
- 송신측 컴퓨터의 경우 상위 계층으로부터 전달받은 패킷에 물리적인 주소은 MAC 주소 정보를 가지고 있는 헤더를 추가하여 프레임을 만들고, 프레임을 하위계층인 물 리 계층으로 전달한다.
- 수신측 컴퓨터의 경우 데이터 링크 계층에서 추가된 헤더를 제거하여 상위 계층인 네트워크 계층으로 전달한다.
- CSMA/CD, MAC, LAN, X25, 패킷망, 위성 통신, 다이얼 모뎀 등 전송에 사용
- 프로토콜 : Ehternet(이더넷), Token Ring, PPP
Java
접근제어자
private
private 접근 제어자를 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며, 외부에서는 직접 접근할 수 없다.
즉, 자바 프로그램은 private 멤버에 직접 접근할 수 없으며, 해당 객체의 public 메소드를 통해서만 접근할 수 있다.
따라서 private 멤버는 public 인터페이스를 직접 구성하지 않고, 클래스 내부의 세부적인 동작을 구현하는 데 사용된다.
public
public 접근 제어자를 사용하여 선언된 클래스 멤버는 외부로 공개되며, 해당 객체를 사용하는 프로그램 어디에서나 직접 접근할 수 있다.
자바 프로그램은 public 메소드를 통해서만 해당 객체의 private 멤버에 접근할 수 있다.
따라서 public 메소드는 private 멤버와 프로그램 사이의 인터페이스(interface) 역할을 수행한다고 할 수 있다.
자바에서 public 멤버는 프로그램 어디에서 누구나 접근할 수 있다.
default
자바에서는 클래스 및 클래스 멤버의 접근 제어의 기본값으로 default 접근 제어를 별도로 명시하고 있다.
이러한 default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 된다.
default 접근 제어를 가지는 멤버는 같은 클래스의 멤버와 같은 패키지에 속하는 멤버에서만 접근할 수 있다.
protected
자바 클래스는 private 멤버로 정보를 은닉하고, public 멤버로 사용자나 프로그램과의 인터페이스를 구축한다.
여기에 부모 클래스(parent class)와 관련된 접근 제어자가 하나 더 존재한다.
protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급된다.
클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같다.
- 이 멤버를 선언한 클래스의 멤버
- 이 멤버를 선언한 클래스가 속한 패키지의 멤버
- 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버
다형성
- 휴대폰은 알람이기도 하고 동시에 카메라이기도 하다. 하나의 객체가 다양한 타입으로 해석되는 것이 다형성(Polymorphism)이다.
캡슐화, 은닉화
캡슐화
- 객체가 은닉화 된 상태에서 메소드나 생성자의 일의 내용을 알 필요 없이, 그 형태(메서드 이름/파라미터/리턴 타입)만 알면 호출해서 사용할 수 있는 특성
은닉화
- 외부 객체로부터 '속성 값(데이터, 멤버 변수값)'을 감추는 특성
extends와 implements
extends
- 부모에서 선언/정의를 모두하며 자식은 메소드/변수를 그대로 사용할 수 있음
- 부모의 메소드를 그대로 사용할 수 있으며 오버라이딩 할 필요 없이 부모에 구현되있는 것을 직접 사용 가능하다.
- 자바는 "다중상속"을 지원하지 않는데, 대신 implements(인터페이스)가 등장했다.
다중상속이란 부모클래스가 두개 이상 존재할 수 있다는 것인데, 자바에서는 이를 지원하지 않는다. 즉 , public class Son extends Father, Mother{...} 이것이 지원되지 않는다는 것이다.
implements
- 부모 객체는 선언만 하며 정의(내용)은 자식에서 오버라이딩 (재정의) 해서 사용해야함
- implements의 가장 큰 특징은 부모의 메소드를 반드시 오버라이딩(재정의)해야 한다.
- class가 class를 상속받을 땐 extends를 사용하고, interface가 interface를 상속 받을 땐 extends를 사용한다.
- class가 interface를 사용할 땐 implements를 써야하고
interface가 class를 사용할 땐 implements를 쓸수 없다.
- extends는 클래스 한 개만 상속 받을 수 있다.
- extends 자신 클래스는 부모 클래스의 기능을 사용한다.
- implements는 여러개 사용 가능하다.
- implements는 설계 목적으로 구현 가능하다.
- implements한 클래스는 implements의 내용을 다 사용해야 한다.
출처: https://velog.io/@hkoo9329/자바-extends-implements-차이
오버로딩과 오버라이딩
오버로딩
- 이름은 같지만 매개변수/리턴타입이 다른 메소드
오버라이딩
- 부모 클래스의 메소드를 자식 클래스에서 재정의
클래스와 객체, 인스턴스의 차이
클래스
- 클래스(Class)란 Java 프로그램에서 객체를 생성하기 위한 일종의 설계도이다. 객체가 가지는 속성(필드)과 동작(메소드)으로 이루어져 있다. 흔히 붕어빵(객체)을 만들기 위한 붕어빵 틀(클래스)이라고 비유를 한다. 클래스는 필드(Field), 생성자(Constructor), 메소드(Method)로 구성되어 있다. 이들은 생략될 수도 있고 하나 이상 작성될 수도 있다.
객체
- 객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다. 예를 들어 물리적(유형)으로 존재하는 자동차, 컴퓨터, 사람과 추상적(무형)으로 존재하는 강의, 주문 등이 모두 객체가 될 수 있다.
인스턴스
- 클래스가 붕어빵 틀이라면 그 틀을 통해 생성된 객체(붕어빵) 하나하나를 해당 클래스의 인스턴스(Instance)라고 부른다. Java 프로그램 실행 시 클래스는 JVM 메모리의 클래스 영역(Class Area)에 로드되고 이 클래스를 사용하여 힙 영역(Heap Area)에 새로운 인스턴스(객체)를 생성할 수 있다. 즉, 인스턴스란 현실의 객체를 소프트웨어 내에서 구현한 실체라고 볼 수 있다. 이렇게 생성된 인스턴스들은 각자 고유의 특성을 가지고 독립적으로 존재한다.
예를들어 붕어빵을 만든다고 상황을 가정해보자. 여기서 클래스는 붕어빵을 만들기 위한 틀이 되고 객체는 붕어빵이다. 그리고 인스턴스는 붕어빵 틀로 찍어낸 각각의 붕어빵이다.
팥붕어빵과 슈크림붕어빵은 같은 타입의 객체이지만, 인스턴스 관점으로 보았을 때는 다르다.
의존성 주입(DI)
- 객체 생성과 관리, 주입이 개발자의 코드가 아닌 컨트롤러에 의해 제어되고 프로그램의 흐름이 외부에 의해 통제되는 개념을 IoC라고 한다. 그리고 필요 객체를 외부에서 또다른 객체로 주입하는 방식을 DI라고 한다.
암호화
대칭키와 비대칭키
대칭키
- 어떤 정보를 암호화, 복호화할 때 사용하는 키가 동일(대칭)한 경우
- 암호화된 정보를 전달하고 확인하기 위해서는 송수신자 둘 다 똑같은 키를 가지고 있어야 함
- 키를 안전하게 교환하는 것이 대칭키 암호화 방식의 핵심
비대칭키
- 어떤 정보를 암호화, 복호화할 때 사용하는 키가 서로 다른 경우
- 대칭키와 달리 비대칭키를 활용한 암호화에는 개인키와 공개키 두가지가 사용됨.
쿠키와 세션의 차이
쿠키
- 쿠키는 정보를 클라이언트에 저장한다. (개인 PC)
- 데이터 형태는 key, value 형태이며, String으로 이루어져 있다.
이름, 값, 만료일, 경로 정보로 구성되어있다.
세션
- 세션은 정보를 웹서버에 저장한다.
- 세션은 웹 브라우저 당 1개씩 생성되고 웹 컨테이너에 저장한다.
브라우저가 종료되면 세션도 삭제된다.
- 로그아웃을 하면 쿠키가 삭제되어 보안성이 좋다.
- 브라우저를 닫거나 세션을 삭제해야만 삭제가 된다.
- 저장 데이터 제한이 없다.
쿠키가 세션보다 빠르다.
보안은 세션이 쿠키보다 좋다.
그 외 질문들 (추가 예정)
- 자주쓰는 리눅스 명령어
- SOLID 원칙에 대해서
- nginx 에 대해서 공부한 것
- 자바8과 11의 차이점
- API, HTTP API와 REST API의 차이점
- XML vs JSON
- H2 데이터 베이스는 언제 썼는지
- DB 인덱싱에 대해서 알고 있는지
- 외래키가 NULL이 허용되는지
- PK와 FK의 차이
- PK와 FK를 왜 쓰는지
- left outer join, inner join 차이
- 브랜치 전략
- HTTP 요청이 들어왔을 때 스프링에서 일어나는 동작 과정
- 사용한 프로젝트 Dependency에 대해서 설명해봐라
References
키워드 얻어갑니다. ^^