스프링 배치 면접 질문 - seupeuling baechi myeonjeob jilmun

1.java의 특징
- jvm라는 것으로 인하여 이식성이 높은 언어이다
- 객체 지향 언어이다
- 멀티스레드를 쉽게 구현할 수 있다
- 오픈소스 라이브러리가 풍부하다
- 메모리를 자동으로 관리한다

2.java8의 특징
- lambda와 stream이 추가되었다.
- time 패키지 추가되었다
- 이전까진 parallel GC 를 사용하였으나 g1 gc를 쓰기 시작.

3.lambda란
- 익명 함수를 단순화한 것이라고 할 수 있다
- 코드의 라인수가 줄어든다 
- 재귀 람다식의 호출이 까다롭다

4.stream이란
- 컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능
- 일반 for문 보다 성능이 떨어진다.

6.jvm이란
- 자바 가상 머신으로 자바 바이트 코드를 실행할 수 있는 주체다

7.jvm구조 및 역활
- Class Loader : runtime시 jvm에 jar안에 있는 클래스들을 로드하고 사용하지 않는 것은 삭제. 
- Execution Engine : 클래스를 실행 시킨다. 
- Garbage Collector : Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다.
- Runtime Data Area : jvm메모리 영역으로 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack으로 나뉨

8.gc란
- Garbage Collector(GC)는 Heap 메모리 영역에 생성(적재)된 객체들 중에 참조되지 않는 객체들을 탐색 후 제거하는 역할을 한다
- jvm메모리 구조중 힙 영역은 좀 더 살펴봐야하는데 그 이유는 GC의 주요 대상이기 때문이다. (Stack영역과 Method영역도 GC의 대상이 됨.)

9.gc의 구조 및 역활
- Old Generation 과 Young Generation 으로 구성
- younGeneration 
: 생명 주기가 짧은 “젊은 객체”를 GC 대상으로 하는 영역이다.
: Eden과 두개의 Survivor Space로 구성 
: 새로 생성한 대부분의 객체는 Eden 영역에 위치한다.
: Eden 영역에서 GC가 발생하면 이미 살아남은 객체가 존재하는 Survivor 영역으로 객체가 계속 쌓인다
: 하나의 Survivor 영역이 가득 차게 되면 그 중에서 살아남은 객체를 다른 Survivor 영역으로 이동한다. 그리고 가득 찬 Survivor 영역은 아무 데이터도 없는 상태로 된다
: 이 과정을 반복하다가 계속해서 살아남아 있는 객체는 Old 영역으로 이동하게 된다
: 객체가 생성될 때 저장
: 우선순위가 낮아지면 Young 세대의 객체들은 Old세대로 이동
: 이 영역에서 객체가 사라질 때는 Minor GC 수행
- Old Generation
: Young Generation 영역에 있는 객체가 오래되서 저장되는 공간이다.
: 이 영역에서 객체가 사라질 때는 Major GC(Full GC) 수행

