본문 바로가기

archive

프론트엔드 / 백엔드 면접 대비 자주 묻는 질문 정리 - Java

되도 않는 이력서로 열심히 지원을 하는 중인데, 면접을 대비해서 미리미리 정리해놓는 것이 좋을 것 같다고 생각했다. 그리고 운 좋게 서류를 합격해서 면접을 보게 된다면, 그것 또한 정리해서 글을 쓸 생각이다.

 

일단 내가 자주 가는 커뮤니티에서 본 것들과 구글링을 통해 공통적으로 자주 등장하는 질문들을 추리고, 내 나름대로 이해할 수 있게끔 정리할 것이다. 내가 머리가 좋지 않아 최대한 쉽게 정리할 거다.... 난 왜 이렇게 이해력이 떨어지는 걸까...? 눈물 나네...

 

 

Java 

 

 

1. Java란 무엇인가?

 

  • 1995년 1월 썬 마이크로시스템즈에서 발표한 객체 지향 프로그래밍 언어
  • JVM(Java Virtual Machine)으로 인해 운영 체제(플랫폼)에 독립적이라는 중요한 특징을 가지고 있다.
  • 그로 인해 자바로 작성된 프로그램은 운영체제나 CPU에 상관없이 실행이 가능하다.
  • 작성된 언어는 .java 파일로 저장되고, 이 파일은 자동으로 컴파일되어 .class 파일로 저장되는데, 이때 bytecode로 저장이 된다. 이 bytecode가 JVM을 실행하는 명령어의 형태이다.
  • Garbage Collection이 메모리를 자동으로 관리해준다.
  • 다양한 애플리케이션 개발에 용이하며, 멀티 쓰레드를 쉽게 구현할 수 있다.
  • 동적 로딩을 지원하며 오픈 소스 라이브러리가 풍부하다. 

 

2. 객체 지향 프로그래밍(OOP ; Object Oriented Programming)이란 무엇인가?

 

  • 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 객체(Object)라는 기본 단위로 나누고 이들의 상호 작용을 통해 로직을 구성하는 프로그래밍 방법
  • 캡슐화, 추상화, 상속성, 다형성의 4가지 특징을 가지고 있다.
1. 캡슐화 : 변수와 함수를 하나의 단위로 묶는 것(데이터 번들링). 클래스를 통해 구현되며 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함되어 있는 멤버 변수와 메서드에 접근할 수 있음(정보 은닉). 데이터와 코드의 형태를 숨길 수 있으며, 모듈 간의 결합도를 떨어트려 유연함과 유지 보수성을 높임.

2. 추상화 : 공통의 속성이나 기능을 묶어 이름을 붙이는 것. 불필요한 정보를 숨기고 중요한 정보만 표현함으로써 프로그램을 보다 간단하게 만들어줌. 객체 지향적 관점에서 클래스를 정의하는 것을 '추상화'라고 정의 내릴 수 있음. 

예를 들어, 고양이, 너구리, 사자, 호랑이 등을 객체라고 할 수 있고 이 객체들을 하나로 묶어야 한다면 '동물' 혹은 '생물'이라는 이름으로 묶을 수 있음. 이것을 추상화라고 함.

- 추상 클래스 : 클래스의 공통적인 속성(변수, 메서드 등)을 추출해서 선언한 클래스.
- 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.
- 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언해놓으면 이 클래스를 상속 받는 모든 클래스에서는 이것을 반드시 재정의 해야 한다.

- 추상 클래스의 특징
(1) 클래스 앞에 abstract 키워드를 붙여 정의한다.
(2) 미완성의 추상 메소드를 포함할 수 있다.
(3) 추상 클래스만으로는 객체를 생성할 수 없다. 이 추상 클래스를 상속한 자식 클래스에서 객체를 생성할 수 있다.
(4) 상속의 일반적인 특징과 같다.

- 추상 클래스의 사용 목적 : 추상 메소드가 포함된 클래스를 상속 받는 자식 클래스가 추상 메소드를 반드시 구현하기 위함이다. 상속을 강제하는 것.

