[면접 대비] Java/Spring

2023. 11. 18. 20:08Study/Computer Science

[중요] 객체 지향 프로그래밍의 키워드

추상화

공통적인 기능이나 속성을 묶어서 이름을 붙인 것

캡슐화

서로 연관있는 속성이나 기능들을 하나로 묶어 데이터를 외부로 부터 보호하는 것

상속

객체가 다른 객체를 상속받으면, 그 객체의 요소들을 사용할 수 있는 것

다형성

하나의 타입에 여러 개의 타입을 대입해서 사용할 수 있는 것

 

제네릭이 무엇인가요?

클래스 내부에서 지정하는 것이 아니라, 외부에서 지정하도록 하는 것

 

제네릭을 사용하는 이유는?

컴파일 시점에 오류를 발생시켜, 런타임 시점에 오류가 발생하는 것을 사전에 차단할 수 있음

 

자바의 모든 클래스는 Object 클래스를 상속받습니다. 그리고 Object 클래스에는 equals() 와 hashCode() 라는 메소드가 선언되어 있습니다. 이 메소드들은 각각 어떤 역할일까요? 이 둘의 차이점은 무엇일까요?

equals()

- 두 객체가 논리적으로 같은지 확인하는데 사용

 

hashCode()

- 객체의 해시 코드 값을 반환하는데 사용

 

두 메서드는 함께 사용되어야 합니다. 즉, equals() 메서드를 오버라이드하여 두 객체의 동등성을 정의하면, hashCode() 메서드도 함께 오버라이드하여 동등한 객체는 같은 해시 코드 값을 반환하도록 해야 합니다. 이렇게 해야 HashMap과 같은 해시 기반 컬렉션에서 올바르게 작동합니다.

 

 스프링이란 무엇인가요?

✔ 자바 플랫폼을 위한 오픈소스 프레임워크로, 웹 개발할 때 많이 사용하는 프레임워크입니다. 

✔ 웹 개발에 필요한 다양한 기능들을 종합적으로 제공합니다. 예를들어, Spring MVC, Spring Security, Spring DI, Spring AOP 등이 있습니다.

 

스프링은 왜 생긴 것인가?

스프링 이전에 EJB라는 기술을 사용했으나, 너무 무거운데다 불편한 점이 많아 '경량화'된 Java 엔터프라이즈용 Framework인 스프링이 나오게 되었습니다.

 

[기출] 스프링 AOP가 무엇인가요?

✔ AOP란 Aspect Of Programming의 악자로, 관점 지향 프로그래밍을 뜻합니다.

✔ 서비스에서 주요 기능과 부가 기능으로 나누고, 부가 기능을 모듈화하는 방법입니다. 이를 통해 소프트웨어 개발에서 공통적으로 사용되는 부분을 분리하여 관리할 수 있습니다.

 

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

✔ Dependency Injection의 약자로, 객체의 의존성을 프레임워크가 관리하는 설계 패턴

✔ DI는 생성자 주입 방식, setter 주입 방식, 필드 주입 방식이 있습니다.

✔ 객체간의 결합도를 낮출 수 있습니다.

 

@Autowired vs @Resource vs @Inject

  의존 관계를 자동으로 연결해주는 어노테이션입니다.

 

Autowired

  • 스프링에서 지원
  • 타입에 맞춰 연결

Inject

  • 자바에서 지원
  • 타입에 맞춰 연결

Resource

  • 자바에서 지원
  • 이름에 맞춰 연결

추가적으로, @Autowried나 @Inject도 @Qualifier 어노테이션을 이용하면, 타입이외의 방법으로 의존성을 연결할 수 있다.

 

IoC가 무엇인가요?

✔ Inversion of Control의 약자로, 제어의 역전을 뜻합니다.

✔ 제어의 권한이 개발자에게 있지 않고, 프레임워크에 있는 것을 뜻합니다.

