백엔드 면접 관련 지식 정리

JeeHyeok Lee·2023년 6월 19일
21

면접을 준비하면서 필요하다고 생각이 드는 백엔드 지식들을 정리하려고 한다.
전체 내용을 정리하긴 힘들 것 같고 면접에서 대답할 때 꼭 들어야가야 하는 내용이라고 생각되는 부분을 정리할 예정이다.
주로 Java, Spring 관련 지식을 정리해보려고 하고 공부하면서 적을 예정이라 두서가 없고 내용이 부족할 수 있다.

글 내용 외에 짧게 정리하기 힘든 CS 지식을 아래 레포지토리 주소에 기록 중이다.
(OS, 네트워크, 데이터베이스 등등)

https://github.com/olzlgur/CS_STUDY

Java

JVM

Java Virtual Machine의 약자로 자바 어플리케이션을 클래스 로더를 통해 읽어들여 자바 API와 함께 실행하는 것이다. Java와 OS 사이의 중개자 역할을 수행하며 OS에 구애받지 않도록 해준다. 메모리관리와 Garbage Collection 역시 JVM의 역할이다. JVM은 스택 기반으로 동작한다.

가비지 컬렉션(Garbage Collection)

유효하지 않은 메모리에 대한 해제를 개발자가 아닌 JVM의 가비지 컬렉터가 대신 해주는 것을 의미한다.

장점: 메모리 해제에 대한 처리를 신경쓰지 않아도 되기 때문에 개발 시간 단축이 가능하다. 메모리 누수, 다중 메모리 해제, 허상 포인터 등의 문제를 예방할 수 있다.

단점: 가비지 컬렉션을 위한 오버헤드가 발생할 수 있다.

알고리즘

  • 레퍼런스 카운팅: 객체마다 카운트 변수를 두고 객체에 대한 참조가 이루어질 경우 카운트를 진행하고 참조가 해제될 경우 카운트를 감소시킨다. 해당 카운트가 0이 되었을 경우에는 유효하지 않은 메모리라고 판단하여 가비지 컬렉션의 대상으로 판단한다.
  • 마크 앤드 스윕: 탐색을 진행하며 루트 노드로 부터 참조가 가능한 객체에 마크를 해둔 뒤 도달 불가능한 노드라고 판단되는 노드를 모두 해제한다.

https://d2.naver.com/helloworld/1329
가비지 컬렉션에 대한 공부를 진행할 경우 해당 내용을 읽어보면 많은 도움이 될 것 같다.

객체 지향 프로그래밍

다형성, 캡슐화, 상속, 추상화의 특성을 활용하여 코드의 재사용성을 늘리고 유지보수를 용이하게 하는 프로그래밍 기법

다형성: 서로 다른 형식과 모양을 가진다는 의미로 객체의 유형에 따라 서로 다른 작업을 수행하도록 할 수 있다.
ex) 오버로딩, 오버라이딩, 업 캐스팅, 다운 캐스팅

추상화: 공통의 속성, 기능을 묶어 이름을 붙이는 것을 의미한다. 인터페이스, 추상 클래스 등을 통해 구현 가능하다.

캡슐화: 클래스 내부에 메서드와 변수를 위치시켜 클래스 밖에서 변수를 선언하고 클래스를 사용할 수 있지만 내부의 변수나 메서드를 직접 볼 수 없고 메서드를 통해서만 변수에 접근할 수 있는 것을 말한다.

상속: 부모 클래스의 변수와 메서드를 자식 클래스가 물려받는 것을 말한다.

객체지향의 SOLID 원칙

객체 지향 설계의 5대 원칙을 의미한다.

단일 책임 원칙 SRP(single responsibility principle)
- 하나의 클래스는 하나의 책임만 가져야 한다.
- 하나의 책임이라는 것이 모호하기 때문에 변경을 기준으로 한다. 변경이 있을 때 파급 효과가 적으면 SRP 원칙을 잘 따른 것

개방-폐쇄 원칙 OCP(open/closed principle)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 다형성을 잘 활용해야 함
- 인터페이스를 구현한 새로운 클래스를 만들어서 새로운 기능을 구현한다.

리스코프 치환 원칙(liskov substitution principle)
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다. 다형성을 지원하기 위한 원칙, 인터페이스를 구현한 구현체는 믿고 사용하려면, 이 원칙이 필요하다.

인터페이스 분리 원칙 ISP(interface segregation principle)
- 특정 클라이언트를 위한 인터페이스 여러개가 범용 인터페이스 하나보다 낫다.
- 인터페이스를 분리하면 인터페이스 자체가 변해도 클라이언트에 영향을 주지 않는다.
- 인터페이스가 명확해지고, 대체 가능성이 높아진다.