- 추상 클래스의 장점
(1) 추상 클래스의 설계가 완료되면 자식 클래스에서 상속 받아 기능을 확장하는데에 용이.
(2) 자식 클래스에서 추상 메소드의 구현을 강요하기 때문에 표준화 정도를 높인다.
(3) 클래스들의 공통 사항을 한 곳에서 관리하기 때문에 개발 및 유지 보수가 편리하다.


3. 상속성 : 상위 클래스의 모든 것을 하위 클래스가 모두 이어받는 개념. 상속을 통해 캡슐화를 유지하는 동시에 클래스의 재사용을 가능하게 함. 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있음.

- 상속을 사용하는 목적 : 일련의 연관된 클래스에 대한 공통적인 규약을 정의하고 적용하기 위하여.

- 상속의 장점
(1) 기존에 작성된 클래스를 재활용할 수 있다.
(2) 하위 클래스, 즉 자식 클래스를 설계할 때 중복되는 멤버 변수들이 있다면 그것을 미리 상위 클래스(부모 클래스)에 작성해놓는다면 자식 클래스들은 그것을 다시 작성하지 않아도 된다.
(3) 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련한다.

- 상속의 특징
(1) 부모 클래스는 Super Class, 자식 클래스는 Sub Class라고도 한다.
(2) 다중 상속을 지원하지 않는다. extends 뒤에는 하나의 부모 클래스만 올 수 있다.
(3) 상속 횟수에 제한이 없다.
(4) 자바의 최상위 클래스는 Object이다. 자바의 모든 클래스는 Object의 자식이다.

4. 다형성 : 상속과 연관되어 있으며, 한 객체, 변수 또는 함수가 상황에 따라 다른 의미로 재구성 될 수 있음. 오버로딩과 오버라이딩이 있다.

- 오버로딩(Overloading) : 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 가지면서, 각각 매개 변수의 유형과 개수를 다르도록 하는 것. 다양한 유형의 호출에 응답할 수 있음.
- 오버로딩의 성립 요건 : 메서드 명이 같아야 하고, 매개 변수는 달라야 함. 매개 변수는 같지만 리턴 타입이 다르면 성립 X. 오버로딩된 메서드들은 매개 변수로만 구분이 가능함. 

- 오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 상속받아 재정의하여 사용하는 것. 
- 오버라이딩의 성립 요건 : 이름, 매개 변수, 리턴 타입이 같아야 함.

 

 

  • 객체 지향 설계의 5가지 원칙 - SRP, OCP, LSP, ISP, DIP (SOLID)
1. SRP(Single Responsibility Principle) - 단일 책임 원칙

하나의 클래스는 하나의 기능만 가져야 한다. 

2. OCP(Open/Closed Principle) - 개방-폐쇄의 원칙

자신의 확장에는 개방되어 있고, 주변의 변화에 대해서는 폐쇄되어 있어야 한다. 

3. LSP(Liskov Substitution Principle) - 리스코프 치환 원칙

하위 타입 객체는 상위 타입 객체에서 가능한 행위를 수행할 수 있어야 한다. 즉, 상위 타입 객체를 하위 타입 객체로 바꾸어도 정상적으로 동작해야 한다는 뜻.
상속 관계가 아닌 클래스들을 상속 관계로 설정하면 이 원칙이 어긋난다.

4. ISP(Interface Segregation Principle) - 인터페이스 분리 원칙

클라이언트는 자신이 사용하는 메소드에만 의존해야 한다. 자신이 사용하지 않는 인터페이스는 구현하지 않아야 한다.
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 한다.

5. DIP(Dependency Inversion Principle) - 의존 관계 역전 원칙

의존 관계를 맺을 때 변하기 쉬운 것(구체적인 것)보다는 변하기 어려운 것(추상적인 것)에 의존해야 한다. 
구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다. 


 