✔ 이렇게 함으로써 개발자는 비즈니스 로직 개발에 좀 더 전념할 수 있습니다.

 

Bean이란 ?

✔ Spring IoC 컨테이너가 관리하는 자바 객체를 빈이라고 합니다.

 

스프링 필터와 인터셉터의 차이점이 무엇일까요?

✔ 호출되는 시점의 차이가 있습니다.

✔ 필터는 dispatcherServelt 진입 전에 실행되는 Servlet이고, 인터셉터는 Controller 진입 직전에 실행되는 Servlet입니다.

filter는 인코딩 변환 처리, XSS 방어 등의 요청에 대한 처리를 주로 담당함

Interceptor은 로그인 체크, 권한체크, 로그확인 등의 업무를 처리

Servlet이란 무엇인가요?

✔ 웹 페이지를 동적으로 생성하거나, 클라이언트로부터 정보를 받아 처리하는 등 웹 서비스를 제공하는 용도로 사용되는 자바 클래스입니다.

✔ 자바를 사용해서 웹을 만들기 위해 필요한 기술입니다.

✔ 하지만, Servlet 같은 경우 html을 생성하기 어렵습니다. 이를 위해, JSP 같은 기술이 나오게 되었습니다.

 

DTO, DAO, VO에 대해 각각 설명해주세요

✅ DTO(Data Transfer Object)

데이터를 전송하기 위한 객체

 

✅ DAO(Data Access Object)

데이터베이스에 접근하기 위한 객체

 

✅ VO(Value Obejct)

비즈니스 도메인을 모델링한 객체

 

클래스란?

✔ 필드와 메서드로 이루어져 있으며, 객체를 생성하기 위한 설계 도면, 틀입니다. 

 

[중요]String vs StringBuffer vs StringBuilder

String 

변경이 불가능합니다. 만약, 변경하게 된다면 메모리에 다시 생성된 문자열이 올라가게 됩니다. 이는 성능 문제를 야기시킬 수 있습니다.

StringBuffer

변경이 가능하고, 동기화를 지원합니다. 이에 따라, thread-safe 하다는 특징이 있습니다.

StringBuilder

변경이 가능하고, 동기화를 지원하지 않습니다. 이에 따라, thread-not safe 하다는 특징이 있습니다.

 

[중요]MVC란 무엇입니까?

✔ 소프트웨어 엔지니어링에서 사용되는 디자인 설계 패턴중 하나입니다.

✔ 애플리케이션 로직을 Model, View, Controller 3개의 역할로 분리하여 구현하는 방법론

 

Spring MVC의 진행 방식은?

 

 

 

OAuth2.0란?

✔ 타사의 사이트에 대한 접근 권한을 얻고 그 권한을 이용하여 개발할 수 있도록 도와주는 프레임워크다. 구글, 카카오, 네이버 등과 같은 사이트에서 로그인을 하면 직접 구현한 사이트에서도 로그인 인증을 받을 수 있도록 되는 구조다.

 

POJO란?

✔ Plain Old Java Object 약자로, 순수한 자바 객체를 의미합니다.

✔ 스프링의 핵심 원칙 중 하나로 채택되었으며, 이를 통해 개발자는 비즈니스 로직에 집중하고 테스트가 용이한 애플리케이션을 개발할 수 있게 되었습니다.

 

ORM이란?

✔ Object Relational Mapping의 약자로, 관계형 데이터베이스를 객체로 매핑하는 것을 뜻합니다.

✔ 쿼리를 작성할 필요가 없기 때문에, 비즈니스 로직에만 집중할 수 있습니다.

 

JPA란?

✔ ORM을 위해 자바에서 제공하는 API

✔ JPA인터페이스 이기 때문에, 사용하기 위해서는 구현체가 필요합니다. 대표적으로, 하이버네이트가 이에 해당합니다.

 

 Java의 컴파일 과정에 대해 설명해주세요

1️⃣ Java 소스 코드 작성

 