의존관계 역전 원칙 DIP(dependency inversion principle)
- 추상화에 의존해야하며 구체화에 의존하면 안된다.
- 구현 클래스에 의존하지 말고 인터페이스에 의존해야 한다.

Collection

데이터 자료형을 지원하는 Java의 클래스로 DataStructure를 직접 구현하지 않고 편하게 사용할 수 있게 해준다. List, Set, Map 등이 있고 Stack, Queue 등의 인터페이스도 존재한다.

List: 순서가 있고 중복을 허용한다.
ex) ArrayList, LinkedList, Vector, Stack

Set: 순서가 없고 중복을 허용하지 않는다.
ex) HashSet, LinkedHashSet(순서를 보장하기 위해 사용)

Map: 순서가 없으며 Key, Value 형태이며 Key의 중복을 지원하지 않는다.
ex) HashMap, LinkedHashMap(key의 순서를 보장하기 위해 사용)

Java의 접근 제어자

public: 모든 곳에서 접근 가능
protected: 동일 패키지, 다른 패키지에 있는 자손 클래스에서 접근 가능
default: 동일 패키지 내에서 접근 가능
private: 동일 클래스 내에서 접근 가능

final 변수, 메서드, 클래스

final 변수: 상수를 선언하고 사용하고자 할 때 선언
final 메서드: 오버라이딩이 불가능한 메서드를 사용하고자 할 때 선언
final 클래스: 상속이 불가능한 클래스를 사용하고자 할 때 선언

wrapper class

primitive 타입을 객체 타입처럼 사용하고자 하는 경우를 위해 지원하는 클래스로 주로 첫 스펠링이 대무낮로 된 형태로 구성되어 있음

JRE, JDK란?

JRE: Java Runtime Environment의 약자로 자바 실행 환경에 대한 라이브러리
JDK: Java Development Kit의 약자로 자바 개발 환경에 대한 라이브러리로 JRE가 JDK에 포함된다.

Java Generic

같은 코드를 여러 타입의 객체를 통해 사용할 수 있도록 해주는 객체 지향 기법으로 코드의 재사용성을 높여준다.

인터페이스와 추상 클래스

  • 추상 클래스: 한개 이상의 추상 메서드가 포함되어 있는 클래스를 의미한다. 추상 클래스는 일반 메서드도 가질 수 있고 생성자도 가질 수 있다. 인스턴스를 만들 수 없고 상속 후 추상 메서드를 구현하면 인스턴스 생성이 가능하다.
  • 인터페이스: 모든 메서드가 추상 메서드인 경우를 말한다. 인터페이스 역시 인스턴스 생성이 불가능하다. 메서드가 구현되어 있지 않기 때문에 메서드의 모호함이 없어 클래스와 다르게 다중 상속이 가능하다.

Java throw, throws

  • throw: 에러를 발생시키기 위해 명시
  • throws: 발생할 수 있는 에러에 대한 명시

Static

  • static 변수: 프로세스 시작될 때 할당되기 때문에 전역 변수를 사용하고 싶을 경우 선언
  • static 메서드: 프로세스가 시작될 때 할당되기 때문에 클래스 인스턴스 선언 없이 사용 가능하나 메서드 내에서 클래스 변수는 static 변수만 사용 가능하다.

내부 클래스

클래스 내에 선언된 클래스로 두 클래스가 서로 긴밀한 관계일 때 내부 클래스를 사용한다. 두 클래스 간에 서로 접근할 수 있고 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.

String, StringBuffer, StringBuilder

String: 한번 생성되면 할당된 메모리 공간이 변하지 않는다.

StringBuffer, StringBuilder

  • 공통점: 문자열 연산 등으로 기존 객체의 공간이 부족하게 되는 경우 기존 버퍼 크기를 늘리며 유연하게 동작한다. 메서드 역시 동일하게 제공한다.
  • 차이점: StringBuffer는 각 메서드별 Synchronized Keyword가 존재하여 동기화를 지원한다.

Error, Exception

Error: 시스템 상에서 발생하는 오류로 프로그램이 종료될 수 있는 심각한 오류임
Exception: 개발자의 로직 문제로 인해 발생되는 오류인 경우가 많고 예외 처리를 통해 해결이 가능함

컴파일 에러, 런타임 에러

컴파일 에러: 자바 파일을 컴파일 하는 과정에서 발생, 문법 에러인 경우가 많음
런타임 에러: 실행 단계에서 발생하는 오류, 로직 문제인 경우가 많음

Spring

IOC 제어의 역전

Inversion of Control의 약자로 제어의 역전이라는 의미를 가지고 있다. 객체에 대한 제어를 개발자가 하지 않고 프레임워크가 하게 되는 것을 의미한다. 스프링에서는 IoC 컨테이너가 해당 역할을 수행한다.

객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있고 가독성 및 코드 중복면에서도 이점이 있다.