3. 객체(Object)란 무엇인가?

 

  • 사전적인 정의로는 실제로 존재하는 것. 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다.
  • 일반적으로 객체는 다수의 속성과 기능을 가지고 있으며, 객체가 가지고 있는 속성과 그 기능을 객체의 멤버라고 한다.
  • OOP 관점에서 클래스의 타입으로 선언되었을 경우 객체라고 불린다. ex. class Person - > Person Kim = new Person();
  • 붕어빵 모양의 틀을 클래스, 그 틀로 만들어진 붕어빵을 객체라고 할 수 있다.
  • 객체는 클래스의 인스턴스이며, 객체를 소프트웨어에 실체화하면 인스턴스가 된다.
  • 클래스의 인스턴스화 : 클래스로부터 객체를 만드는 과정
  • 클래스의 인스턴스 : 어떤 클래스로부터 만들어진 객체

 

 

4. 변수란 무엇인가?

 

  • 하나의 값을 저장할 수 있는 저장 공간 -> 변수가 필요하다면 변수를 먼저 선언해야 한다. 
  • 변수의 타입을 변수에 저장할 값이 어떤 것이냐에 따라 달라지며, 변수의 이름은 저장 공간이 서로 구별될 수 있어야 하기 때문에 필요하다.
  • 변수의 타입에는 int, long, float, double, char, String 등이 있다.
  • 변수를 선언할 때 변수의 타입은 변수에 저장할 값의 종류와 같아야 한다.
  • 코드의 재활용성과 가독성을 높여주고, 중복을 제거하여 유지 보수를 용이하게 하기 위해 변수를 사용한다.

 

 

5. 변수의 선언 위치에 따른 종류와 메모리 할당 위치

 

변수의 종류 선언 위치 메모리 할당 시기
클래스 변수 클래스 영역(인스턴스 변수 앞에 static 선언) 클래스가 메모리에 올라갈 때
인스턴스 변수 클래스 영역 인스턴스가 생성될 때
지역 변수 클래스 이외의 영역 (메서드, 생성자, 초기화 블럭) 변수 선언문이 수행되었을 때

 

  • 클래스 변수 : 인스턴스 변수 앞에 static을 붙여주면 클래스 변수가 된다. 이때 모든 인스턴스가 공통된 저장 공간을 공유하게 된다. 인인스턴스를 생성하지 않고도 사용이 가능하다. 공유 변수라고도 한다.
  • 인스턴스 변수 : 인스턴스는 독립된 저장 공간을 가지며 서로 다른 값을 가질 수 있다. 인스턴스마다 고유의 값을 가져야 할 경우 인스턴스 변수로 선언한다.
  • 지역 변수 : 메서드 내에 선언되면 메서드 내에서만 사용이 가능하다. 메서드가 종료되면 소멸되어 사용할 수 없다. for, while문의 블록 {}을 벗어나면 소멸되어 사용할 수 없다.

 

 

6. final의 의미와 사용 가능한 위치

 

  • final로 선언된 변수가 할당되면 항상 값은 값을 가진다. 
  • final은 클래스, 메서드, 변수에 사용이 가능하다. 
  • final 클래스 : 상속이 불가능하다. 
  • final 메서드 : 오버라이딩이 불가능하다. 상속 받은 상태 그대로 사용해야 한다.
  • final 변수 : 한 번 값을 할당하면 수정할 수 없다.

 

 

7. static의 의미와 사용 가능한 위치

 

  • static은 변수나 메서드에 붙여 사용된다.
  • static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성되며, 객체 생성 없이 바로 사용이 가능하다.
  • 클래스를 설계할 때 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야 하는 것에 static을 붙인다.
  • 클래스 내에서 static이 붙은 인스턴스 변수는 클래스 변수가 된다.

 

 

6. 오류(Error)와 예외(Exception)의 차이는 무엇인가?

 

  • 오류(Error)는 개발자가 미리 예측하여 방지할 수 없는, 시스템이 종료되어야 할 상황과 같이 수습할 수 없는 심각한 문제를 의미한다. 시스템의 자원 부족으로 인해 발생하며 프로그램 코드로 처리할 수 없다. 항상 런타임 환경에서 발생한다.
  • 예외(Exception)은 런타임 환경에서 발생하는 예외적인 조건이며, 개발자가 구현한 코드에 문제가 있을 경우에 발생한다. 
  • 예측이 불가능한 오류와는 달리 예외는 개발자가 미리 예측하여 방지할 수 있다. 이것을 예외 처리(Exception Handling)라고 한다.

 

 