10.old 영역 gc방식의 종류
- Serial GC (-XX:+UseSerialGC)
: 운영 서버에서 절대 사용하면 안 되는 방식이 Serial GC다. Serial GC는 데스크톱의 CPU 코어가 하나만 있을 때 사용하기 위해서 만든 방식이다
: Old 영역의 GC는 mark-sweep-compact이라는 알고리즘을 사용한다. 이 알고리즘의 첫 단계는 Old 영역에 살아 있는 객체를 식별(Mark)하는 것이다. 
그 다음에는 힙(heap)의 앞 부분부터 확인하여 살아 있는 것만 남긴다(Sweep). 
마지막 단계에서는 각 객체들이 연속되게 쌓이도록 힙의 가장 앞 부분부터 채워서 객체가 존재하는 부분과 객체가 없는 부분으로 나눈다(Compaction).
Serial GC는 적은 메모리와 CPU 코어 개수가 적을 때 적합한 방식이다
- Parallel GC (java7 기본 gc)(-XX:+UseParallelGC)
: Parallel GC는 Serial GC와 기본적인 알고리즘은 같다
: 그러나 Serial GC는 GC를 처리하는 스레드가 하나인 것에 비해, Parallel GC는 GC를 처리하는 쓰레드가 여러 개이다
: Parallel GC는 메모리가 충분하고 코어의 개수가 많을 때 유리하다. Parallel GC는 Throughput GC라고도 부른다
- Parallel Old GC (java5에 최초공개) (-XX:+UseParallelOldGC)
: Parallel GC와 비교하여 Old 영역의 GC 알고리즘만 다르다
: 이 방식은 Mark-Summary-Compaction 단계
: Summary 단계는 앞서 GC를 수행한 영역에 대해서 별도로 살아 있는 객체를 식별한다는 점에서 Mark-Sweep-Compaction 알고리즘의 Sweep 단계와 다르며, 약간 더 복잡한 단계를 거친다.
- CMS GC (-XX:+UseConcMarkSweepGC)
: 초기 Initial Mark 단계에서는 클래스 로더에서 가장 가까운 객체 중 살아 있는 객체만 찾는 것으로 끝낸다. 따라서, 멈추는 시간은 매우 짧다. 
: Concurrent Mark 단계에서는 방금 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인한다. 
이 단계의 특징은 다른 스레드가 실행 중인 상태에서 동시에 진행된다는 것이다.
: 그 다음 Remark 단계에서는 Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인한다. 
: Concurrent Sweep 단계에서는 쓰레기를 정리하는 작업을 실행한다. 이 작업도 다른 스레드가 실행되고 있는 상황에서 진행한다.
: 이러한 단계로 진행되는 GC 방식이기 때문에 stop-the-world 시간이 매우 짧다
: 다른 GC 방식보다 메모리와 CPU를 더 많이 사용한다
: Compaction 단계가 기본적으로 제공되지 않는다.
- G1 GC (-XX:+UseG1GC)
: G1 GC를 이해하려면 지금까지의 Young 영역과 Old 영역에 대해서는 잊는 것이 좋다.
: G1 GC는 바둑판의 각 영역에 객체를 할당하고 GC를 실행한다. 그러다가, 해당 영역이 꽉 차면 다른 영역에서 객체를 할당하고 GC를 실행한다. 
즉, 지금까지 설명한 Young의 세가지 영역에서 데이터가 Old 영역으로 이동하는 단계가 사라진 GC 방식이라고 이해하면 된다. 
G1 GC는 장기적으로 말도 많고 탈도 많은 CMS GC를 대체하기 위해서 만들어 졌다
: 지금까지 설명한 어떤 GC 방식보다도 빠르다. 하지만, JDK 6에서는 G1 GC를 early access라고 부르며 그냥 시험삼아 사용할 수만 있도록 한다. 그리고 JDK 7에서 정식으로 G1 GC를 포함하여 제공한다

11.gc모니터링 방법
- GC 모니터링 방법은 접근 인터페이스에 따라 CUI와 GUI로 구분할 수 있다
- 대표적인 CUI GC 모니터링 방법에는 'jstat'이라는 CUI 애플리케이션을 이용하는 방법과 JVM을 가동할 때 '-verbosegc'라는 JVM 옵션을 이용하는 방법이 있다
- GUI GC 모니터링 방법은 별도의 GUI 애플리케이션을 이용한다. 대표적인 GUI 애플리케이션 세 가지를 꼽으라면 'jconsole', 'jvisualvm', 'Visual GC'를 들 수 있다

12.쓰레드와 프로세스의 차이
- 쓰레드는 프로세스에서 나뉘는 것, 
- 프로세스는 하나의 실행 단위

13.쓰레드 순서방식
- 우선순위주기
- sleep이나 wait등으로 바꾸기
- 싱크로나이즈 하여 동기화 하기

14.쓰레드 세이프
- 공유자원에 대하여 안정성이 보장되지 않아 결착 상태가 발생하는 것을 방지
- 공유자원을 동기화 하거나 새 인스턴스를 생성하여 처리

