카테고리 없음

기술면접_JAVA_Spring

답답코더 2021. 8. 12. 20:36

OOP (Object Oriented Programming 객체지향 프로그래밍)

데이터를 객체로 취급하여 프로그램에 반영하고, 순차적으로 프로그램이 동작하는 것과는 다르게 객체의 상호작용을 통해 프로그램이 동작하는 것을 말합니다.

객체를 연결시켜 프로그래밍하면 상속, 캡슐화, 다형성을 이용해 코드 재사용을 증가시키고, 유지보수를 감소시켜주는 장점이 있습니다.

AOP (Aspect Orient Programming 관점 지향 프로그래밍)

한 어플리케이션 내의 다양한 모듈에서 로그, 권한체크, 인증 등 공통적으로 이용되는 기능을 분리시켜 사용하는 것입니다. 기능을 비지니스 로직과 공통 모듈로 구분한 후에 개발자의 코드 밖에서 필요한 시점에 비지니스 로직에 삽입하여 실행되도록 합니다

자바란 무엇인가?

자바란 운영체제와 플랫폼에 독립적인 실행이 가능한 프로그래밍 언어입니다. 이러한 특성 덕분에 웹 어플리케이션에 많이 사용되고 있습니다.

자바의 메모리 영역

- 메서드 영역 : static 변수, 전역 변수, 코드에서 사용되는 클래스 정보들이 올라갑니다. 코드에서 사용되는 클래스들을 로더가 읽고 클래스 별로 분류해서 저장합니다.
- 스택(Stack) : 지역 변수, 메서드 등이 할당되는 LIFO 방식의 메모리입니다.
- 힙(Heap) : new 연산자를 통해 동적할당된 객체들이 저장되고, 메모리는 가비지 컬렉션에 의해 관리됩니다.

인터페이스(interface) / 추상클래스(abstract)

인터페이스는 모든 메서드가 추상 메서드로 이루어진 클래스입니다. 특징으로는 따로 abstract를 쓰지 않아도 모두 추상 메서드로 정의가 되구요. 선언한 변수는 자동으로 final static 키워드가 붙습니다.

사용하는 이유는 예를 들면.. 인터페이스는 팀 작업을 할 때 개발코드와 객체가 서로 통신하는 접점 역할을 지원합니다. 개발코드에서는 객체의 내부 구조를 모르더라도 인터페이스의 메서드 명만 알면 다른 팀의 작업을 기다리지 않아도 됩니다. 또한 해당 객체가 수정이 되더라도, 개발 코드 부분은 수정하지 않아도 되는 장점도 있습니다. 이처럼 인터페이스를 통해 팀 단위로 큰 프로젝트를 효율적으로 진행할 수 있습니다.

abstract는 추상 메서드를 하나 이상 가진 클래스이며, 자신의 생성자로 객체 생성이 불가능합니다. 하위 클래스를 참조해 상위 클래스의 객체를 생성하여 하위 클래스를 제어하기 위해 사용합니다.

 

메모리 상수풀 영역

힙 영역에서 생성되고 자바 프로세스 종료까지 계속 유지되는 메모리 영역입니다. 기본적으로 JVM에서 관리하고 있구요. 프로그래머가 작성한 상수에 대해 최우선으로 찾아보고 없으면 상수풀에 추가한 후 그 주소값을 리턴해줍니다. 이로써 메모리 절약 효과를 가져올 수 있습니다.

 jdbc가 무엇인가요?

자바에서 데이터베이스를 접속할 수 있도록 해주는 자바 API입니다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트 하는 방법들을 제공합니다.

직렬화란 ?

자바에서 입출력에 사용되는 것은 스트림이라는 데이터 통로를 통해 이동합니다. 하지만 객체는 바이트형이 아니기 때문에 스트림을 통해서 저장하거나 네트워크로 전송하는 것이 불가능합니다. 따라서 객체를 스트림으로 입출력하기 위해서 바이트 배열로 변환하는 것을 직렬화라고 합니다.

반대로 스트림으로 받은 직렬화된 객체를 다시 원래로 돌리는 건 역직렬화라고 말합니다.

serialVersionUID를 선언해야 하는 이유?