2️⃣ 컴파일 : 작성된 소스코드는 JAVA 컴파일러(javac)에 의해 컴파일되어 바이트코드(.class 파일)로 변환됩니다. 이 과정에서 문법 오류가 있는 경우, 컴파일러는 오류 메세지를 표시하고 프로세스를 중단합니다.

 

3️⃣ 실행: 변환된 바이트 코드는 JVM 위에서 실행됩니다. JVM은 바이트코드를 기계어로 변환하여 실제 하드웨어가 이해하고 실행할 수 있도록 합니다. 이 과정을 인터프리팅이라고 부릅니다.

 

[중요] JVM의 역할에 대해 설명해주세요

 Java 바이트 코드만 있으면, 자바 프로그램을 어느 환경에서든 실행할 수 있다. 대신 실행 시키는 환경은 JVM이 설치되어 있어야 한다.

Garbage Collection을 통해서 메모리 관리를 할 수 있습니다. 이로 인해 개발자는 자원에 관해서 신경쓰지 않고 개발에만 전념할 수 있습니다.

 

[중요] GC에 대해 아는 대로 설명해주세요

✅ GC의 대상이 되는 경우

- 객체가 NULL인 경우

- 블럭 실행 종료 후, 블럭 안에서 생성된 객체

- 부모 객체가 NULL인 경우, 포함하는 자식 객체

 

✅ 장점과 단점

- 장점 : 메모리 누수 방지, 해제된 메모리 접근 방지, 해제한 메모리를 다시 이중 해제하는 것 방지

- 단점 : 개발자가 언제 메모리를 해제하는지 알 수 없음, 오버헤드 발생  

 

✅ 알고리즘

- Reference Counting

- Mark And Sweep

 

[중요] 오버라이딩과 오버로딩에 대해서 설명해주세요

오버라이딩 : 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것을 오버라이딩이라고 한다.

오버로딩 : 같은 이름의 메소드를 여러개 정의하는 것을 말합니다. 이때 메소드 이름은 같지만, 매개변수의 타입이나 개수, 순서가 다르게 정의됩니다. 이를 통해 같은 기능을 하는 메소드이지만, 다른 종류의 매개변수를 받아 처리할 수 있도록 합니다.

 

[중요]▶ 객체지향 프로그래밍에 대해 설명해주세요

필드와 메소드로 이루어진 객체들 간의 유기적인 상호작용을 하도록 프로그램을 설계하는 것을 객체지향 프로그래밍이라고 합니다. 객체 지향의 대표적인 특징으로는 추상화, 상속, 다형성, 캡슐화가 있습니다.

 

[중요]▶ Spring Framework에 대해서 설명해주세요

  자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 엔터프라이즈급 애플리케이션을 개발하는 데 필요한 광범위한 지원을 제공합니다.

 

✅ 특징

- 제어의 역전

- 의존성 주입

- AOP

- Spring MVC

- JPA, JDBC 등의 데이터 접근 기술뿐만 아니라 다양한 서비스를 지원

 

▶ Java에서의 스레드와 멀티스레딩에 대해 알려주세요

스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다.

멀티 스레딩 : 한 프로세스 내에서 두 개 이상의 스레드를 동시에 실행하는 것을 의미합니다. 멀티스레드를 사용하면 CPU 사용률을 최적화하고, 사용자 응답성을 향상시키며, 프로그램의 구조를 간결하게 만드는 등의 이점을 얻을 수 있습니다.

 

Java에서는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현함으로써 스레드를 생성할 수 있습니다. 이후 start() 메서드를 호출하여 스레드를 실행시킵니다. 멀티스레딩 같은 경우 동기화 문제가 발생할 수 있으니 syncronized 키워드를 사용하여 이를 해결할 수 있습니다.

 

▶ JNI에 대해 아는 대로 설명해주세요