15.spring이란, 스프링 장점
- pojo기반의 자바 엔터프라이즈 개발을 편하게 해주는 오픈소스 경량급 애플리케이션 프레임워크
- di지원
: 의존성주입, 재사용율을 높여주며 겹할도를 낮추고 캡슐화를 도움
- ioc컨테이너 기반
: ioc란 역전의제어이며 컨테이너란 row-레벨 기능들을 자동으로 수행하는데 도와준다.
- aop지원
: 관점지향 프로그래밍
: Aspect,어드바이스, 포인트컷, 조인포인트 등등으로 구성
: aspect - 애스펙트는 부가될 기능을 정의한 어드바이스와 어드바이스를 어디에 적용할지를 결정하는 포인트컷을 함께 갖고 있습니다
: 어드바이스 - 실질적으로 부가기능을 담은 구현체
: 포인트컷 - 부가기능이 적용될 대상(메소드)를 선정하는 방법
: 조인포인트 - 어드바이스가 적용될 수 있는 위치

16.spring boot란
- 스프링 부트의 핵심은 메이븐은 pom.xml, 그레이들은 build.gradle 파일 내용에 따라 클래스 패스, 어노테이션, 기타 자바구성클래스를 보고 자동구성
- 내장서버 포함
- 제공되는 어노테이션으로 설정을 자동으로 수행

17.스프링 트랜잭션 속성
- 격리레벨(isolation)
DEFAULT
: DB 설정, 기본 격리 수준(기본설정), db설정따름
SERIALIZABLE 
: 가장 높은 격리, 성능 저하의 우려가 있음, (phantom read 방지)
: 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
: 데이터의 일관성 및 동시성을 위해 MVCC(Multi Version Concurrency Control)을 사용하지 않음
: (MVCC는 다중 사용자 데이터베이스 성능을 위한 기술로 데이터 조회 시 LOCK을 사용하지 않고 데이터의 버전을 관리해 데이터의 일관성 및 동시성을 높이는 기술)
READ_UNCOMMITED 
: 커밋되지 않는 데이터에 대한 읽기를 허용, (dirtyread 발생가능)
READ_COMMITED 
: 커밋된 데이터에 대해 읽기 허용, (dirtyread 방지)
REPEATEABLE_READ 
: 동일 필드에 대해 다중 접근 시 모두 동일한 결과를 보장 (Non-Repeatable Read방지)
: 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 shared lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능하다.
- propagation (전파속성)
PROPAGATION_MANDATORY : 작업은 반드시 특정한 트랜잭션이 존재한 상태에서만 가능
PROPAGATION_NESTED : 기존에 트랜잭션이 있는 경우, 포함되어서 실행
PROPAGATION_NEVER : 트랜잭션 상황에 실행되면 예외 발생
PROPAGATION_NOT_SUPPORTED : 트랜잭션이 있는 경우에는 트랜잭션이 끝날 때까지 보류된 후 실행
PROPAGATION_REQUIRED : 트랜젝션이 있으면 그 상황에서 실행, 없으면 새로운 트랜잭션 실행(기본설정)
PROPAGATION_REQUIRED_NEW : 대상은 자신만의 고유한 트랜잭션으로 실행
PROPAGATION_SUPPORTS : 트랜젝션을 필요료 하지 않으나, 트랜잭션 상황에 있다면 포함되어서 실행
- readOnly 속성
: true인 경우 insert, update, delete 실행 시 예외 발생, 기본 설정은 false
- rollbackFor 속성
: 특정 예외가 발생 시 강제로 Rollback
- noRollbackFor 속성
: 특정 예외의 발생 시 Rollback 처리되지 않음
- timeout 속성
: 지정한 시간 내에 해당 메소드 수행이 완료되이 않은 경우 rollback 수행. -1일 경우 no timeout(Default=-1)

