Spring 스프링은 네이버, 카카오, 쿠팡, 무신사 등 국내 기업에서 많이 쓰이는 Java 기반 백엔드 개발 프레임워크죠. 현재 스프링 기술 면접 준비를 하고 계시다면 이번 아티클에 주목해주세요. 많이 물어보시는 스프링 기술 면접 질문을 추렸습니다. 예상 질문부터 수강생의 답변과 멘토님의 피드백까지 한눈에 확인해보세요.
목차
Q 1. JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?
Q 2. Java가 컴파일 되는 과정은 어떻게 되는지 설명해주실 수 있을까요?
Q 3. JVM의 스택과 힙 메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?
Q 4. 클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?
Q (1). JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?
핵심 키워드 : OS, Write Once Run AnyWhere, 컴파일, 기계어, 자연어, 바이트 코드
🧑💻 수강생 답변
JVM은 Java Virtual Machine 으로 자바 프로그램을 실행시켜주는 가상 머신입니다. 일반적인 프로그램은 OS에 종속적이게 개발이 되었지만, Java는 각 OS에 맞게 제공된 JVM이 띄워질 수 있기에 같은 소스코드로 다른 OS에서 실행할 수 있게 됩니다. JVM이 주는 이점으로는 이것 이외에도 GC를 통해 프로그램의 메모리 관리를 해준다는 점도 있습니다.
🗣️멘토님 피드백
JVM이 무엇이고 왜 필요한지에 대해서 아주 잘 설명하고 있고 가비지 컬렉터 부분까지 이야기 한 부분도 잘하셨습니다. 다만 OS의 종속성을 벗어나기 위해 사용하는 점도 언급해주면 더 확실한 답변이 될 것 같습니다.
😄 좋은 부분
- JVM가 무엇이고 필요한 이유에 대해 설명한 부분 ”JVM은 Java Virtual Machine 으로 자바 프로그램을 실행시켜주는 가상 머신으로 일반적인 프로그램은 OS에 종속적이게 개발이 되었지만, Java는 각 OS에 맞게 제공된 JVM이 띄워질 수 있기에 같은 소스코드로 다른 OS에서 실행할 수 있다”
- 가비지 콜렉터 (Garbage Collector)를 언급해준 부분 ”GC를 통해 프로그램의 메모리 관리를 해준다”
🤔 아쉬운 부분
- Java는 OS의 종속성에 벗어나기 위해 사용한다는 부분 언급하지 않음
Q (2). Java가 컴파일 되는 과정은 어떻게 되는지 설명해주실 수 있을까요?
핵심 키워드 : 바이트 코드, class 파일, 기계어, 자연어
🧑💻 수강생 답변
개발자가 자바 소스코드 (.Java)를 작성하면, 자바 컴파일러가 이 소스코드를 읽어들여 바이트코드 (.class)로 컴파일하고, 이 컴파일된 바이트코드는 클래스 로더에게 전달됩니다. 그 후, 클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크해서 JVM 메모리에 올림으로써, 런타임 데이터를 준비합니다. 이 과정에는 세부 동작이 포함되는데, 클래스 파일을 JVM의 메모리에 로드하는 것부터 시작합니다. 이어서, 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사하며, 클래스가 필요로 하는 메모리를 할당하고, 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다. 마지막으로, 클래스 변수들을 적절한 값으로 초기화하여 실행 준비를 완료합니다.
이 모든 준비가 완료된 후, 실행엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 실행엔진은 주로 두 가지 방식으로 작동합니다. 첫 번째 방식인 인터프리터는 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 이 방식은 각 명령어의 실행은 빠르지만 전체적인 실행 속도가 느리다는 단점이 있습니다. 이를 보완하기 위해, 두 번째 방식인 JIT 컴파일러가 도입되었습니다. JIT 컴파일러는 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고, 이후에는 해당 메서드를 더 인터프리팅하지 않고 바이너리 코드로 직접 실행하는 방식을 채택합니다. 이 때문에 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이므로 전체적인 실행 속도가 인터프리터 방식보다 훨씬 빠르다는 장점이 있습니다. 이러한 과정을 통해 자바 프로그램이 효과적으로 실행됩니다.
🗣️멘토님 피드백
Java가 콤파일되는 과정을 로딩 단계, 실행 단계로 나누어 세밀하게 잘 설명했고 특히 실행 준비하는 과정을 세부적으로 나눠서 설명한 부분이 좋았습니다.
😄 좋은 부분
- Java가 콤파일 되는 과정을 로딩 단계, 실행 단계로 나누어 세밀하게 설명 “개발자가 자바 소스코드 (.Java)를 작성하면, 자바 컴파일러가 이 소스코드를 읽어 들여 바이트코드 (.class)로 컴파일하고, 이 컴파일된 바이트코드는 클래스 로더에게 전달됩니다. 그 후, 클래스 로더는 동적로딩을 통해 필요한 클래스들을 로딩 및 링크해서 JVM 메모리에 올림으로써, 런타임 데이터를 준비합니다” (로딩 단계) “실행엔진은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행하고 작동하는 방식으로 첫 번째 ‘인터프리터’ 두 번째 ‘JIT 컴파일러’가 있다” (실행 단계)
- 실행 준비하는 과정을 총 5단계로 나눠서 세부적으로 설명
1- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드
2- 검증 : 자바 언어 명세 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
3- 준비 : 클래스가 필요로 하는 메모리 할당
4- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경
5- 초기화 : 클래스 변수들을 적절한 값으로 초기화함
Q (3). JVM의 스택과 힙 메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?
핵심 키워드 : 정적 / 동적 할당, 스레드, GC, 생성, 수거
🧑💻 수강생 답변
스택과 힙 메모리는 Java 프로그램의 메모리 관리 영역으로, 각각의 특징을 다음과 같이 설명할 수 있습니다. 스택 메모리는 자바 프로그램에서 각 스레드마다 별도로 할당되며 메서드 호출 시 호출 스택 프레임이 생성되며 이 프레임에는 지역 변수와 메서드 호출 정보가 저장됩니다. 스택 메모리는 후입 선출 (LIFO) 구조로 동작하며 메서드 실행이 완료되면 해당 스택 프레임이 제거됩니다. 스택 메모리는 주로 메서드 호출과 관련된 데이터를 저장하고 상대적으로 작은 크기를 가지며 메모리 관리는 자동으로 이루어져 개발자의 개입이 적습니다.
힙 메모리는 모든 스레드에 의해 공유되며 자바 프로그램에서 동적으로 할당되는 객체와 배열을 저장하는 데 사용됩니다. 객체는 힙 영역에서 생성되며 객체들의 참조(Reference)는 스택 메모리에 저장됩니다. 힙 메모리는 가변 크기를 가지고 있어서 대규모 데이터 구조를 저장하고 동적 메모리 할당 및 해제를 할 수 있으며 유연한 메모리 관리를 제공합니다. 또한 가비지 컬렉션을 통해 사용되지 않는 객체는 정리하고 메모리를 회수합니다.
🗣️멘토님 피드백
스택 메모리와 힙 메모리가 가지는 특징을 저장방식, 가변 크기, 가비지 컬렉터로 나누어서 설명을 잘한 답변입니다.
😄 좋은 부분
- 스택 메모리를 저장 방식, 가변 크기, 가비지 컬렉터 3가지 특징으로 나눠서 설명 “자바 프로그램에서 각 스레드마다 별도로 할당되며 메서드 호출 시 호출 스택 프레임이 생성되며 이 프레임에는 지역 변수와 메서드 호출 정보가 저장됩니다. 스택 메모리는 후입 선출 (LIFO) 구조로 동작하며 메서드 실행이 완료되면 해당 스택 프레임이 제거된다” (저장 방식) ”메서드 호출과 관련된 데이터를 저장하고 상대적으로 작은 크기를 가진다” (가변 크기) “메모리 관리는 자동으로 이루어져 개발자의 개입이 적다” (가비지 컬렉터)
- 힙 메모리를 저장 방식, 가변 크기, 가비지 컬렉터 3가지 특징으로 나눠서 설명 ”힙 메모리는 모든 스레드에 의해 공유되며 자바 프로그램에서 동적으로 할당되는 객체와 배열을 저장하는 데 사용됩니다. 객체는 힙 영역에서 생성되며 객체들의 참조(Reference)는 스택 메모리에 저장된다” (저장 방식) ”가변 크기를 가지고 있어서 대규모 데이터 구조를 저장하고 동적 메모리 할당 및 해제를 할 수 있으며 유연한 메모리 관리를 제공한다” (가변 크기) “가비지 컬렉션을 통해 사용되지 않는 객체는 정리하고 메모리를 회수한다” (가비지 컬렉터)
Q (4). 클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?
핵심 키워드 : 객체 정의, 설계, 생성(new)
🧑💻 수강생 답변
클래스(Class)와 인스턴스(Instance)는 객체 지향 프로그래밍에서 중요한 개념으로, 다음과 같이 차이가 있습니다. 클래스 (Class)는 객체를 생성하기 위한 일종의 청사진(blueprint) 또는 템플릿(template) 역할을 합니다. 클래스는 객체의 속성(attribute)과 동작(behavior)을 정의합니다. 즉, 어떤 객체가 가져야 할 속성과 어떤 동작을 수행해야 하는지를 정의합니다.클래스는 객체를 생성하기 위한 설계도로 생각할 수 있으며, 여러 객체가 공유하는 특성을 정의합니다. 예를 들어, "자동차" 클래스는 자동차 객체가 가져야 할 속성(색상, 모델 등)과 동작(주행, 정지, 브레이크 등)을 정의할 수 있습니다.
인스턴스 (Instance)는 클래스를 기반으로 실제로 생성된 객체(object)를 나타냅니다.클래스는 설계도일 뿐, 실제로 프로그램에서 사용되는 데이터나 객체는 인스턴스를 생성함으로써 만들어집니다. 인스턴스는 클래스의 속성과 동작을 실제 값으로 가지고 있으며, 각각의 인스턴스는 독립적입니다. 예를 들어, "자동차" 클래스로부터 "BMW 3시리즈 빨간색 자동차"와 "Toyota 카롤라 파란색 자동차"와 같은 여러 차량 인스턴스를 생성할 수 있습니다.간단히 말하면, 클래스는 객체의 설계를 정의하고, 인스턴스는 클래스에 따라 생성된 실제 객체를 나타냅니다. 클래스는 여러 인스턴스를 생성할 수 있으며, 각 인스턴스는 클래스의 정의에 따라 독립적인 데이터와 동작을 가집니다. 이러한 객체 지향 프로그래밍의 개념은 코드의 재사용성, 유지 보수성, 그리고 코드 구조화에 도움을 줍니다.
🗣️멘토님 피드백
클래스와 인스턴스의 정의와 특징을 잘 설명했고,자동차로 예시를 들어서 이들의 차이점을 이해하기 쉽도록 잘 설명했습니다.
😄 좋은 부분
- 클래스(Class) 정의와 특징을 말하고 자동차로 예시를 듦 ”객체를 생성하기 위해 청사진 또는 템플릿의 역할을 하고 객체의 속성과 동작을 정의하며 어떤 객체가 가져야 할 속성과 어떤 동작을 정의한다” (정의) ”클래스는 어떤 객체가 가져야 할 속성과 동작을 수행해야 하는지를 정의하기 때문에 여러 객체가 공유하는 특성을 정의한다” (특징) "자동차 클래스는 자동차 객체가 가져야 할 속성(색상, 모델 등)과 동작(주행, 정지, 브레이크 등)을 정의할 수 있다” (예시)
- 인스턴스 (Instance) 정의와 특징을 말하고 자동차로 예시를 듦 ”클래스를 기반으로 실제로 생성된 객체(object)를 나타낸다” (정의) ”인스턴스는 클래스의 속성과 동작을 실제 값으로 가지고 있으며 각각의 인스턴스는 독립적이다” (특징) ”’자동차’ 클래스로부터 ‘BMW 3 시리즈 빨간색 자동차’와 ‘Toyota 카롤라 파란색 자동차’와 같은 여러 차량 인스턴스를 생성할 수 있다” (예시)
스프링 (Spring) 기술 면접 질문, 도움이 되셨나요? 기술면접 대비는 현직 개발자의 시선에서 어떤 답변이 좋을 지를 파악할 수 있어서 취업 리부트 코스 수강생들의 만족도가 가장 높은 세션 중 하나 인데요. 앞으로도 React, Spring의 기술면접 Q&A를 꾸준히 발행할 예정이니, 관심이 있다면 항해99 블로그를 구독해주세요.
🚢 개발자 취업 준비 어떻게 시작해야 할지 모르겠나요? 취업으로 향하는 거친 항해에서 든든한 메이트가 되어 드리겠습니다.
취업 실패 시 교육비 0원. 반드시 취업까지 책임질 수 있다는 항해의 자신감입니다.
높은 수준의 개인 프로젝트 경험이 없는 개발 유관 전공자, 전반적인 학습이 부족한 부트캠프 수료생이라면 개발자 취업 리부트 코스에 합류하세요. 자료구조 공부, 프로젝트, 코테준비, 이력서와 면접 대비까지 취업 리부트 코스에서 한 번에 할 수 있습니다. 갈수록 높아지는 개발자 취업의 벽, 개발자 취업 리부트 코스로 11주 만에 취업의 문을 열어 보세요
CREDIT
글 | 송민영 팀스파르타 에디터
Share article
Subscribe to our newsletter