Call by reference란 무엇이고 보통 어떻게 쓰이나요?
Call by Reference: 메모리 주소를 넘겨서 원본의 메모리 값에 영향을 줌
Call by Value: 메모리 주소를 안넘기고 매개변수의 값만 넘겨서 원본의 메모리값에 영향을 안줌
Override 와 Overload 를 설명해주실 수 있을까요?
Overload: 같은 메소드 명에 매개변수가 다른 것
Override: 같은 메소드 명에 매개변수가 같은 것, 재정의 하는 것
JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?
간단한 쿼리 작성, 생산성 향상, 유지보수 용이성 JPA를 사용하는게 좋음
속도 이슈나 복잡한 쿼리를 사용 할 경우에는 필요하지 않습니다.
JPA의 더티 체킹이란 무엇인가요?
영속성 컨테이너가 관리하는 엔티티의 상태 감지
변경된 부분을 자동으로 트랜잭션 끝날 때 데이터베이스에 반영
JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?
Java Virtual Machine, 자바 가상 머신
자바와 OS의 중재자 역할 컴파일된 바이트 코드를 기계어로 변환해서 자바 바이트 코드를 실행
스택 기반, GC, 메모리 관리도 한다.
Java가 컴파일되는 과정은 어떻게 되는지 설명해주실 수 있을까요?
- 소스코드(java)를 자바 컴파일러가 컴파일
- 자바 바이트 코드(class)로 생성
- JVM 클래스 로더에 전달
- 클래스 로더에 동적 로딩으로 JVM 메모리에 올림
- JVM 메모리에서 바이트 코드들을 실행
- 인터프리터: 하나씩 읽음
- JIT컴파일러: 바이트 코드 전체 컴파일해서 바이너리 코드로 변경
1주차 모의 면접 회고
- 두괄식이 아니다.
- 말이 너무 정리가 안되어있다.
- 너무 질질 끌면 안된다.
- 끝맺음을 잘해야한다.
JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?
스택: 매개변수, 지역변수, 기본형 저장 메소드 호출 시 할당되고 종료되면 사라짐
힙: 참조형, 객체 ,배열 저장 호출이 끝나도 삭제가 안되고 GC로 삭제가 됨
클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?
클래스: 인스턴스를 만들기 위한 설계도
인스턴스: 클래스를 구현한 실체
Garbage Collector의 역할, 원리, 알고리즘에 대해 아는 만큼 설명해주실 수 있을까요?
역할: 사용하지 않는 객체 메모리 회수, 사용 중인 객체 추적
원리: 참조되는 횟수 0이 되면 객체를 회수, 루트 객체부터 모든 객체를 식별하여 순환 참조 문제 해결
알고리즘:
- Mark and Sweep: 도달 가능 객체 표시, 못하면 식별 후 회수
- Generational GC: 객체를 세대로 나눠서 오랫동안 살아남는 객체는 적게 회수
- Copying GC: 메모리를 두 영역으로 나눠서 복사하는 방식으로 GC 수행
Java Map의 내부 구현은 어떻게 이루어져 있을지 추측해보실 수 있을까요?
4개의 구현체를 제공
HashMap: 해시 테이블 사용, Key의 해시코드를 계산 순서보장 안됨
TreeMap: 레드-블랙 트리 사용, 정렬된 순서 유지
LinkedHashMap: 해시 테이블과 연결 리스트 사용, 순서 유지
ConcurrentHashMap: 해시 버킷을 세그먼트로 나눔, 여러 쓰레드 병렬로 작업 가능
DI와 IoC에 대해 아는 만큼 설명해주실 수 있을까요?
DI: 의존성 주입 즉 외부에서 주입받는 개념 그리고 DI는 IoC의 한 형태
IoC: 제어의 역전 즉 제어 흐름을 외부 컨테이너에 의해 결정, Spring이 IoC 컨테이너를 제공
MVC 모델이란 무엇인지 설명해주실 수 있을까요?
소프트웨어 디자인 패턴, 사용자 인터페이스를 구성하는 세가지를 분리하여 서로에게 영향을 미치지 않으며 협력하게 하는 패턴
Model: 데이터와 비즈니스 로직 담당
View: 사용자에게 정보 표시
Controller: 사용자 입력을 받고, 처리를 수행 후 모델과 뷰의 통신 조정
단점: View와 Model 사이의 의존성이 높다는 점.
Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?
Annotation이란 메타데이터를 제공해서 컴파일 시간, 실행 시간에 애플리케이션 동작을 조정하는데 사용합니다.
구체적으로 리플렉션과 어노테이션 프로세서를 활용하여 메타데이터를 처리 후 스프링 컨테이너에 빈을 등록하여 애플리케이션을 효과적으로 관리합니다.
@Component
Spring에서 관리되는 객체임을 표시하기 위해 사용하는 가장 기본적인 annotation이다. 즉, scan-auto-detection과 dependency injection을 사용하기 위해서 사용되는 가장 기본 어노테이션이다.
@Controller
Web MVC 코드에 사용되는 어노테이션이다. @RequestMapping 어노테이션을 해당 어노테이션 밑에서만 사용할 수 있다.
@Repository
이것은 Annotation based Configuration, @Repository의 작업은 플랫폼 별 예외를 잡아서 Spring의 통합 검사되지 않은 예외 중 하나로 다시 던지는 것입니다. 이를 위해 PersistenceExceptionTranslationPostProcessor이 제공되며 다음과 같이 Spring의 애플리케이션 컨텍스트에 추가해야합니다.
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
이 빈 포스트 프로세서는 @Repository로 주석이 달린 모든 빈에 권고자를 추가하여 플랫폼 별 예외를 포착 한 다음 Spring의 확인되지 않은 데이터 액세스 예외 중 하나로 다시 발생시킵니다.
@Service
비즈니스 로직이나 respository layer 호출하는 함수에 사용된다. 다른 어노테이션과 다르게 @Component에 추가된 기능은 없다. 하지만 나중에 Spring 측에서 추가적인 exception handling을 해줄 수도 있으니 비즈니스 로직에는 해당 어노테이션을 사용하자.
2주차 모의 면접 회고
- 말을 좀 천천히 하는게 좋을 것 같다.
- 꼬리질문에 대해 더 파악이 필요
Spring Security의 구조와 JWT 발급 과정에 대해 설명해주실 수 있을까요?
Spring Security는 애플리케이션에 대한 포괄적인 인증 및 액세스 제어 메커니즘을 제공하는 프레임워크입니다. 이 구조에는 보안을 강화하기 위해 함께 작동하는 필터, 공급자 및 구성이 포함됩니다.
JWT 발급 과정은 사용자 인증, 토큰 생성, 토큰 전송, 서버 측 검증 입니다.
Spring Security 구조:
- SecurityContextHolder: 현재 실행 중인 스레드의 보안 컨텍스트를 제공합니다.
- AuthenticationManager: 실제 인증을 수행하는데 사용되며, Authentication 객체를 반환합니다.
- AuthenticationProvider: AuthenticationManager가 사용하는 구성 가능한 컴포넌트로, 실제로 사용자를 인증합니다.
- UserDetailsService: 사용자의 정보를 로드하는 데 사용되며, 사용자 이름이나 ID를 기반으로 UserDetails 객체를 반환합니다.
- GrantedAuthority: 사용자에게 부여된 권한을 나타내는 인터페이스로, 권한의 목록을 가지고 있습니다.
JWT 발급 과정:
- 사용자 로그인: 사용자가 로그인하면, 인증 매커니즘을 통해 사용자 정보를 인증하고 UserDetails 객체를 생성합니다.
- JWT 생성: UserDetails 객체를 사용하여 JWT를 생성합니다. JWT에는 사용자 정보와 권한 등이 포함됩니다.
- JWT 서명: 생성된 JWT에 서명을 추가하여 변조 방지를 위해 보안을 강화합니다.
- 응답에 포함: JWT를 클라이언트에게 응답으로 반환하거나, HTTP 헤더나 쿠키에 담아 전송합니다.
이 과정에서 Spring Security에서는 JwtAuthenticationFilter
나 JwtAuthenticationProvider
등과 같은 클래스를 통해 JWT 기반의 보안을 구현할 수 있습니다. 또한, JwtTokenProvider
와 같은 유틸리티 클래스를 사용하여 토큰 생성 및 검증을 수행합니다.
N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다.
N+1 문제 발생 이유: ORM을 사용 할 때 관계형 데이터베이스에서 데이터를 가져 올 때 추가적인 N개의 쿼리가 발생하는 것
해결 방법 3가지
- 적절한 쿼리 최적화: JPQL, 쿼리 힌트, @NamedEntityGraph, FetchType.EAGER 사용
- 페치 조인 사용: 관련된 엔티티를 한 번에 로딩하여 해결
- 일괄 처리: 한 번에 여러 엔티티를 가져와서 해결
즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있을까요?
즉시로딩은 초기 로딩 속도를 중시할 때 사용
지연로딩은 특정 상황이나 사용자 요청에 따라 데이터를 동적으로 가져올 때 사용
Spring bean container 생성부터 스프링 종료까지의 사이클에 대해 알려주실 수 있을까요? @PostConstruct, @PreDestroy 어노테이션의 역할도 함께 알려주시면 좋습니다.
- Bean Definition 생성
- 스프링 컨테이너 시작 될 때, XML, Java Config 읽음
- Bean Instanttation (빈 생성)
- 빈의 클래스를 실제 객체로 생성 (기본 생성자, 팩토리 메서드)
- 의존성 주입 (DI)
- 빈에 의존성 주입, 프로퍼티나 생성자를 통해 의존성 해결
- Bean Initialization (빈 초기화)
- @PostConstruct 어노테이션 호출 빈을 초기화
- Bean Ready for Use (빈 사용 가능)
- 빈 초기화 후 해당 빈을 사용
- Bean Destruction (빈 소멸)
- 애플리케이션 종료, 빈이 필요하지 않을 때 @PreDestory 어노테이션 호출, 빈을 소멸
AOP, Interceptor, Filter 의 차이점, Request가 들어올때 거치는 순서, 각 역할들의 장점을 설명해주실 수 있을까요?
AOP, Interceptor, Filter는 코드의 흐름을 제어하고 특정 기능을 추가 또는 수정하는 메커니즘입니다.
AOP는 횡단 관심사를 효과적으로 다루며,
Interceptor는 주로 웹 애플리케이션에서 사용되어 요청과 응답 처리 사이에 끼어듭니다.
Filter는 서블릿에서 요청과 응답을 처리하며 주로 HTTP 관련 작업을 수행합니다.
순서는 Filter가 가장 먼저 실행되고, 이후 Interceptor와 AOP가 실행됩니다. 각각의 장점을 통해 코드의 모듈화와 재사용성을 높일 수 있습니다.
NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.
RDBMS
장점: 데이터 일관성, 성능 최적화
단점: 확장 어려움
NoSQL
비정형 및 반정형 데이터, BASE 특성, 수평적 확장
장점: 확장성, 다양한 데이터 형식 지원
단점: 일관성 관리 어려움, 쿼리의 한계
MVC 패턴에 대해서 설명해주세요.
MVC 패턴은 소프트웨어 디자인 패턴으로, 애플리케이션을 모델(데이터와 비즈니스 로직), 뷰(사용자 인터페이스), 컨트롤러(입력 처리 및 모델-뷰 중개)로 나눠 개발하는 방법입니다. 각 부분은 독립적으로 존재하며, 모델의 변경은 뷰와 컨트롤러에 알려 업데이트를 유도합니다. 이 패턴은 유지보수성과 확장성을 높이며, 각 구성 요소 간의 강력한 결합을 방지
RDBMS의 정규화에 대해 설명해주세요.
RDBMS의 정규화는 데이터베이스 설계에서 중복을 최소화하고 데이터의 무결성을 보장하기 위한 프로세스
- 제 1 정규화 (1NF): 테이블 내의 모든 속성은 원자값(Atomic Value)을 가지며, 각 열은 유일한 이름을 가져야 합니다. 이를 통해 중복을 최소화하고 데이터 정렬을 용이하게 합니다.
- 제 2 정규화 (2NF): 테이블이 1NF를 만족하면서 부분 함수 종속을 제거하는 단계입니다. 기본키가 아닌 속성이 기본키에 완전 종속되어야 합니다.
- 제 3 정규화 (3NF): 테이블이 2NF를 만족하면서 이행적 함수 종속을 제거합니다. 어떠한 비주요 속성도 기본키가 아닌 다른 비주요 속성에 종속되어서는 안 됩니다.
- 보이스-코드 정규형 (BCNF): 3NF를 만족하면서 후보 키가 아닌 속성이 다른 후보 키에 종속되어 있지 않아야 합니다.
Primary Key, Foreign Key에 대해 설명해주세요.
- Primary Key (기본키):
- 기본키는 특정 릴레이션(테이블)에서 각 행을 유일하게 식별할 수 있는 열 또는 열의 조합입니다.
- 기본키는 해당 테이블의 각 행을 고유하게 식별하며, 중복된 값이나 NULL이 포함될 수 없습니다.
- 테이블에는 하나의 기본키만 가질 수 있습니다.
- 예를 들어, 사용자 테이블의 경우 사용자 ID가 기본키가 될 수 있습니다.
- Foreign Key (외래키):
- 외래키는 다른 테이블의 기본키와 연결된 특정 열 또는 열의 조합입니다.
- 외래키는 관계를 정의하고, 참조 무결성을 유지하는 데 사용됩니다. 즉, 외래키 값은 참조하는 테이블의 기본키 값이나 NULL이어야 합니다.
- 예를 들어, 주문 테이블의 경우 사용자 ID가 외래키로 사용될 수 있으며, 이는 사용자 테이블의 기본키와 연결된다.
HTTP 메서드에 대해 설명해주세요.
HTTP(하이퍼텍스트 전송 프로토콜) 메서드는 클라이언트와 서버 간의 통신에서 사용되는 요청의 종류를 나타냅니다. 각 메서드는 특정한 동작을 수행하며, 다양한 작업을 지원합니다.
CORS(Cross Origin Resource Sharing)에 대해 설명해주세요.
CORS는 다른 출처의 리소스를 공유할 수 있게 해주는 웹 보안 메커니즘입니다. 보안상의 이유로 웹페이지에서 발생하는 대부분의 요청은 '동일 출처 정책’을 따르도록 되어 있어요. 하지만 CORS를 사용하면 웹 애플리케이션이 자신의 출처와 다른 출처의 리소스에 접근이 가능
브라우저의 작동방식에 대해서 설명해주세요.
- 사용자 인터페이스
- 웹 페이지를 표시하는 부분을 제외한 모든 부분(주소창, 즐겨찾기 메뉴 등)
- 브라우저 엔진
- 사용자 인터페이스와 렌더링 엔진 사이의 동작을 중개
- 렌더링 엔진
- 요청받은 콘텐츠를 화면에 표시
- HTML과 CSS 파싱으로 DOM과 CSSOM을 구축한 후 렌더 트리를 생성하여 레이아웃과 페인팅 과정을 통해 화면에 렌더링
- 통신
- 네트워크 호출에 사용되는 HTTP 요청을 담당
- 플랫폼 별 구현이 다름
- 자바스크립트 인터프리터
- 스크립트 코드를 파싱하고 실행
- 자료 저장소
- 쿠키 같은 다양한 자료를 로컬에 저장하여 사용자 경험 향상
쿠키, 세션의 개념과 차이를 설명해보세요
쿠키 (Cookie)
- 정의: 사용자가 웹사이트를 방문할 때, 사용자의 컴퓨터에 저장되는 작은 텍스트 파일입니다.
- 목적: 사용자의 세션 추적, 웹사이트 설정 기억, 로그인 상태 유지 등에 사용됩니다.
세션 (Session) - 정의: 서버 측에서 사용자 정보를 저장하는 방법으로, 각 사용자마다 고유한 세션 ID를 발급하여 관리합니다.
- 목적: 사용자에 대한 더 안전한 정보 저장 방법을 제공하여, 로그인과 같은 중요한 정보를 관리하는 데 사용됩니다.
쿠키와 세션의 주요 차이점
- 저장 위치: 쿠키는 사용자의 브라우저에 저장되는 반면, 세션은 서버에 저장됩니다.
- 만료 시간: 쿠키는 사용자가 설정한 만료 시간까지 유지되고, 세션은 브라우저를 닫거나 설정된 시간이 지나면 종료됩니다.
- 저장 데이터 크기: 쿠키는 상대적으로 적은 데이터만 저장 가능하지만, 세션은 서버에 저장되기 때문에 더 많은 데이터를 저장할 수 있습니다.
- 보안: 세션은 서버 측에서 관리되므로 상대적으로 쿠키보다 더 안전합니다.
TCP/UDP에 대해서 설명해주세요.
TCP (Transmission Control Protocol)
TCP는 연결 지향적인 프로토콜로, 데이터를 보내기 전에 먼저 연결을 설정하고, 데이터 전송 후 연결을 종료합니다. TCP는 데이터의 순서를 보장하며, 재전송 기능을 통해 데이터의 정확성을 확보합니다. 이러한 특성 때문에 웹 브라우징, 이메일 전송, 파일 다운로드 등에 주로 사용됩니다.
UDP (User Datagram Protocol)
반면에 UDP는 비연결형 프로토콜로, 데이터를 보내기 전에 별도의 연결을 설정하지 않습니다. 또한, 데이터의 순서를 보장하지 않으며, 재전송 기능이 없어 데이터의 정확성을 보장하지 않습니다. 그러나 이러한 특성 때문에 빠른 전송도를 요구하는 응용 분야(예: 스트리밍, 온라인 게임)에서 주로 사용됩니다.
요약하면, TCP는 신뢰성이 중요한 데이터 전송에 사용되며, UDP는 속도가 중요한 데이터 전송에 사용됩니다.
http, https 차이점에 대해 설명해주세요
- 보안: 이것이 가장 큰 차이점입니다. HTTP는 암호화되지 않은 반면, HTTPS는 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security)라는 보안 프로토콜을 사용하여 데이터를 암호화합니다. 이로 인해 사용자의 정보가 전송 중에 탈취되거나 조작되는 것을 방지할 수 있습니다.
- 포트: HTTP는 기본적으로 80번 포트를 사용하고, HTTPS는 443번 포트를 사용합니다.
- URL: HTTPS를 사용하는 웹사이트의 URL은 'https://'로 시작하며, 이것은 해당 사이트가 안전하다는 것을 사용자에게 알려줍니다.
- 속도: 일반적으로 HTTP가 HTTPS보다 빠릅니다. 이는 HTTPS가 데이터를 암호화하고 복호화하는 과정이 필요하기 때문입니다. 그러나 이 차이는 사용자가 실제로 느낄 수준은 아닙니다.
DI, IoC에 대해 설명해주세요.
객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?
대용량 트래픽 발생 시 어떻게 대응해야 하나요?
ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?
GET, POST의 개념과 함께 데이터 흐름에 대해서 설명해주세요.
OSI 7계층에 대해 아는대로 설명해주세요.
세션 기반 인증과 토큰 기반 인증의 차이에 대해 설명해주세요.
JWT, Refresh, Access Token에 대해서 설명해주세요.
OAuth에 대해서 설명해주세요.
HTTP 상태코드에 대해서 설명해주세요.
CI/CD에 대해서 설명해주세요.
TDD에 대해서 설명해주세요.
프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.
멀티프로세스와 멀티쓰레드의 특징에 대해 설명해주세요.
쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.
DB 로직 최소화를 하려면 어떻게 해야 할까요?
테스트코드에 대해서 아는대로 설명해주시고 활용 경험에 대해서 답변해주세요.
Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.
AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.
정렬 알고리즘에 대해서 아는대로 설명해주세요.
'항해99' 카테고리의 다른 글
항해99 실전 프로젝트 (9일차) (0) | 2024.02.05 |
---|---|
항해99 실전 프로젝트 (8일차) (0) | 2024.02.03 |
항해99 실전 프로젝트 (7일차) (0) | 2024.02.02 |
항해99 실전 프로젝트 (6일차) (0) | 2024.02.01 |
항해99 실전 프로젝트 (5일차) (0) | 2024.01.31 |