7. 예외 처리의 목적과 방법은 무엇이며 종류에는 어떤 것이 있는가?

 

  • 실행 중인 프로그램의 갑작스러운 비정상 종료를 막고 정상적인 실행 상태를 유지할 수 있도록 하는 것
  • 예외 처리 방법에는 try, catch / throws / throw / finally 등이 있다.
  • NullpointerException : 실제 값이 아닌 null을 가지고 객체나 변수 등을 호출할 경우 발생.
  • ArrrayIndexOfBoundsException : 배열에서 할당된 배열의 인덱스 범위를 초과해서 사용할 경우 발생.
  • NumberFormatException : 숫자가 아닌 것을 숫자로 변환하려고 하는 경우 발생.
  • ClassCastException : 상위 클래스와 하위 클래스 간에 발생하며, 하위 유형이 아닌 다른 유형의 클래스를 참조하려고 하는 경우에 발생.

 

8. 클래스, 생성자, 필드, 메소드에 사용 가능한 접근 제한자와 키워드

 

  • 클래스에 사용 가능한 접근 제한자와 키워드 
    • public : package, class가 동일하지 않아도 모두 접근이 가능하다.
    • default : 동일 package에서만 접근이 가능하다. 접근 제한자 생략시 기본적으로 default가 적용된다.
  • 생성자에 사용 가능한 접근 제한자와 키워드
    • public : 모든 package에서 제한없이 생성자 호출이 가능하다.
    • protected : 같은 패키지에 속하는 클래스에서 생성자 호출이 가능. 다른 패키지에 속한 클래스가 해당 자식의 클래스라면 생성자를 호출할 수 있다.
    • default : 생성자를 선언할 때 제한자를 적지 않으면 기본적으로 default가 적용된다. 같은 패키지 내에서 제한없이 생성자 호출이 가능하다.
    • private : 오직 클래스 내부에서만 생성자를 호출할 수 있다. 객체 생성이 가능하다.
  • 필드에 사용 가능한 접근 제한자와 키워드
    • public : 모든 package에서 제한없이 호출이 가능하다.
    • protected : 같은 package에 속하는 클래스에서 호출이 가능하다. 다른 패키지에 속한 클래스가 해당 자식의 클래스라면 호출할 수 있다.
    • default : 필드를 선언할 때 제한자를 적지 않으면 기본적으로 default가 적용된다. 같은 패키지 내에서 제한없이 호출이 가능하다.
    • private : 오직 클래스 내부에서만 호출이 가능하다. 필드의 경우 외부에서 접근하기 위해서 getter와 setter를 이용한다.
  • 메소드에 사용 가능한 접근 제한자와 키워드
    • public
    • protected
    • default(생략할 경우)
    • private

 

 

9. 매개변수와 인자의 차이

 

  • 매개변수(Parameter) : 함수를 정의할 때 사용되는 변수
  • 인자(Argument) : 함수를 호출하여 넘기는 변수값
// num1과 num2가 매개변수(Parameter)이다.

function sum (int num1, int num2) {
	return num1 + num2
}

// 숫자 3, 5가 인자(Argument)이다.

sum(3, 5);

 

 

 

10. 프로세스(Process)와 스레드(Thread)란 무엇인가?

 

  • 프로세스(Process) : 실행 중인 프로그램. 프로그램을 메모리에 올린 동적인 상태이다.
  • 프로그램이 실행되면 프로세스는 운영체제로부터 시스템 자원을 할당 받는다. 이 시스템 자원은 독립된 메모리 영역으로써, Code/Data/Stack/Heap의 형식으로 할당된다. 이것은 프로세스의 독립적인 영역이기 때문에 다른 프로세스의 변수나 자료에 접근이 불가능하다.