18.트랜잭션 발생시 문제 요소
- dirty read
: 트랜잭션 A가 어떤 값을 1에서 2로 변경하고 아직 커밋하지 않은 상황에서 트랜잭션B가 같은 값을 읽는 경우 트랜잭션 B는 2가 조회 된다.
: 트랜잭션 B가 2를 조회 한 후 혹시 A가 롤백된면 결국 트랜잭션B는 잘못된 값을 읽게 된 것이다. 즉, 아직 트랜잭션이 완료되지 않은 상황에서 데이터에 접근을 허용할 경우 발생할 수 있는 데이터 불일치이다.
- no repeatable read
: 트랜잭션 A가 어떤 값 1을 읽었다. 이후 A는 같은 쿼리를 또 실행할 예정인데, 그 사이에 트랜잭션 B가 값 1을 2로 바꾸고 커밋해버리면 A가 같은 쿼리 두번을 날리는 사이 두 쿼리의 결과가 다르게 되어 버린다.
: 즉, 한 트랜잭션에서 같은 쿼리를 두번 실행했을 때 발생할 수 있는 데이터 불일치이다.
- phantom read
: 트랜잭션 A가 어떤 조건을 사용하여 특정 범위의 값들[0,1,2,3,4]을 읽었다.
: 이후 A는 같은 쿼리를 실행할 예정인데, 그 사이에 트랜잭션 B가 같은 테이블에 값[5,6,7]을 추가해버리면 A가 같은 쿼리 두번을 날리는 사이 두 쿼리의 결과가 다르게 되어 버린다.
: 즉, 한 트랜잭션에서 일정 범위의 레코드를 두번 이상 읽을 때 발생하는 데이터 불일치이다.

19.스프링 3과 4의 차이
- jdk8지원
- html5웹소켓 지원
- @RestController에 @ResponseBody포함

20.sql mapper와 orm mapper와
- sql mapper
: sql 명시
: sql 문법에 종속적
: 대표적으로 mybatis
- orm mapper
: sql 문법에 종속되지 않음.
: 객체지향 프로그래밍 가능
: 대표적으로 jpa

21.http 상태코드
- 200
: 정상처리, 성공의 의미는 HTTP 메소드에 따라 달라집니다:
GET: 리소스를 불러와서 메시지 바디에 전송되었습니다.
HEAD: 개체 해더가 메시지 바디에 있습니다.
PUT 또는 POST: 수행 결과에 대한 리소스가 메시지 바디에 전송되었습니다.
TRACE: 메시지 바디는 서버에서 수신한 요청 메시지를 포함하고 있습니다.
- 201 Created
: 요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었습니다. 
: 이 응답은 일반적으로 POST 요청 또는 일부 PUT 요청 이후에 따라옵니다
(클라이언트 에러 응답)
- 400 Bad Request
: 이 응답은 잘못된 문법으로 인하여 서버가 요청을 이해할 수 없음을 의미합니다.
- 401 Unauthorized
: 비록 HTTP 표준에서는 "미승인(unauthorized)"를 명확히 하고 있지만, 의미상 이 응답은 "비인증(unauthenticated)"을 의미합니다. 
클라이언트는 요청한 응답을 받기 위해서는 반드시 스스로를 인증해야 합니다.
- 403 Forbidden
: 클라이언트는 콘텐츠에 접근할 권리를 가지고 있지 않습니다. 
예를들어 그들은 미승인이어서 서버는 거절을 위한 적절한 응답을 보냅니다. 
401과 다른 점은 서버가 클라이언트가 누구인지 알고 있습니다. 
- 404 Not Found
: 서버는 요청받은 리소스를 찾을 수 없습니다. 브라우저에서는 알려지지 않은 URL을 의미합니다. 
- 405 Method Not Allowed
: 요청한 메소드는 서버에서 알고 있지만, 제거되었고 사용할 수 없습니다. 예를 들어, 어떤 API에서 리소스를 삭제하는 것을 금지할 수 있습니다
(서버 에러 응답)
- 500 Internal Server Error
: 서버가 처리 방법을 모르는 상황과 마주쳤다. 서버는 아직 처리 방법을 알 수 없다.
- 503 Service Unavailable
: 서버가 요청을 처리할 준비가 되지 않았다. 일반적인 원인은 유지보수를 위해 작동이 중단되거나 과부하가 걸린 서버다

