CORS란 무엇인지 아는 만큼 설명해주세요. *
Cross-Origin Resource Sharing, 다른 출처간에 리소스를 공유할 수 있도록 하는 것을 말하는데 출처는 보내고 받는 각각의 위치 즉 웹 사이트랑 API의 주소, 리소스는 주고 받아지는 데이터인데, 내가 만든 웹사이트와 네이버 지도 API, 서로 다른 출처끼리 정보 요청과 반환이 가능하도록 하는 것이 교차 출저 자원 공유 방식인 CORS이다.
RESTful이란 무엇인지 아는 만큼 설명해주세요. *
먼저 REST란, 클라이언트와 서버와의 통신 방식이고 RESTful은 REST가 적용된 시스템이며 REST API는 REST가 적용된 API이다. 즉 REST API를 제공하는 시스템이 RESTful이다.
HTTP 메서드와 이것이 하는 역할에 대해서 설명해주세요. *
HTTP 메서드는 클라이언트가 웹 서버에게 사용자 요청의 목적/종류를 알리는 수단이다.
HTTP Method는 크게 GET, POST, PUT, DELETE가 대표적인데, GET은 서버로부터 데이터를 취득하고 POST는 서버에 데이터를 추가, 작성하며, PUT은 서버의 데이터를 갱신, 수정 하며, DELETE는 서버의 데이터를 삭제합니다.
데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요. *
인덱스란, 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터 베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 인덱스의 가장 큰 특징은 데이터들이 정렬이 되어 있다는 점이다. 이 특징으로 인해 조건 검색이라는 영역에서 큰 장점이 된다. 단점으로는 인덱스 관리(정렬된 상태 유지) 를 위한 추가적 작업이 필요하고, 인덱스를 잘못 관리하면 오히려 성능이 저하된다.
트랜잭션에 대해서 설명해주세요. *
트랜잭션이란, DB의 상태를 변화시키기 위해 수행하는 작업의 단위를 뜻한다.
DB의 상태를 변화시킨다는 것은 SQL(SELECT, INSERT, DELETE, UPDATE)을 이용하여 데이터베이스를 접근하는 것을 의미한다. 이런 트랜잭션은 상황에 따라 여러 개가 만들어질 수 있는데, 그 하나의 트랜잭션은 Commit(저장) 되거나 Rollback(철회) 될 수 있다.
예를들어 A, B, C, D 가 문제를 풀어 각각 100 Point 씩 얻었고 이를 DB에 저장하려 한다.
A 저장 완료, B 저장 완료, C 저장 완료, D 저장 실패
이런 상황이 오게 된다면 잘못된 처리이므로 다시 저장을 수행해야 하는데, A, B, C는 그 전에 이미 저장이 완료되었기 때문에 다시 저장을 시작하면 200점이 저장된다.
이런 문제점들을 위해서 트랜잭션은 Commit 과 Rollback 을 이용한다.
JOIN에 대해서 설명해주세요. *
Join은 두 개 이상의 테이블에 대해서 결합하여 나타낼 때 Join이라는 것을 이용합니다.
관계형 데이터 베이스는 중복 데이터를 피하기 위해 데이터를 여러개의 테이블로 나눠서 저장한다. 이렇게 분리되어 저장된 데이터를 사용자가 원하게끔 다시 도출하기 위해서 여러 테이블을 조합해야할 때 SQL의 join을 통해 만들 수 있다.
RDBMS vs NOSQL에 대해서 설명해주세요. *
RDBMS : 엑셀의 형식과 유사한 2차원 테이블 형식으로 구성되며 속성과 값을 이용하여 데이터를 정의하고 저장 관리 한다. 각각의 속성과 값을 가진 테이블들은 서로 관계를 맺으며 존재한다.
NOSQL : RDBMS와 반대되는 방식을 사용하며, 데이터 테이블 간의 관계를 정의하지 않는다. RDBMS의 복잡도와 용량 한계를 극복하기 위한 목적으로 등장한 만큼 RDBMS에 비해 훨씬 더 대용량의 데이터를 저장할 수 있다.
(자바 배열이 아님)배열과 링크드 리스트의 차이를 설명해주세요. *
배열(Array) : 배열은 데이터를 논리적 순서에 따라 순차적으로 데이터를 입력하며, 물리적 주소 또한 순차적이다. 그리고 인덱스를 가지고 있어서 원하는 데이터를 한번에 접근이 가능하기에 데이터 접근 속도가 매우 빠르나, 배열은 데이터의 삽입/삭제에는 취약하다. 배열 특성상 데이터 삽입/ 삭제가 이루어지면 삽입/삭제가 이루어진 다음부터 모든 데이터의 위치를 변경해야하기 때문이다.
연결리스트(LinkedList) : 연결리스튼 데이터를 논리적 순서에 따라 데이터를 입력한다. 하지만 물리적 주소는 순차적이지 않다. 인덱스를 가지고 있는 배열과는 달리 연결리스트는 인덱스 대신 현재 위치의 이전 및 다음 위치를 기억하고 있다. 때문에 한번에 데이터 접근이 가능하지 않고 연결되어 있는 링크를 따라가야만 접근이 가능하고, 배열에 비해 속도가 떨어진다. 하지만 데이터 삽입/삭제는 논리적 주소만 바꿔주면 되기 때문에 데이터 삽입/삭제는 용이하다.
JWT에 대해서 간단히 설명해주세요. *
JWT는 Json Web Token의 약자로, 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미하고 Token의 한 형식이다.(과일)
OAuth에 대해서 간단히 설명해주세요. *
OAuth는 제3자 인증방식 기본적으로 사용자는 서버를 신뢰할 수 없고, 서버 역시 사용자의 민감한 정보를 관리하는 것은 리소스가 필요함. 그래서 OAuth를 사용해서 신뢰할 수 있는 서버에게 정보를 맡겨놓고 접근할 수 있는 권한을 주는 것, 하나의 Framework이다.(과일 상자)
JWT와 OAuth의 차이는 무엇이 있을까요? *
OAuth에서 나온 OAuth Token은 어떠한 사용자의 정보 등과 같은 중요한 정보가 있는 명확한 정보를 가지고 있는 토큰이 아니지만 JWT는 모호한 토큰이 아니고 명확한 정보를 가지고 있다.
JVM의 구조와 Java의 실행방식을 설명해주세요. *
JVM : JVM은 Java Virtual Machine의 약자로, 자바 가상 머신이라고 부릅니다. 그리고 자바와 운영체제 사이에서 중개자 역할을 수행하며, 자바가 운영체제에 구애 받지 않고 프로그램을 실행할 수 있도록 도와준다.
JVM의 구조는 크게 Garbage Collector, Execution Engine, Class Loader, Runtime Data Area로, 4가지로 나눌 수 있다.
자바의 실행 과정
1. 자바 컴파일러를 통해 자바 클래스 파일(.java)를 자바바이트코드(.class)로 변환한다.
2. 클래스 로더를 통해 자바 바이트코드를 JVM 런타임 데이터 역역에 로드한다.
3. 실행 엔진을 통해 실행한다.
제네릭에 대해서 설명해주세요. *
파라미터 타입이나 리턴 타입에 대한 정의를 외부로 미루며, 타입에 대해 유연성과 안전성을 확보하고 런타임 환경에 아무런 영향이 없는 컴파일 시점의 전처리 기술이다.
타입을 유연하게 처리하며 런타임에 발생할 수 있는 타입에러를 컴파일전에 검출한다.
애노테이션에 대해서 설명해주세요. *
@를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여한 것
컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보를 추가하는 정형화된 방법.
ex) @Repository, @Service, @Controller, @Autowired
오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요? *
오버로딩, overload는 무엇인가를 많이 더한다는 뜻이다. 즉 프로그래밍에서의 '오버로딩' 은 같은 이름의 메서드에 다른 변수를 더한 메서드를 만든다는 의미입니다.
오버라이딩, 부모클래스에서 정의된 메서드를 자식 클래스에서 같은 이름의 메서드로 다시 정의하는 것을 '오버라이딩' 이라고 합니다.
인터페이스와 추상클래스의 차이점에 대해 설명해주세요. *
추상 클래스는 extends(상속, 확장의 느낌) 키워드 그대로 자신의 기능들을 하위로 확장시키는 것으로 볼 수 있다.
인터페이스는 implements(상속, 구현의 느낌) 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 동일한 기능으로 구현하는 것으로 불 수 있다.
정리하자면 자바의 특성상 한 개의 클래스만 상속이 가능하기 떄문에 해당 클래스의 구분을 추상 클래스 상속을 통해서 해결하고, 할 수 있는 공통된 기능들을 인터페이스의 다중 상속을 통해 구현 합니다.
객체지향에 대해서 설명해주세요. *
객체지향이란 현실에 존재하는 사물과 개념들을 소프트웨어적으로 구현하고, 그 구현된 객체들이 상호작용하여 데이터를 처리하는 방식이다.
객체지향 언어의 특징은 첫째, 코드의 재사용성입니다. 새로운 코드를 작성할 때 기존의 코드를 이용하여 코드의 수를 줄이고 유지보수에도 편리합니다.
둘째, 신뢰성 높은 프로그래밍입니다. 제어자와 메소드를 사용해서 데이터를 보호하고 코드의 중복을 제거하여 오동작을 방지합니다.
셋째, 코드 관리의 편리함입니다. 객체지향 프로그래밍은 한 부분만 변경하면 관련된 모든 부분이 변경됩니다.
클래스란 클래스에는 객체의 속성과 기능들이 정의되어 있고 이를 통해서 객체를 생성합니다.
객체 곧 인스턴스는 클래스를 통해 만들어진 형태입니다.
Spring DI/IoC는 어떻게 동작하나요? *
IoC(Inversion of Control: 제어의 역전) 은 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것으로 코드의 최종 호출은 개발자가 제어하는 것이 아닌 프레임워크의 내부에서 결정된 대로 이루어집니다.
DI(Dependency Injection: 의존관계 주입) 은 스프링 프레임워크에서 지원하는 IoC의 형태로 클래스 사이의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해줍니다.
IoC 컨테이너의 역할은 무엇이 있을까요? *
IoC 컨테이너는 설정 정보를 기반으로 POJO 객체들을 생성 및 관계 설정 후 메모리상에 인스턴스화되며, 개발자는 IoC 컨테이너에서 POJO 객체를 손쉽게 얻어와서 사용할 수 있다.
DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요? *
DI의 종류는 Setter Injection, Constructor Injection, Method Injection 이 있다.
Setter Injection 은 의존성을 입력 받는 Setter 메서드를 만들고 이를 통해 의존성 주입
Constructor Injection 은 필요한 의존성을 포함하는 클래스의 생성자를 만들고 이를 통해 의존성을 주입
Method Injection 은 의존성을 입력 받는 일반 메서드를 만들고 이를 통해 의존성을 주입
Spring Web MVC의 Dispatcher Servlet의 동작 원리에 대해서 간단히 설명해주세요. *
Spring Web MVC 동작 원리
1. 클라이언트가 요청한 URL을 DispatcherServlet이 가로챈다.
2. 가로챈 정보를 HandlerMapping에게 보내 요청을 처리할 수 있는 Controller를 찾아낸다.
3. 요청을 찾은 컨트롤러에게 보낸다. (컨트롤러 → 개발자 구현 영역)
4. 컨트롤러에서 해당 요청 처리 후 요청을 응답받을 View의 이름을 리턴. 이 이름을 ViewResolver가 먼저 받아 해당하는 View가 있는지 검색
5. 해당 View가 존재한다면 처리결과를 View에 보낸 후 결과를 다시 DispatcherServlet에게 전달. DispatcherServlet은 최종 결과를 클라이언트에게 전송
Dispatcher Servlet의 동작 원리
1. HTTP 요청을 DispatcherServlet 이 받는다.
2. DispatcherServlet이 Controller에 요청을 보낸다.
3. Controller는 Model에 받은 요청을 보낸다.
4. Controller는 다시 DispatcherServlet 에 모델과 뷰를 보여준다.
5. DispatcherServlet는 Model을 참고하고 View를 생성한다.
6. HTTP 응답.
Autowiring 과정에 대해서 설명해주세요. *
컨테이너에서 타입(인터페이스 또는 오브젝트)을 이용해 의존 대상 객체를 검색하고, 할당할 수 있는 빈 객체를 찾아 주입한다.