JVM은 직렬화나 역직렬화를 하는 시점의 클래스에 대해 version 번호를 부여합니다. 그런데 만약 이 시점에서 클래스의 정의가 바뀌게 되면, version 번호도 새롭게 할당해주는데요. 직렬화와 역직렬화의 version 번호가 서로 다르면 안되기 때문에 serialVersionUID를 선언해서 문제를 해결할 수 있습니다.

즉, 클래스 버전이 맞는지 확인하기 위한 용도로 사용된다고 말씀드릴 수 있습니다.

리플렉션이란

리플렉션은 컴파일러를 무시한 채 런타임 상황에서 메모리에 올라간 클래스나 메서드 등의 정의를 동적으로 찾아 조작할 수 있는 행위를 말합니다.

즉, 동적인 언어가 가진 특징이라고 볼 수 있고 프레임워크에서 유연성이 있는 동작을 위해 자주 사용됩니다.

static 키워드

static이란 자바에서 클래스 변수와 메서드를 선언하는 키워드로 인스턴스가 생성될 때 마다 새롭게 메모리 공간이 할당되는 것이 아니라 클래스가 로딩되는 시점에 메소드 area에 공간을 할당받게 되어 인스턴스화 하지 않아도 하나의 변수와 메서드를 공유해서 사용하게 됩니다.

접근제어자

자바의 접근제어자는 (public > protected > default > private)이 존재합니다.

접근제어자는 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 정도를 지정하는 방법으로 캡슐화나 디자인패턴을 구현할 때 사용할 수 있습니다.

- public 접근 제한이 없다.(같은 프로젝트 내에 어디서든 사용가능)

- protected 같은 패키지 내다른 패키지에서 상속받아 자손클래스에서 접근 가능 

- default 같은 패키지 내에서만 접근 가능

- private 같은 클래스 내에서만 접근 가능

 

Servlet과 JSP

- Servlet은 자바 언어로 웹 개발을 하기 위해 만들어진 것으로, 컨테이너가 이해할 수 있도록 순수 자바 코드로만 이루어져 있습니다. (Html in JAVA)

- JSP는 html 기반에 자바 코드를 블록화하여 삽입한 것으로 서블릿을 좀 더 쉽게 접근할 수 있도록 만들어진 것입니다. (JAVA in Html)

제너릭

클래스를 선언할 때 타입을 결정하지 않고 객체 생성 시 유동적으로 재사용하기 위한 것을 말합니다. 제너릭을 활용하면 따로 형변환할 필요가 없고, 타입 에러가 발생하지 않기 때문에 유용하게 사용할 수 있습니다.

컬렉션 클래스에서 제너릭을 사용하는 이유

컬렉션 클래스에서 제너릭을 사용하면, 컴파일러는 특정한 타입만 포함될 수 있도록 컬렉션을 제한합니다. 컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아낼 수 있도록 도와주기 때문에 사용합니다.

pojo

오래된 방식의 자바 오브젝트의 줄임말. 특정한 자바 모델이나 기능, 프레임워크 등을 따르지 않는 자바 오브젝트를 뜻합니다.

Wrapper class

래퍼 클래스란 기본 자료형의 값들을 참조타입의 값으로 사용해야 할 때 사용되는 클래스입니다. 이 클래스를 통하여 기본 자료형들을 참조형으로 사용할 수 있습니다.

데드락이 무엇이고, 해결방법에 대해 설명해보세요

데드락이란, 둘 이상의 스레드가 lock을 획득하기 위해 기다리는데, 이 lock을 잡고 있는 스레드도 똑같이 다른 lock을 기다리면서 서로 블락 상태에 놓이는 것을 말합니다. 데드락은 다수의 스레드가 같은 lock을 동시에 다른 명령에 의해 획득하려 할 때 발생할 수 있는데요. 해결방법으로는 우선 순위를 선정해 자원을 선점하도록 하는 것과 공유 불가능한 상호 배제 조건을 제거하는 것이 있습니다.

오버라이딩 / 오버로딩

- 오버라이딩 : 상속받은 메서드를 재정의하여 현재 클래스에 맞게 바꾸는 것을 재정의하는 것이다.
오버로딩 : 매개변수가 다른 함수, 같은 기능을 하는 메서드를 똑같이 이름을 주는 것

JVM이 하는 역할?