프로그램(Program) : 파일이 저장 장치에 저장되어있지만, 메모리에는 올라가있지 않은 정적인 상태. 아직 실행되지 않은 프로그램이라고 생각하면 쉽다. 쉽게 말해 프로그램 -> 프로세스 -> 스레드라고 생각하면 될 것 같다.

 

  • 스레드(Thread) : 프로세스 내에 실제로 작업을 수행하는 실행 단위이며, 두 개 이상의 스레드를 가진 프로세스를 멀티 스레드 프로세스(Multi Thread Process)라고 한다. 
  • 프로세스가 시스템 자원을 할당 받으면, 스레드는 그 안에서 독립적인 Stack 메모리 영역을 할당받게 되고, 나머지 Code/Data/Heap 메모리는 다른 스레드와 공유하게 된다. 따라서 각각의 스레드는 별도의 Stack 메모리를 가지고 있지만 그 외의 다른 메모리는 공유하기 때문에 서로 읽고 쓸 수 있게 된다.
  • 프로세스와 스레드의 차이 : 프로세스는 운영체제(OS)로부터 자원을 할당받는 작업의 단위이며, 스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위이다. 

 

 

11. 멀티 프로세스(Multi Process)와 멀티 스레드(Multi Thread)

 

  • 멀티 프로세스(Multi Process) : 두 개 이상의 다수의 프로세서(CPU)가 협력하여 하나 이상의 작업(Task)를 처리하는 것.
  • 각 프로세스 간 메모리 구분이 필요하거나 독립적인 주소 공간을 가져야 할 경우에 사용한다.
  • 장점
    1. 독립된 구조로 안정성이 높다.
    2. 프로세스 중 하나에 문제가 생겨도 다른 프로세서에 영향을 주지 않기 때문에 작업 속도가 느려지기는 해도 프로세스 자체가 정지되거나 하는 문제는 발생하지 않는다.
    3. 여러 개의 프로세스가 처리되어야 할 때 동일한 데이터를 사용하고, 이러한 데이터를 하나의 디스크에 두고 모든 프로세서가 공유하게 되므로 비용적으로 저렴하다.
  • 단점 : 독립된 메모리 영역이기 때문에 작업량이 많을 수록 성능 저하가 일어난다.
  • 멀티 스레드(Multi Thread) : 하나의 프로세스 안에서 여러 스레드로 자원을 공유하며 작업을 나누어 수행하는 것.

 

 

12. 자료 구조 (List, Set, Map)

 

 

  • JCF(Java Collection Framework)는 다수의 데이터를 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합이다.
  • 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해놓은 것. 이것은 인터페이스를 통해 구현된다.
  • List Interface, Set Interface, Map Interface가 자료 구조의 주요 핵심이다. 
  • List Interface 와 Set Interface의 특징 :
    • List : 순서가 있는 데이터의 집합. 데이터의 중복을 허용한다. ArrayList, Vector, LinkedList가 List의 구현 클래스이다.
    • Set : 순서가 없는 데이터의 집합. 데이터의 중복을 허용하지 않으며, 유일한 값을 가지는 데이터의 집합체이다. HashSet, TreeSet이 Set의 구현체이다.
  • Map Interface의 특징 : 키(Key)와 값(Value)의 쌍으로 이루어진 데이터의 집합으로써 순서가 없다. 키는 중복을 허용하지 않지만, 값은 중복될 수 있다. 키와 값 모두 참조 자료형, 즉 객체이다.
  • Vector : ArrayList와 동일한 구조이지만 멀티 스레드 환경에서 동기화 문제를 해결한다. 저장 순서를 유지하며 중복을 허용한다.
    • Stack : 선입후출(FILO, First In Last Out)의 자료 구조. Vector를 상속 받는다. 입력된 데이터는 중복될 수 있다.
  • LinkedList : 양방향 포인터 구조로, 각각마다 인접하는 참조를 링크해서 체인처럼 관리한다.
    • Queue : 선입선출(FIFO, First In First Out)의 자료 구조. 입력된 데이터는 중복될 수 있다.

 

 

13. 싱글턴(싱글톤) 패턴(Singleton Pattern)

  • 싱글턴 패턴 :  오직 하나의 객체만을 생성할 수 있는 소프트웨어 디자인 패턴 중 하나.
  • 생성자가 여러 번 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다.
  • 주로 공통된 객체를 여러 개 생성하여 사용하는 DECP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
  • 자바는 생성자를 private으로 선언하여 상속이 불가능함을 지정한다. 
  • 객체를 생성할 때 private과 static, final을 함께 붙여 생성한다. 
public class Singleton {
	