자바와 네이티브 애플리케이션(즉, 특정 하드웨어 플랫폼에 최적화된 c,c++ 등의 언어로 작성된 애플리케이션) 간의 상호 작용을 가능하게 하는 프로그래밍 프레임워크입니다.

  JNI를 사용하면 자바 코드에서 C, C++ 같은 네이티브 메소드를 호출할 수 있고, 반대로 네이티브 코드에서 자바 메소드를 호출하거나 자바 객체를 조작하는 것도 가능합니다.

 

▶ Java에서의 직렬화와 역직렬화에 대해 설명해주세요

직렬화 : 객체의 상태를 바이트 스트림으로 변환하는 과정을 말합니다. 변환된 바이트 스트림은 네트워크를 통해 전송하거나 파일에 저장할 수 있습니다.

역직렬화 : 바이트 스트림을 다시 원래의 객체로 복원하는 과정을 말합니다.

 

▶ Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?

byte(1), short(2), int(4), long(8), float(4), double(8), char(2), boolean(1)

 

▶ JPA vs MyBatis

두 기술 모두 데이터 베이스 접근 기술입니다.

 

🔹JPA

- 객체 지향적으로 데이터를 관리 가능

- 테이블이 아닌 객체에 집중할 수 있어 비즈니스 로직에 더 집중 가능

- JPA는 내부적으로 SQL를 생성하고 실행합니다. 이로인해 개발자는 SQL에 의존적인 개발에서 벗어날 수 있지만, 반대로 SQL 최적화 등 세밀한 조정이 필요한 경우에는 제약 될 수 잇음

 

🔹MyBatis

- 개발자가 직접 SQL를 작성할 수 있는 프레임워크

- SQL 쿼리와 자바 객체를 매핑해주는 역할

- SQL을 통해 세밀한 데이터 조작이 가능하고, 복잡한 쿼리를 작성하는 데 유리합니다.

 

▶ try-with-resources에 대해서 설명해주세요

Java 7부터 도입된 기능으로, 자원을 안전하게 관리하기 위해 사용됩니다. 이 기능을 사용하면, try문을 사용하여 자원을 할당하고, 자동으로 자원을 해제할 수 있습니다.

 

[중요] 컬렉션 프레임워크의 종류에 대해 각각 설명해주세요 (List, Set, Map)

List : 중복 가능하고 데이터 순서를 보장함

Set : 중복 불가능하고 데이터 순서를 보장하지 않음

Map : key 값이 같으면 중복 불가능하고 데이터의 순서를 보장하지 않음. 단 value 값은 중복 가능

 

[중요]추상 클래스와 인터페이스에 대해서 설명해주시고, 차이점에 대해 설명해주세요

✅ 추상 클래스 

- 하나 이상의 추상 메소드를 포함한 클래스

- 추상 클래스는 객체를 생성할 수 없으며, 하위 클래스가 추상 메소드를 구현하도록 강제 

- 일반 메소드와 변수도 포함 가능

 

✅ 인터페이스

- 모든 메소드가 추상 메소드인 클래스

- 객체를 생성할 수 없으며, 클래스가 인터페이스를 구현하면 그 클래스는 인터페이스의 모든 메소드를 구현해야함

- 인터페이스는 상수만 포함 가능

 

차이점

- 클래스는 한 개의 추상 클래스만 상속받을 수 있지만, 인터페이스는 다중 상속이 가능

- 추상 클래스는 생성자를 가질 수 있지만, 인터페이스는 생성자를 가질 수 없음

- 추상 클래스는 일반 메소드와 변수를 포함할 수 있지만, 인터페이스는 추상 메소드와 상수만 포함할 수 있음

- [중요] 추상 클래스는 부모 클래스를 상속함으로써 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.

 

 객체 지향 설계 원칙에 대해 설명해주세요

SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만을 가져야 합니다.

OCP(개방-폐쇄 원칙) : 확장에는 열려있고, 수정에는 닫혀있어야 합니다.

LSP(리스코프 치환 원칙) : 자식 객체로 치환하여도, 프로그램이 원활하게 실행되어야 합니다.