JVM은 자바를 실행하기 위한 가상 기계입니다. 자바의 바이트 코드를 운영체제에 맞게 해석해주는 역할을 하는데요.

자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트 코드로 변환시켜줍니다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행이 되지 않습니다. 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM입니다.

스프링과 MVC패턴에 대해 설명하세요

스프링은 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 이미 만들어진 구조화된 MVC모델과 프레임워크의 개발방식을 통하여 기존 코드보다 소량의 코드로 원하는 컴포넌트들을 사용할 수 있습니다.

MVC 패턴은 코드의 재사용에 유용하며, 사용자 인터페이스와 응용 프로그램 개발에 소요되는 시간을 줄여주는 효과적인 설계 방식을 말합니다.

구성요소로는 Model, View, Controller가 있는데요. 모델은 핵심적인 비즈니스 로직을 담당하여 데이터베이스를 관리하는 부분이고, 뷰는 사용자에게 보여주는 화면, 컨트롤러는 모델과 뷰 사이에서 정보 교환을 할 수 있도록 연결시켜주는 역할을 합니다.

스프링 DI에 대해 아는대로 말씀해주세요

DI는 의존성 주입의 약자로, 객체들 간의 의존성을 줄이기 위해 사용되는 스프링의 IOC 컨테이너의 구체적 구현 방식을 말합니다.

DI는 개발코드 부분에서 객체를 생성하는 것이 아니라, 데이터 주입만 담당하는 별도의 공간에서 객체를 생성하고, 데이터간의 의존성을 주입해 개발코드에서 가져다 쓰면서 의존성을 줄이는 방식입니다. 디자인 패턴 중 팩토리 패턴을 활용하는 것과 같다고 말씀드릴 수 있겠습니다.

MVC1이랑 MVC2의 패턴 차이에 대해 설명해주세요

모델1은 JSP페이지 안에서 로직 처리를 위해 자바 코드가 함께 사용됩니다. 요청이 오면, 직접 자바빈이나 클래스를 이용해 작업을 처리하고, 이를 클라이언트에 출력해줍니다. 구조가 단순한 장점이 있지만, JSP 내에서 html 코드와 자바 코드가 같이 사용되면서 복잡해지고 유지보수가 어려운 단점이 있습니다.

모델2는 이와는 다르게 모든 처리를 JSP에서만 담당하는 것이 아니라 서블릿을 만들어 역할 분담을 하는 패턴입니다. 요청 결과를 출력해주는 뷰만 JSP가 담당하고, 흐름을 제어해주고 비즈니스 로직에 해당하는 컨트롤러의 역할을 서블릿이 담당하게 됩니다. 이처럼 역할을 분담하면서 유지보수가 용이해지는 장점이 있지만 습득하기 힘들고 구조가 복잡해지는 단점도 있습니다.

스프링 필터랑 인터셉터의 차이점

필터와 인터셉터는 실행되는 시점에서 차이가 있습니다. 필터는 웹 애플리케이션에 등록을 하고, 인터셉터는 스프링의 context에 등록을 합니다. 따라서 컨트롤러에 들어가기 전 작업을 처리하기 위해 사용하는 공통점이 있지만, 호출되는 시점에서 차이가 존재합니다.

* 필터 : DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다. 스프링과 무관한 자원에 대해 동작한다. ex) 인코딩

* 인터셉터 :  스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.

* AOP
 - Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
 -
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다. (비즈니스 로직의 앞과 뒤에서 원하는 지점에 해당 공통 관심사를 수행할 수 있게 하면서 중복 코드를 줄일 수 있는 방식)

IOC가 무엇인가요?

IOC란, 인스턴스의 생성부터 소멸까지 개발자가 아닌 컨테이너가 대신 관리해주는 것을 말합니다. 인스턴스 생성의 제어를 서블릿과 같은 bean을 관리해주는 컨테이너가 관리합니다.

스프링이랑 스프링 부트랑 차이점이 뭔가요?

스프링 부트는 스프링에서 사용하는 프로젝트를 간편하게 셋업할 수 있는 서브 프로젝트입니다. 독립 컨테이너에서 동작할 수 있기 때문에 임베디드 톰켓이 자동으로 실행되구요. 임베디드 컨테이너에서 애플리케이션을 실행시키기에는 다소 불안전해서 큰 프로젝트는 사용하지 않는 것이 좋습니다.