22.Spring Batch와 Spring Quartz
- Quartz는 스케줄러의 역할이지, Batch 와 같이 대용량 데이터 배치 처리에 대한 기능을 지원하지 않습니다
- 반대로 Batch 역시 Quartz의 다양한 스케줄 기능을 지원하지 않아서 보통은 Quartz + Batch를 조합해서 사용합니다.

23.html5 특징
- video&Audio api 추가
- offline web apllication 추가
- 편집 api 추가 등등
- 구조를 기술하기 위한 신규태그들
section: 문서의 섹션을 의미하며 문서의 구조를 기술하기 위해서 h2, h2, h3, h4, h5, h6 요소를 함께 사용해야 한다.
article: 블로그 글이나 신문 기사와 같이 독립적인 문서를 의미한다.
main: HTML5, HTML5.1에서는 한 문서에 하나만 쓸 수 있으며 페이지의 본문같이 주요 내용을 포함하는 요소로 사용할 수 있다.
aside: 본문페이지와 연관이 작은 추가적인 콘텐츠를 의미한다.
hgroup: 섹션의 헤더를 의미한다.
header: 소개나 네비게이션 영역을 나타낸다.
footer: 섹션의 푸터를 의미하며 저자나 저작권등의 정보를 표시한다.
nav: 네비게이션을 위한 섹션을 의미한다.
figure: 본문에서 참조할 수 있는 독립적인 사진과 같은 콘텐츠를 의미한다. figcaption 요소를 선택적으로 캡션으로 사용할 수 있다.
template: 스크립트에서 활용할 수 있는 HTML 조각을 선언하는데 사용한다.
- 새용도의 태그
video, audio: 멀티미디어 콘텐츠를 사용하기위한 요소이고 API를 제공하여 콘텐츠를 제어할 수 있도록 하고 있다. 브라우저도 제어를 위한 인터페이스를 제공한다. 여러 타입의 원본을 제공하려면 source 요소를 이용할 수 있다.
track: video 요소의 텍스트 트랙을 나타낸다.
embed: 플러그인 콘텐츠를 표현한다.
mark: 참조를 위한 표시를 하기 위해 사용한다.
progress: 진행상황을 표기하기 위해 사용한다.
meter: 측정값을 표시하기 위해 사용한다.
time: 날짜나 시간을 표시하기 위해 사용한다.
data: 기계가 읽어들이는 데이터를 표시한다(WHATWG HTML, HTML5.1).
dialog: 다이얼로그를 표시한다(WHATWG HTML).
ruby, rt, rp: 루비 표현을 위해 사용한다.
bdi: 좌에서 우, 우에서 좌로 기술되는 언어를 표기할 때 사용한다.
wbr: 개행을 할 수 있다는 표시를 할 때 사용한다.
canvas: 비트맵 그래픽을 표현하기 위해서 사용한다.
command: 팝업 메뉴에서 사용자가 실행할 수 있는 명령을 나타낸다.
details: 사용자의 인터랙션에 의해서 보여지는 추가적인 정보나 컨트롤을 나타낸다. summary 요소를 사용해서 요약이나 범례, 캡션을 나타낼 수 있다.
datalist: input 요소의 list 속성으로 연결해서 콤보박스를 표현한다.
keygen: 생성된 키 쌍을 나타낸다.
output: 출력내용을 표현한다.