ISP(인터페이스 분리 원칙) : 하나의 일반적인 인터페이스보다는 여러개의 구체적인 인터페이스가 낫습니다

DIP(의존 역전 법칙) : 구체적인 것에 의존하면 안 되고, 추상화 된 것에 의존해야 한다. 모듈간의 응집도를 낮춰준다(Loosing Coupling)

 

[기출] OCP를 어떻게 하면 구현할 수 있는가?

✔ 추상화 클래스를 구성하고 이를 상속하여 확장시키는 관계로 구성하면 변경에는 닫히고, 추가에는 열려있는 프로그램을 만들 수 있다.

 

[중요] 자바의 메모리 영역에 대해 설명해주세요

메소드 영역 : 클래스 정보, static 변수, 상수 등이 저장되는 곳입니다. JVM이 시작될 때 생성되며, 모든 스레드가 공유하는 영역입니다.

힙 영역 : new 연산자로 생성된 객체와 배열이 저장되는 곳입니다. 또한 GC가 동작하는 영역이기도 합니다. 모든 스레드가 공유하는 영역입니다.

스택 영역 : 메소드 호출시 마다 각각의 스택 프레임이 생성되며, 지역 변수, 매개변수, 연산 중 발생하는 임시 데이터 등이 저장되는 곳입니다.

PC Resgister : 현재 실행중인 JVM 명령의 주소를 저장하는 곳입니다. 각 스레드마다 독립적으로 생성됩니다.

Native Method 영역 : 자바외의 언어로 작성된 네이티브 메소드를 위한 메모리 영역입니다. 각 스레드마다 독립적으로 생성됩니다.

 

 생성자에 대해 설명해주세요

객체가 생성될 때 호출되는 메서드입니다. 클래스 이름과 동일하게 정의되며, 리턴 타입을 명시하지 않습니다. 생성자는 객체의 초기화 작업을 담당하며, 주로 필드의 초기값을 설정하는 데 사용됩니다.

 

 Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요

 Wrapper 클래스는 자바의 기본 데이터 타입을 객체로 다루기 위한 클래스입니다.

각각의 기본 데이터 타입에 대응하는 Wrapper 클래스가 있습니다.

Wrapper 클래스는 기본 데이터 타입을 객체로 다루어야 하는 경우 사용합니다. 예를 들어, 컬렉션 클래스들은 객체만 담을 수 있으므로, 기본 데이터 타입을사용하려면 Wrapper 클래스를 활용해야 합니다.

 

Boxing은 기본 타입을 Wrapper 클래스로 변환하는 것을 의미하며, UnBoxing은 Wrapper클래스를 기본 타입으로 변환하는 것을 말합니다.

 

[중요] 접근 제한자에 대해 설명해주세요

클래스, 필드, 메소드 등 접근 범위를 제한하기 위해 접근 제한자를 사용합니다.

- private : 같은 클래스 내에서만 접근 가능. 외부에서는 접근 불가능

- default : 같은 패키지 내의 클래스에서만 접근 가능

- protected : 같은 패키지 내의 클래스 또는 다른 패키지의 하위 클래스에서 접근 가능

- public : 어디서든 접근 가능

 

 Java에서의 예외 처리 방법은 무엇인가요?

try-catch-finally : 예외가 발생할 가능성이 있는 코드를 try 블록 안에 작성하고, 해당 예외를 처리하기 위한 코드를 catch 블록 안에 작성합니다. finally 블록은 선택적으로 사용하며, 예외 발생 여부와 상관없이 항상 실행되는 코드입니다.

 

