Skip to the content.

java의 기본 메모리 구조
-메서드 영역: 클래스 로더가 클래스 파일을 읽어오면 정보를 파싱해서 저장/ 클래스 정보, 변수 정보, static으로 선언된 변수를 저장 - 모든 스레드가 공유함
-힙 영역: 모든 객체 인스턴스들을 저장/ new 연산자로 생성된 동적인 인스턴스 변수들을 저장 - 모든 스레드가 공유하며 GC가 관여하는 구간
-스택 영역: 임시 변수나 지역 변수, 메서드들을 저장하는 곳이며 호출이 끝나면 데이터가 사라짐.
-pc register: 현재 동작중인 jvm의 명령어 주소를 저장하는 공간이며 직접 cpu에게 연산을 시키지않고 jvm이 작업한 내용을 cpu에게 연산으로 제공한다. 이를 위해 생긴공간이라고 생각하면 된다.
-네이티브 메서드 스택 영역: 자바코드가 아닌 다른 언어로 작성된 코드를 수행하기 위한 공간.

Person p = new Person(1,’name’)
여기서 변수 p는 스택 영역에 생기며 new Person으로 생성자로 생성된 데이터는 힙영역에 생성되며 이와같이 레퍼런스 타입은 힙영역에 생성된다.

먼저 .java 라는 코드를 컴파일(javac)하면 .class(바이트 코드화) 라는 파일이 생성된다.
그리고 클래스 로더가 자바 런타임 area에 로딩시킨다.

gc의 역할
힙 영역에서 필요없는 변수들을 제거하고 주소가 없는 변수같이 쓸모없는 영역을 청소해주는 역할
자바와 자바스크립트는 마크엔 스웹이라는 gc 알고리즘을 사용하는데 단점이 의도적으로 gc를 동작시켜야되기 때문에 컴퓨터 리소스를 넘겨줘야된다.
정리하자면 어플리케이션과 gc 모두 실행되어야 한다.

node.js의 동작구조

console.log같은 함수는 바로 콜스텍에서 출력한다.
콜백함수는 task queue에 적재
프로미스 함수는 micro-task queue에 적재
먼저 콜스택이 비어있는지 확인하고 이벤트 루프는
micro-task queue에 먼저 적재되어있는 것을 실행하고
micro-task queue가 비어있다면 task queue에 있는 것들을 실행하여 콜스택에 이벤트 루프로 넘긴다.

스프링 기본 설명
spring vs spring boot의 차이
간편한 설정과 의존성관리가 편리하며 내장 톰캣서버로 인해 배포시 간단하게 할 수 있다.

jpa 기본 설명
sql에 대해 알지 못해도 데이터베이스를 조작할수 있도록 도와주는 orm 툴이다.
장점- 객체지향적으로 비즈니스 로직에 집중할수 있고, DB 시스템이 추상화 되어있기때문에 다른 DB로 변경해도 추가적으로 드는 작업이 없다.
단점으로는 불필요한 쿼리가 날라가는 경우 쿼리 튜닝에 어려움이 있다.

queryDsl 기본설명

엔티티를 sql로 관리할수 있도록 도와주는 툴이며 동적으로 쿼리를 작성할 수 있다.

spring과 express의 차이
스프링은 틀이 정해져있어 강하게 아키텍쳐를 줄수 있다.
익스프레스는 도화지같은 프레임워크라 아키텍처에는 제한이 없는만큼 각자 코드 스타일이 다르기때문에 하나의 컨벤션이 필요하다 eslint 처럼

웹에서 버튼을 누르면 동작하는 방식
어플리케이션 레이어: http 프로토콜 방식으로 요청에 대한 정보들을 담는다.
트랜스포트 레이어: 시작포트(내컴퓨터)와 도착포트(웰노운-<잘 알려진 포트> 80포트)를 담는다.
인터넷 레이어: 나의 시작주소(내컴퓨터)와 도착주소(아직 몰라서 www.domain.com이라는 도메인 주소만 안다.)를 담는다. 하지만 아직 도착ip 를 모르기때문에 웹브라우저는 os에게 도메인의 ip주소를 알고싶다고 한다.
그래서 os는 dns에게 해당 도메인의 ip주소가 무엇인지 물어본다. 여기서 dns는 udp형식으로 ip주소를 전달해주는데 udp형식인 이유는 비연결형 프로토콜이기때문이다.
네트워크 엑세스 레이어: 여기서는 맥주소를 알아야한다.
먼저 우리집의 공유기(게이트웨이)의 맥주소를 알아내야되는데 여기서 ip를 맥주소로 바꿔주는 arp 주소해석 프로토콜을 사용하여 맥주소를 알아낸다.