스프링 MVC 구조 or 흐름에 대해서 과정대로 설명해보세요

1. 클라이언트가 Request 요청을 하면, DispatcherServlet이 요청을 가로챈다. 이 때 DispatcherServlet이 모든 요청을 가로채는 건 아니고 web.xml에 등록된 내용만 가로챈다. 최초의 web.xml 에서는 <url-pattern>이 '/'와 같이 해당 애플리케이션의 모든 URL로 등록돼있기 때문에, 만약 *. do와 같이 특정 URL만 적용하고 싶다면 <url-pattern>의 내용을 바꿔주어 범위를 변경하면 된다.

2. DispatcherServlet이 가로챈 요청을 HandlerMapping에게 보내 해당 요청을 처리할 수 있는 Controller를 찾는다. (이때 핸들러를 실행하기 전/후에 처리할 것들을 인터셉터로 만들어 줍니다.)

3. 실제 로직 처리 (Controller -> Service -> DAO -> DB -> DAO -> Service -> Controller)

4. 로직 처리 후 ViewResolver를 통해 view 화면을 찾는다.

5. 찾은 view 화면을 View에 보내면 이 결과를 다시 DispatcherServlet에 보내고, DispatcherServlet는 최종 클라이언트에게 전송한다.

DAO와 DTO를 설명해주세요

DAO는 데이터베이스의 데이터에 접근하기 위한 객체입니다. 데이터베이스에 접근을 하기 위한 로직과 비즈니스 로직을 분리하기 위해서 사용되구요. 데이터베이스를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체를 말합니다.

DTO는 계층간 데이터 교환을 위한 자바 beans를 말합니다. 여기서 말하는 계층은 컨트롤러, 뷰, business layer, persistent layer를 말합니다. VO도 같은 기능을 하지만 read only 속성을 가진 차이가 있습니다.

String, StringBuilder, StringBuffer 차이

String
새로운 값을 할당할 때마다 새롭게 객체가 생성된다불변객체이기 때문에 값을 바꿀 수 없음String + String을 할 때 각각의 객체들이 계속 생성되기 때문에 가비지컬렉션 되기 전에는 계속 힙에 메모리가 쌓이게 된다
StringBuilder, StringBuffer
메모리에 추가하는 방식으로, 클래스에 대한 객체를 직접 생성하지 않음다른 것은 똑같지만 StringBuffer는 thread-safe하다그렇기 때문에 단일 스레드 환경에서는 StringBuilder를 사용해서 더 빠르게 실행하고, 멀티 스레드에서는 thread-safe한 StringBuffer를 사용하자

Collection

Java API 문서에서는 컬렉션 프레임워크를 데이터 군(group)을 다루고 표현하기 위한 단일화된 구조라고 정의한다.
자바의 컬렉션 프레임워크는 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공한다.

Set 인터페이스 : 순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.

· HashSet
-
가장빠른 임의 접근 속도
-
순서를 예측할 수 없음

· TreeSet
-
정렬방법을 지정할 수 있음

 

List 인터페이스 : 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.

· LinkedList
-
양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 되기에 유용
-
스택, , 양방향 큐 등을 만들기 위한 용도로 쓰임

· Vector
-
과거에 대용량 처리를 위해 사용했으며, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않음

· ArrayList
-
단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능이 뛰어남

 