throws : 메소드 선언부에 사용하여 해당 메소드에서 처리하지 않은 예외를 호출한 곳으로 던지는 방법입니다.

 

 static 키워드는 어떤 용도로 사용되는가?

 static 키워드가 붙은 변수는 클래스 변수라고도 하며, 생성된 모든 인스턴스에서 공유하여 사용할 수 있음

 static 키워드가 붙은 메소드는 클래스 메소드라고도 하며, 인스턴스 생성 없이 클래스 이름으로 바로 호출할 수 있음.

 static 메소드 내부에는 static 아닌 멤버에 직접 접근할 수 없음.

 초기화 블럭으로 사용되기도 하고, static final 과 함께 많이 쓴다. 또한, 싱글톤 객체를 생성할 때 사용한다.

 

 Java에서의 람다 표현식이 무엇이고 어떻게 사용되나요?

람다 표현식은 자바 8부터 도입된 기능으로, 익명 함수를 표현하는데 사용됩니다. 주로 함수형 인터페이스의 인스턴스를 생성할 때 사용되며, 메소드를 더 간결하고 직관적으로 표현할 수 있게 해줍니다.

 

컬렉션 프레임워크의 Iterator와 forEach의 차이는 무엇인가요?

모두 컬렉션의 요소를 순회하는 방법을 제공하지만, 사용방식과 내부 동작 방식에 차이가 있습니다.

 

🔹Iterator 

- 컬렉션의 요소를 순차적으로 접근하는 방법을 제공하는 인터페이스입니다.

- hasNext(), next(), remove() 등의 메소드를 제공하며, 이를 통해 컬렉션의 요소를 순회하고, 요소를 제거 하는 등의 작업을 수행합니다.

 

🔹forEach 

- 자바 8부터 도입된 메소드로, 컬렉션의 모든 요소에 대해 주어진 작업을 수행하는 방법을 제공합니다.

- 람다 표현식 또는 메소드 참조를 인수로 받아, 컬렉션의 각 요소에 대해 이를 적용

- forEach는 내부적으로 Iterator를 사용하여 컬렉션의 요소를 순회함

- 요소 제거를 지원하지 않음

- 병렬처리를 지원하는 Stream API와 많이 사용함

 

toString() vs equals() vs hashCode()

🔹hashCode()

- 객체의 해시코드를 반환하는 메서드

- 객체의 주소를 int로 변환해서 반환.. 

- equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.

- equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

 

🔹toString()

- 객체를 문자열으로 변환하기 위한 메서드

- 자식 객체가 오버라이딩해서 많이 씀

 

🔹equals()

- 객체 자신과 주어진 객체를비교

- 같으면 true, 다르면 false

 

 자료구조를 선택하는 기준

 데이터의 성격

- 데이터의 성격에 따라, 순차적으로 접근해야 하는 경우 리스트나 배열 사용

 

 연산의 종류와 빈도

- 각 자료구조에 대한 다양한 연산을 지원

- 데이터의 삽입, 삭제, 검색등의 연산이 있다.

- 이러한 연산 중 어떤 연산이 주로 이루어지는지, 그리고 그 빈도가 어느 정도인지에 따라 적합한 자료구조가 달라짐

 

메모리 사용량

- LinkedList 같은 경우, 포인터 주소를 따로 저장해야 되기 때문에 메모리가 낭비될 수도 있음 

 

 그리고, 성능 및 유지보수성을 기준으로 두고 자료구조를 선택한다.

 

 forEach를 사용할 수 있는 자료구조는 어떠한 인터페이스를 상속받고 있나요?

✔ Iterable 인터페이스를 상속받고 있는 클래스

✔ Iterable 인터페이스는 iterator 메소드를 정의하고 있으며, 이 메소드를 통해 Iterator 객체를 얻을 수 있습니다. 이때 Iterator 객체를 통해 컬렉션 요소를 순회

✔ Iterable 인터페이스를 구현한 대표적인 클래스로 Collection 인터페이스가 있음

 

 forEach를 사용하면 다음 데이터를 얻기위해서 내부적으로 호출되는 메서드가 있는데 무엇일까?

 forEach를 사용하면 내부적으로 Iterator의 next() 메소드가 호출된다.

 

 Iterator와 Iterable의 차이는 무엇인가요?

 Iterable 인터페이스