JPA의 eager, lazy

eager: 해당 객체가 호출 됨과 동시에 요청을 하게 되는 것을 말한다.
lazy: 실제로 쓰일 때까지는 요청하지 않고 있다가 실제로 사용될 때 요청하여 최대한 요청을 미루는 방식이다.

Spring Security

스프링 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다.

POJO (Plain Old Java Object)

Java 코드를 이용하여 객체를 구성하는 방식을 그대로 스프링에 적용할 수 있는 것을 의미한다.
자유로운 객체지향적 설계가 가능하여 높은 생산성과 유연한 테스트가 가능하다.

DI (Dependency Injection)

스프링 내부의 객체들 간의 관계를 관리할 때 사용하며 특정 객체에 필요한 객체를 외부에서 결정하여 연결시키는 것을 말한다.
의존성 주입의 방법: 필드 주입, setter 주입, 생성자 주입

관점 지향 프로그래밍 AOP

반복적인 코드를 줄이고 개발자가 핵심 비즈니스 로직에 집중할 수 있도록 해준다.

공통 관심 사항 (cross-cutting concern), 핵심 관심 사항(core concern) 두 가지가 있을 경우
공통 관심 사항에 관한 코드를 일일이 작성하지 않고 AOP를 통해 공통 로직을 적용할 수 있다.

Singleton

객체의 인스턴스가 오직 1개만 생성되는 패턴을 의미한다.

  • 장점
    • 인스턴스가 오직 1개만 생성되기 때문에 메모리가 절약된다. 속도 측면에서도 이점이 있다.
    • 싱글톤 패턴의 경우 전역으로 인스턴스가 생성되기 때문에 인스턴스 간의 데이터 공유가 쉽다.
  • 단점
    • 싱글톤 패턴 구현을 위한 코드가 추가로 필요하다.
    • 테스트가 어렵다. 인스턴스 간의 자원을 공유하고 있기 때문에 격리된 환경에서 테스트를 진행하기 위해서는 매번 인스턴스의 상태를 초기화시켜 주어야 한다.
    • new 키워드를 클래스 내에 위치시켜 객체를 생성하므로 DIP, OCP 원칙을 위반할 가능성이 높다.

기타

JWT의 구성

header: 암호화 알고리즘, 토큰의 타입
payload: 회원의 정보
signature: 서명이라는 의미로 서버에서 지정한 키 값이 담겨있다.

TCP, HTTP, HTTPS

tcp: 인터넷 프로토콜의 핵심 프로토콜 중 하나로 주로 서버와 클라이언트간에 데이터를 신뢰성 있게 전달하기 위해 사용한다.
HTTP: 네트워크 장치 간에 정보를 전송하도록 설계된 애플리케이션 계층의 프로토콜을 말한다. 주로 웹 브라우저와 같은 인터넷 통신 플랫폼에서 필요한 정보를 요청하는 방법이다.
HTTPS: HTTP 프로토콜의 암호화된 버전으로 SSL, TLS 등을 활용하여 암호화한다.
SSL: 브라우저와 서버 사이의 암호화된 연결을 수립하는데 사용되는 디지털 인증서

Redis

모든 데이터를 메모리에 저장하는 인메모리 형태의 데이터베이스로 key, value 형태의 NO SQL 형태를 띈다.
지속성을 보장하기 위해 데이터를 disk에 저장할 수 있고 서버가 내려가더라도 disk에 저장된 데이터는 유지된다.

웹소켓 (WebSocket)

하나의 TCP 접속에 전이중(full duplex) 통신 채널을 제공하는 컴퓨터 통신 프로토콜을 말한다.

OSI 7 계층

네트워크에서 통신이 일어나는 과정으로 물리계층, 데이터 링크 계층, 네트워크 계층, 전송 계층, 세션 계층, 표현 계층, 응용 계층으로 구성되어 있다.

가상환경과 컨테이너

공통점
- 독립적인 환경에서 작업을 진행하고자 할 때 사용한다.
차이점
- 가상머신: 하드웨어 수준의 격리 기술로 복제된 컴퓨팅 환경을 통해 여러 종류의 운영체제를 사용할 수 있는 환경을 제공한다. 각각의 가상머신마다 운영체제가 설치되기 때문에 성능 문제가 발생할 수 있따.
- 컨테이너: 운영체제 수준의 격리 기술로 동일한 운영체제 환경에서 실행환경을 독립적으로 운용할 수 있는 환경을 제공한다.

출처

http://asfirstalways.tistory.com/158
https://velog.io/@pearl0725/JVM은-어떤-역할을-할까
https://alswns1201.medium.com/면접-대비-및-java-관련-이론-정리-6e3f0bbe0fd5
https://joychae.tistory.com/27
https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
https://leveloper.tistory.com/33

0개의 댓글

관련 채용 정보