24.es6 특징
- let, const 키워드 추가
: var, let는 변수를 선언하는 키워드이고, const는 상수를 선언하는 키워드이다.
: let, const 키워드는 block-scoped, 즉 블록(중괄호) 내부에 let, const 키워드로 선언된 변수는 외부 스코프에 영향을 주지 않는다.
- Arrows추가 : 람다와 비슷
- iterator / generator 추가
- module import / export 추가
- Promise 도입
: 실행할 필요가 있는 경우에 비동기 처리를 중첩시켜서 표현하므로 에러, 예외처리가 어렵다는 것과 중첩으로 인한 복잡도가 증가하는 것이 이다
: 크게 이 두 가지의 단점을 해결하기위해 프로미스가 예전부터 라이브러리로 생겨났고, 이것을 ES6에서는 언어적 차원에서 지원하게 되었다.
: 즉 실행 순서를 보장해 주는 기술
- Map + Set + WeakMap + WeakSet
: 일반 알고리즘을 위한 효율적인 데이터 구조를 제공합니다. 
: WeakMap과 WeakSet는 메모리 누수로 부터 자유롭게 해줍니다. 이들 내 저장된 객체에 다른 참조가 없는 경우, garbage collection 될 수 있습니다.

25.쿠키와 세션
- 쿠키와 세션은 위의 HTTP 특징을 해결하기 위해, 즉 클라이언트를 인증을 유지하기 위해 사용합니다.
(HTTP 프로토콜이 connectionless,  stateless한 특성, 통신 후 상태 유지도 안하며 끊어버림.)
- 쿠키
: 클라이언트 측(브라우저)에서 관리되는 작은 기록 정보 파일을 의미합니다
: 이름, 값, 유효시간, 도메인, 경로로 구성
- 세션
: 쿠키를 기반으로 하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리합니다
: 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지합니다.
: 사용자에 대한 정보를 서버에 저장하기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 됩니다.

26.was와 웹서버 차이
- Was
: DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server
- WebServer
: 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html .jpeg .css 등)를 제공하는 컴퓨터 프로그램

27.tomcat 설정
- conf에 위치
- server.xml이 초기 구동시 필요한 설정들을 생성한다.
- https, session clustering, host설정, tomcat압축설정 등등 설정 가능

28.tomcat session clustering
- multicast 방식으로 동작
- was간 세션을 공유, header에 같은 세션id가 공유된다.

29.로컬스토리지 세션스토리지 쿠키
- 로컬 스토리지와 세션 스토리지는 HTML5 추가된 저장소
- 로컬 스토리지의 데이터는 사용자가 지우지 않는 이상 계속 브라우저에 남아 있습니다. 하지만 세션 스토리지의 데이터는 윈도우나 브라우저 탭을 닫을 경우 제거
- 쿠키는 4096bytes 이하의 저장공간을 허용, 로컬 저장소는 약 5MB의 공간을 허용
- 쿠키는 서버측과 클라이언트측 양쪽에서 쿠키 데이터를 사용하는 api가 존재, 이와 달리 localStorage는 로컬 환경에서만 컨트롤
- 쿠키는 서버측으로 전달되며, 로컬스토리지와 세션스토리지는 서버측으로 전달되지 않는다.

30.h2 db
- 자바 기반의 오픈소스 관계형 데이터 베이스 관리 시스템(RDBMS )입니다.
- 서버(Server) 모드와 임베디드(Embedded) 모드의 인메모리 DB 기능을 지원
- DB자체가 매우 가볍기 때문에 매우 가볍고 빠르며, JDBC API 또한 지원
- SQL 문법은 다른 DBMS들과 마찬가지로 표준 SQL의 대부분이 지원
- 어플리케이션 개발 단계의 테스트 DB로서 많이 이용

31.no sql
- 관계형 모델을 사용하지 않으며 테이블간의 조인 기능 없음
- 관계형 데이터베이스에서는 지원하는 Data처리 완결성(Transaction ACID 지원) 미보장
- 직접 프로그래밍을 하는 등의 비SQL 인터페이스를 통한 데이터 액세스
- 초고용량 데이터 처리 등 성능에 특화된 목적을 위해, 비관계형 데이터 저장소에, 비구조적인 데이터를 저장하기 위한 분산 저장 시스템

32.jpa와 하이버네이트
- JPA는 ORM을 사용하기 위한 인터페이스를 모아둔 것
- JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.