- Iterable 인터페이스는 객체가 'iterable' 하다는 것, 즉 객체의 요소를 순회할 수 있다는 것을 표현

- iterator() 메소드를 제공하고, 객체를 실제로 순회할 수 있는 Iterator 객체를 반환

- 대부분의 Collection Framework에서 Iterable 인터페이스를 구현

 

 Iterator 인터페이스

- 실제로 객체의 요소를 순회하는 역할을 함

- Iterator 인터페이스를 구현한 객체는 hasNext(), next(), remove() 등의 메소드를 제공

- hasNext() 는 순회할 요소가 더 있는지, next()는 다음 요소 반환, remove()는 현재 요소 제거에 사용

 

정리하자면, Iterable 인터페이스는 순회 가능한 것을 표현하기 위한 인터페이스이고, Iterator는 실제로 순회를 수행하는 인터페이스

 

Generic 타입의 자료구조와 None Generice 타입의 자료구조의 차이를 설명하세요

Generic 타입 자료구조

- 예를 들어, ArrayList<String> 으로 선언하면 String만 저장가능하다. 만약, Integer로 선언하면 오류가 발생함

- 따라서, Generice 타입 자료구조는 컴파일 시점에 이와 같은 오류를 사전에 예방할 수 있음

 

None Generic 타입 자료구조

- 예를 들어, ArrayList 으로 선언하면 어떠한 객체든지 저장할 수 있다. 하지만, 잘못된 타입의 객체가 넘어가는 순간 오류가 발생

- 따라서, None Generice 타입 자료구조는 런타임 시점에 오류를 발생시켜 안전성 측면에서 제네릭 구조보다 좋지 않다.

- 또한, 객체를 꺼낼 때마다 적절한 타입으로 객체를 캐스팅해야 한다.

 

[중요] ArrayList와 LinkedList의 차이는?

ArrayList

✔ 동적 배열을 사용한다. 즉, 자동으로 배열의 크기를 늘려준다.

✔ 삽입, 삭제 등의 연산이 많이 사용되면 성능적으로 LinkedList보다 좋지 않다.

✔ 대신, 인덱스로 접근이 가능하므로 검색할 때 자주 사용된다.

✔ 메모리 사용을 LinkedList보다 덜 쓴다.

 

LinkedList

원하는 인덱스에 도달하려면 O(n)의 시간까지 걸릴 수 있으므로, ArrayList보다 느리다.

삭제, 삽입에서는 ArrayList보다 성능이 뛰어나다.

포인터를 저장해야하므로 ArrayList보다 메모리를 더 사용한다.

 

HashTable vs HashMap

 동기화 : Hashtable은 동기화되어 있어 멀티 스레드 환경에서 안전하게 사용 가능하고, HashMap은 기본적으로 동기화되어 있지 않다.

 허용하는 값 : Hashtable은 null키나 null 값을 허용하지 않습니다. 반대로, HashMap은 null키나 값을 지원합니다.

성능 : Hashtable은 동기화되어 있기 때문에 HashMap보다 성능이 떨어진다.

순회 방법 : HashMap은 Iterator를 사용하여 순회하며, Hashtable은 Iterator 뿐만 아니라 Enumeration도 사용하여 순회

 

Hashing이란?

어떤 데이터를 특정 길이의 고유값으로 바꾸는 과정을 해싱이라고 한다.

✔ 이 변환을 수행하는 함수를 해시 함수라고 한다.

✔ 해싱의 주요 목표는 데이터를 빠르게 저장하고 검색하는 것에 있다.

 

Factory Method Pattern 이란?

✔ 객체 생성을 공장 클래스로 캡슐화 처리하여 대신 생성하게 하는 생성 디자인 패턴

✔ 클라이언트에서 직접 new 연산자를 통해 제품 객체를 생성하는 것이 아닌, 제품 객체들을 도맡아 생성하는 공장 클래스

 