여기서 데이터를 보내기전에 tcp는 연결지향형 프로토콜이기때문에 3 way handshaking이 필요하다.
1.먼저 클라이언트가 서버에게 너에게 데이터를 보낼예정이라는 syn을 보낸다.
2.서버는 클라이언트에게 알겠다는 ack을 보낸다.
3.클라이언트도 알겠다는 ack을 보낸다.

이제 개인ip->공용ip로(NAT) 변환하여 라우팅을 통해 구글 서버까지 도착한다.
여기서 마지막 라우터는 패킷에 ip헤더에 있는 ip를 arp 주소해석 프로토콜을 사용해서 맥주소를 만든다음 해당 맥주소의 서버를 찾는다.
그리고 해당 서버에 도착해서 트랜스포트 레이어에서는 도착 포트를 알고 있으니 해당 포트의 애플리케이션에게 전달받은 데이터를 전달한다.
tcp는 흐름,오류,혼잡 제어를 할 수 있기때문에 신뢰할수 있는 프로토콜이라고 불린다.

dynamodb의 특징
초당 수백만개 이상의 요청처리 가능하며, 오토스케일링에 용이, 읽기/쓰기 프로비저닝모드로 사용한만큼 금액을 청구할수 있음, 웹브라우저에서도 간단하게 관리가능, 
큰 DB에서 사용량을 할당받은만큼 제약이 있어 해당 limit을 넘어가게되면 쓰로틀링을 발생시켜 DB가 죽지 않게 할수 있음,
트랜잭션을 사용할수 있으나 특정조건이 필요하여 트랜잭션 기능을 일반 rdbms처럼 사용이 불가하다.

dynamodb의 단점
- 외래키 개념이 없어 쿼리를 두번 날려야되는 방법이 있다.
- 트랜잭션을 컨트롤할수 없다.
- aws sdk에 의존적이다.
- 소문자, 대문자를 구분한다.
- sql처럼 디테일한 조건문의 쿼리를 작성하기 어렵다.
hashKey(파티션키)-rangeKey(정렬키)인 기본키로 구성되며 그외엔 로우별로 항목들을 자유자재로 insert할 수 있다.
파티션키는 저장할 파티션이 나눠진다.
파티션키와 정렬키를 합치면 복합키가 된다.
한 테이블에서 파티션키는 중복할 수 없으며 중복시 엎어치기가 가능하다.그래서 정렬키를 추가하여 파티션키가 중복되어 엎어치는 현상을 막을 수 있다.
테이블별로 gsi는 20개, lsi는 5개를 생성할 수 있다.
lsi는 파티션키를 기본으로 생성되며 테이블 생성시점에 생성되며 lsi는 생성,삭제,변경이 불가하다.
gsi는 파티션키와 정렬키(옵션) 기반으로 생성되며 테이블 생성시점에 생성되며 gsi는 생성,삭제,변경이 불가하다.

장점
- 정형화되지 않은 데이터를 넣을 수 있다.
- 로우 쿼리를 날려도 혹은 데이터 양이 많으면 DB가 죽지않고 쓰로틀링을 발생시켜 에러를 발생시킨다.

웹서버와 웹 어플리케이션의 차이
웹서버는 정적인 페이지를 was를 거치지않고 요청한 컨텐츠를 전달 할수 있다.
was는 클아이언트 요청에 따라 db에 접근하여 동적인 컨텐츠를 전달 할수 있다.
결국 was의 컨텐츠도 웹서버를 통해 클라이언트에게 전달할수 있다.
근데 웹서버와 was를 분리하는 이유는 서버부하 방지, ssl를 통한 암호화를 웹서버에 부여, 로드밸런싱이 가능하여 무중단 배포가 가능, 여러 언어의 애플리케이션 구동 가능.

스프링 컨테이너에 빈을 찾는 방법과 컨테이너가 주입위치를 찾는 방법
AnnotationConfigApplicationContext 를 통해 스프링에서 주입한 빈 또는 직접 스프링에 주입한 빈을 찾을 수 있다.

rest api의 의미
어떤 uri에 어떤 http의 메소드를 사용할지에 대한 약속

일대다/다대일
인스타그램을 예로들면 유저 1명이 N개의 사진을 등록하면 일대다
반대로 사진 N개가 1명의 유저를 바라보면 다대일

오버로딩/오버라이딩

오버로딩: 과적의 의미로 파라미터만 달라지는것으로 메서드명은 같아야됨.

오버라이딩: 재정의의 의미로 부모 클래스로부터 상속받은 메서드를 재정의 하는 것