    // 최초로 생성되는 싱글톤 객체. static과 final을 붙인다.
    private static final Singleton INSTANCE = new Singleton();
    
	// 생성자를 private으로 선언한다.
    private Singleton() {}
    
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

 

 

14. MVC 패턴(Model-View-Controller Pattern) 

 

  • MVC(모델-뷰-컨트롤러) : 사용자의 인터페이스, 데이터 및 논리 제어를 구현하는 데에 널리 사용되는 소프트웨어 디자인 패턴 중 하나.
  • 소프트웨어의 비즈니스 로직과 화면을 구분하는 것에 중점을 두고 있다.
  • MVC 패턴을 기반으로 한 MVVM(모델-뷰-뷰모델), MVP(모델-뷰-프리젠터), MVW(모델-뷰-왓에버) 등이 있다.
  • 시스템 결합도를 낮추고 유지 보수의 편리성을 위해 MVC 패턴을 사용한다.
  • 각 컴포넌트(Model, View, Controller)가 자신의 수행 결과를 다른 컴포넌트에게 넘겨주는 방식이기 때문에 시스템 결합도가 낮아지고, 오류가 발생했을 때에도 오류가 발생한 특정 컴포넌트만 수정하면 되기 때문에 유지 보수가 쉽다.

 

모델(Model)

- 데이터와 비즈니스 로직을 관리한다. 
- 데이터와 애플리케이션이 무엇을 할 것인지를 정의하며, 내부 비즈니스 로직을 처리하기 위한 역할.
- 컨트롤러가 호출하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스 로직을 처리하는 역할.
- 데이터 추출, 저장, 삭제, 업데이트 등의 역할을 수행한다.

뷰(View)

- 사용자에게 보여주는 화면(UI)에 해당한다. (ex. html, jsp 등)
- 사용자와 상호 작용을 하며 컨트롤러부터 받은 모델의 결과값을 사용자의 화면으로 출력하는 역할.
- MVC에는 여러 개의 View가 존재할 수 있다.
- Model에서 받은 데이터는 별도로 저장하지 않는다.

⇒ 모델과 뷰는 서로의 존재를 몰라야 한다.

컨트롤러(Controller)

- 모델과 뷰 사이를 이어주는 인터페이스 역할을 한다.
- Model이 데이터를 어떻게 처리할 지 알려주는 역할.
- 사용자로부터 View에 요청이 있으면, Controller는 그 요청을 수행하는 Model을 호출하고, Model이 그 요청의 업무를 모두 수행하고 나면 결과는 다시 View에게 전달하는 역할.

 

 

15. MVC 패턴의 동작 원리

 

 

1. 클라이언트가 웹 브라우저에서 URL을 통해 Request를 보낸다.

2. 이 Request를 받은 Dispatcher Servlet은 Handler Mapping을 통해 요청 URL에 해당하는 Controller를 찾고, 그 해당 Controller에게 Request를 보낸다.

3. Request를 받은 Controller는 그 요청에 해당하는 데이터를 추출하고, 해당 데이터에 대한 View 이름을 지정한다. 그리고 이 데이터를 요청할 때 Model 및 DB에 접근하여 데이터를 추출하는 과정을 거친다.

4. 추출이 끝나면 Controller는 ModelAndView에 담아 Dispatcher Servlet에게 전달한다.

5. 그 후 Dispatcher Servlet은 어떤 View를 요청했는지 알아내기 위해 Controller에게 받은 View Name을 View Resolver에게 전잘한다.

6. View Resolver는 받은 View Name을 통해 Controller가 처리한 데이터에 해당하는 View를 찾고, 그것을 Dispatcher Servlet에 되돌려준다.

7. View를 되돌려받은 Dispatcher Servlet은 View에 Mapping 시켜준다.

8. Mapping 되어 데이터를 받은 View는 데이터를 가공한 페이지를 다시 Dispatcher Servlet에게 보낸다.

9. 최종적으로 Dispatcher Servlet은 요청 받아 가공한 페이지를 클라이언트에게 Response한다.

'archive' 카테고리의 다른 글

221114 첫 면접을 보고 왔다.  (0) 2022.11.15