CSRF(Cross-site request forgery)에 대해 설명하고, 이를 막기 위한 방법은?

✔ 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하도록 만드는 공격

✔ 해결방법

- CSRF 토큰 사용 : 사용자의 모든 요청에 CSRF 토큰을 포함시킨다.

- SameSite 쿠키 속성 : 브라우저가 같은 사이트에서만 쿠키를 보내도록 제한할 수 있다.

- 검증된 Referrer 헤더 사용 : Referrer 헤더의 요청 URL을 검증한다.

- 요청에 대한 사용자 인증

 

XSS(Cross-site scriping)에 대해 설명하고, 어떤 대응책이 있는가?

✔ 공격자가 웹사이트에 악성 스크립트를 삽입하는 공격입니다. 이 스크립트는 사용자의 브라우저에서 실행되며, 사용자의 세션 토큰이나 다른 민감한 정보를 탈취할 수 있다.

✔ 해결방법

- 입력 검증 

- 출력 인코딩

- 컨텐츠 보안 정책(CSP) : CSP를 사용하면 웹사이트에서 실행할 수 있는 스크립트의 출처를 제한할 수 있다.

 

스프링에서의 세션 관리와 보안 강화를 위한 방법은?

✔ HttpSession 인터페이스를 통해 세션 관리를 한다.

✔ 해결방법

- 세션 타임아웃 설정

- 세선 고정 공격 방어 : 사용자가 로그인하면 새로운 세션을 생성한다

- 세션 토큰 사용

- Https 사용 : 세션 쿠키를 암호화하여 전송한다.

 

스프링에서의 입력 유효성 검사 및 validation 방법에 대해 설명해주세요

어노테이션을 이용한 검증 : Bean Validation에서 제공하는 어노테이션을 사용하여 모델 클래스의 필드에 제약조건을 지정할 수 있습니다. @NotNull, @Email 등이 있다.

Controller에서 검증 수행 : @Valid 어노테이션을 사용하여 검증을 수행하고, BindingResult 객체를 사용하여 검증 결과를 받을 수 있다.

커스텀 검증 : ConstraintValidator 인터이스를 구현하는 클래스를 만들고, 그 클래스를 사용하는 어노테이션을 정의합니다.

 

보안 헤더의 역할과 어떻게 구현하는지에 대해 설명해주세요

이 헤더들은 웹 애플리케이션에서 클라이언트와 통신할 때 사용되며, 클라이언트가 어떻게 애플리케이션과 상호작용해야 하는지를 지시하는 역할을 한다.

주요 보안 헤더

- CSP : 웹 브라우저에게 특정 콘텐츠를 로드할 수 있는 출처를 알려주는 역할을 합니다. 이를 통해 XSS 방어 가능

- HSTS : 브라우저에게 HTTPS를 통해서만 수행하도록 지시

- X-Content-Type-Options : 이 헤더는 브라우저가 MIME 타입을 자동으로 탐지하고 변경하는 것을 방지한다. 이를 통해, 악의적인 콘텐츠를 업로드하는 것을 방지할 수 있음

- X-Frame-Options : 이 헤더는 웹 페이지가 다른 페이지의 프레임 내에서 렌더링되는 것을 방지한다. 이를 통해, 클릭 잭킹 공격을 방어할 수 있음

 

TDD의 개념에 대해 설명해주세요

✔ 소프트웨어 개발 방법론 중 하나로, 테스트가 개발을 주도하는 방식을 말합니다.

✔ 실패하는 테스트 작성, 테스트를 통과하는 코드 작성, 코드 리팩토링 과정을 거친다.

 

'Study > Computer Science' 카테고리의 다른 글

[면접대비] 리눅스  (0) 2023.11.27
[면접 대비] CS  (0) 2023.11.20
[Web]WEB와 WAS의 차이  (1) 2023.11.01
[DB]SQL vs NOSQL  (1) 2023.10.30
[DB] SQL Injection  (0) 2023.10.27