Map 인터페이스 : (Key), (Value)의 쌍으로 이루어진 데이터 집합으로, 순서는 유지되지 않으며 (Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.

· Hashtable
- HashMap
보다는 느리지만 동기화 지원
- null
불가

· HashMap
-
중복과 순서가 허용되지 않으며 null값이 올 수 있다.

· TreeMap
-
정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

 

 

Thread와 Process의 차이점

*프로세스(Process)
- 컴퓨터에서 연속적으로 실행되고 있는 프로그램의 단위
- 실행될 때 운영체제에서 각각 독립된 메모리 영역을 할당 받음
 
*쓰레드(Thread)
- 프로세스 내에서 실행되는 작업의 단위
- 각각 Stack만 따로 할당 받고 Code, Heap, Data 영역은 공유함

 

Mybatis  # $ 차이점

*#
- #{}을 사용하는 경우 변수에 작은 따옴표(‘)가 자동으로 붙여 쿼리가 수행됨
- 쿼리문은 재활용(캐싱)되기 때문에 효율적
- 테이블명에는 사용할수 없음(변수 양쪽에 따옴표가 붙기 때문에 SQLSyntaxErrorException 오류가 발생)

*$
- ${}을 사용하는 경우값이 넣어진 채로 쿼리문이 수행된다. 파라미터의 값이 바뀔 때마다 항상 쿼리문 파싱을 진행해야 한다. 즉, 성능상의 단점이 존재한다.
- 작은 따옴표(‘)가 붙지 않기 때문에 테이블 이름이나 컬럼 이름을 동적으로 결정할 때 사용할 수 있다.
- SQL Injection에 취약

 

자바8 / 자바11 특징

* 자바8
- 람다 표현식 (Lambda expression): 함수형 프로그래밍이 가능하게 됨
- 스트림 API (Stream API): 데이터를 추상화하여 다룰 수 있게 됨
- java.time 패키지: 더 직관적이고 개선된 Date, Time API를 제공
- 나즈혼 (Nashorn): 자바스크립트의 새로운 엔진을 도입  Optional


* 자바 11
- 새로운 String 메서드 추가
 strip(): 문자열 앞, 뒤의 공백 제거.
 stripLeading(): 문자열 앞의 공백 제거.
 stripTrailing(): 문자열 뒤의 공백 제거.
 isBlank(): 문자열이 비어있거나 공백만 포함되어 있을 경우 true 를 반환. String.trim().isEmpty() 호출결과와 같음
 lines(): 문자열을 라인 단위로 쪼개는 스트림을 반환.
 repeat(n): 지정된 수 만큼 문자열을 반복하여 붙여 반환:
- java.nio.file.Files 클래스 유틸 메서드 추가

자바스크립트에서 onload ready

- onload : 는 현재 요청을 통해 전송받은 문서의 모든 내용을 읽어온 후 마지막에 호출되는 이벤트
- ready :  현재 전송받은 문서의 DOM구조가 메모리에 준비되었을 때 발생하는 이벤트

PG 인증 / 승인 / 매입

인증 : 고객의 카드정보가 유효하며, 본인이 사용하는 것이 맞는지(비밀번호 확인) 등을 인증하는 과정
승인 : PG 또는 VAN 사를 통해 카드발급사에 정보를 전달해서 카드사용을 전달하고, 카드 한도를 차감하는 과정
매입 : 승인된 금액을 VAN사를 통해서 카드 매입사로 전달하는 확정 과정

HTTP  / 소켓통신 차이점

* HTTP : 클라이언트 요청이 있을때 서버가 응답하는 방식(단방향)
* 소켓  : 서버와 클라이언트 양쪽에서 서로에서 데이터 전달하는 방식(양방향)

Forward와 Redirect 차이

* Forward: Web Container 차원에서 페이지의 이동
 - 웹 브라우저에는 최초에 호출한 URL이 표시되고, 이동한 페이지의 URL 정보는 확인할 수 없음
 - 현재 실행중인 페이지와 forward에 의해 호출될 페이지는 Request 객체와 Response 객체를 공유함
* Redirect : Web Container로 명령이 들어오면, 웹 브라우저에게 다른 페이지로 이동하라고 명령을 내린다
 - URL을 지시된 주소로 바꾸고 해당 주소로 이동
 - 다른 웹 컨테이너에 있는 주소로 이동하며 새로운 페이지에서는 Request와 Response객체가 새롭게 생성됨

Session / Cookie

* Session 
 - Session에 관련된 데이터는 Server에 저장된다. 
 - 웹 브라우저의 캐시에 저장되어 브라우저가 닫히거나 서버에서 삭제시 사라진다.
 - Cookie에 비해 보안성이 좋다.

* Cookie
 - 사용자가 특정 웹서버에 접속할 때, 생성되는 개인 아이디와 비밀번호, 방문사이트의 정보를 담은임시 파일
 - Cookie는 Client PC에 저장되는 정보기 때문에, 다른 사용자에 의해서 임의로 변경이 가능하다. 
   > (정보 유출 가능, Session보다 보안성이 낮은 이유)