[백엔드] 면접준비

박세건·2024년 5월 6일
0

직무면접대비

목록 보기
1/5

Java의 특징

  • 객체지향 언어
  • JVM(자바가상머신) 위에서 동작하기 때문에 OS에 대해 독립적(OS에 종속적이지 않다) -> 단점 느리다
  • GabageCollector를 통한 자동 메모리 관리
    • C/C++의 경우는 개발자가 직접 메모리 관리를 해줘야함

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

  • OS에 대해서 독립적이기 위해서 JVM을 사용
  • OS에 도달하기 위해 JVM을 거침
  • 때문에 컴파일러(javac)는 JVM이 이해할 수 있는 파일(.class)로 컴파일
  • JVM은 이 Java Byte Code(.class)를 기계어로 변환하고 실행
    • 변환된 기계어는 CPU에서 실행하여 OS와 하드웨어를 활용
  • stack 기반 아키텍처로 연산
  • 가비지컬렉션을 통한 자동 메모리 관리

  • 주로 JRE(Java Runtime Environment), JDK(Java Development Kit)에 포함

JVM과 VM 차이

  • JVM
    • 자바 실행환경
    • OS를 가상화하지 않아서 가볍게 실행
    • 가상화하지 않고 GC와 같은 자바 실행을 위한 환경만 제공 -> 가벼움
  • VM
    • OS와 하드웨어를 가상화하여 독립적인 컴퓨터 환경 제공
    • OS를 가상화하여 독립적은 운영체제를 실행 -> 완전한 가상 환경 -> 무거움

VM은 가상 컴퓨터입니다. 독립적인 운영체제까지 포함하여 하나의 컴퓨터처럼 사용할 수 있습니다.
JVM은 자바 프로그램을 위한 가상 공간입니다. 운영체제 위에 설치되고, 자바 프로그램을 실행하게 돕는 역할을 합니다.

  • JVM은 운영체제를 포함하지 않는 가상 공간을 의미

Java Reflection?

  • 런타임 환경에서 클래스의 구조를 확인하고 조작할 수 있는 API:
    컴파일 시점에 알 수 없는 클래스에 대해서도 런타임에 클래스의 구조(메서드, 필드, 생성자 등)를 조회하고, 객체 생성, 메서드 호출, 필드 조작 등이 가능하게 해줍니다.
  • 주요 기능:
    • 정보 조회: 클래스, 메서드, 필드, 생성자 등의 정보를 동적으로 확인
    • 객체 생성: 클래스 이름을 문자열로 받아 객체를 동적으로 생성
    • 메서드 호출: 동적으로 메서드를 선택하고 실행
    • 필드 조작: private 필드에 접근하거나 값을 변경
  • 예시 - 플러그인 시스템:
    플러그인 시스템은 기능을 확장할 수 있는 시스템으로, 실행 시점에 어떤 플러그인을 사용할지 결정합니다. 예를 들어, 동작 방식에 따라 클래스 A 또는 클래스 B의 인스턴스가 생성되어야 할 때, Java Reflection을 사용하면 설정 파일이나 사용자 입력에 따라 올바른 객체를 동적으로 생성하여 사용할 수 있습니다.
public class PluginLoader {
    public static void main(String[] args) {
        // 예를 들어, 이 클래스 이름은 외부 설정 파일이나 사용자 입력에서 가져온 값이라고 가정합니다.
        String pluginClassName = "HelloPlugin";
        try {
            // 1. 클래스 이름으로 Class 객체를 얻습니다.
            Class<?> clazz = Class.forName(pluginClassName);
            // 2. Plugin 인터페이스를 구현했는지 확인 (선택 사항)
            if (!Plugin.class.isAssignableFrom(clazz)) {
                System.out.println(pluginClassName + "는 Plugin 인터페이스를 구현하지 않습니다.");
                return;
            }
            // 3. 기본 생성자를 사용해 객체를 생성합니다.
            Plugin plugin = (Plugin) clazz.getDeclaredConstructor().newInstance();
            // 4. 플러그인의 메서드를 실행합니다.
            plugin.execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

정적 바인딩 vs 동적 바인딩

어떤 시점에 메서드나 변수의 호출이 결정되는지

  • 정적 바인딩 : 컴파일 시점, 빠른 실행 속도, 오버로딩
  • 동적 바인딩 : 런타임 시점, 상속 및 다형성 적용 가능(인터페이스를 통해), 오버라이딩

오버라이딩과 오버로딩란?

  • 오버라이딩(overriding) : 상위 클래스의 메서드를 재정의
  • 오버로딩(overloading) : 메서드 이름이 같고 매개변수의 개수와 타입은 다른 메서드를 여러개 정의하는 것

오버라이딩과 오버로딩을 직접 구현한 경험

오버라이딩

  • 프로모션 할인에 대해서 할인율을 저장
  • 각각의 자식 프로모션들에서 각각의 할인율을 조회할 수 있도록 재정의

오버로딩

  • 생성자로 오버로딩 사용
  • 인자들에따라서 사용하는 생성자가 다르도록 오버로딩 사용

개발 방법론에 대해 설명

소프트웨어 개발 과정을 체계적으로 진행하기 위한 원칙 및 방법을 의미

  • 워터폴(Waterfall) :
    • 순차적 단계 (요구사항 분석 -> 설계 -> 구현 -> 테스트 -> 배포)
    • 순차적으로 진행되어 변경 관리가 어려움, 변경이 낮은 프로젝트에 적합
  • 애자일(Agile)
    • 빠른 피드백, 유연한 개발, 반복과 점진적 개발
    • 고객과의 지속적인 소통과 피드백으로 신속 대응
    • 주요 방식 : [스크럼 : 스프린트내 개발 목표 달성], [칸반:작업 시각화하여 관리], [XP(Extreame Programming):TDD,페어프로그래밍 등의 기술적 방식으로 품질 향상]
  • DevOps
  • 린(Lean)

경험해본 개발 방법론

  • 애자일 방식 경험
  • 스크럼 방법을 적용해서 진행
  • 일주일의 시작마다 그 주에 할 것을 미리 계획 및 공유
  • Jira 사용해서 서로의 개발 관련 이슈 공유
  • 매주 목표를 정하고 달성하는 방식으로 늘어질 틈이없어서 더 열정적으로 개발할 수 있었음, 명확한 목표가 있고 이를 달성하는 반복되는 과정으로 품질 향상

객체지향 프로그래밍(OOP)란?

실생활에 사용되는 모든 것을 객체로 나타내어서 상태와 행위를 정의해서 사용하는 프로그래밍 기법

  • 누가 어떤일을 할 것인가?

Try-With_Resources란?

  • 기존의 try-catch-finally 구문의 문제점을 해결하기 위함
  • 기존에는 위 구문에서 사용할 자원을 생성하고 finally 부분에 자원을 반남해야함( ex) connection.clos())
  • try-with-resources을 사용하면 괄호 안에서 생성하고 자동으로 해제

불변 객체란?

  • 객체의 상태가 변하지 않는 객체
  • 윈시 타입 데이터는 final 키워드를 사용
  • 참조 타입 데이터는 복사해서 사용

왜 불변 객체가 필요한가?

  • 데이터 일관성 : 여러 스레드가 동시에 접근해도 객체가 변화하지 않기 때문에 안전하게 공유하며 사용 가능
  • 재사용 가능성 : 변경되지 않으므로, 여러 곳에서 재사용하거나 캐싱해도 안전해서 효율적

추상클래스와 인터페이스 차이

확장과 구현에 편리하기위해 사용

  • 추상 클래스
    • 하위 클래스들의 공통 로직을 추상화
    • 추상 메서드가 하나 이상
    • 자식 클래스들의 속성, 매서드를 정의해두기위함 -> 확장성
    • 단일 상속
    • 상태(필드) 가질 수 있음
    • 사용시기 : 상속관계
  • 인터페이스
    • 모든 메서드가 추상 메서드
    • 반드시 추상 메서드를 구현하도록 강제
    • 상태(필드)가 없음(상수만 가능 static final)
    • 다중 상속 가능
    • 사용시기 : 다중 상속, 관련없는 클래스들의 공통 동작

Ex.
추상클래스 : 탈것 -> 자전거, 자동차 등 -> 속성, 메서드 정의
인터페이스 : 전기 -> 전기가 필요한 제품들의 기능

왜 클래스는 단일 상속만 가능할까

  • 다이아몬드 문제 발생 : 두 부모의 클래스로 부터 같은 메서드를 상속받아 어떤 것을 사용할 것인지 모호해지는 문제가 발생
  • 복잡성 증가 : 다중상속으로 상속 구조가 복잡해져서 버그가 발생할 가능성이 높음, 안정성 하락

가비지 컬렉션(garbage Collection)이란?

  • JVM의 메모리 기법중 하나
  • 동적할당(new)되었던 메모리 영역(Heap) 중에서 필요가 없어진 부분을 회수(Mark and Sweep)해서 관리
  • 이 과정을 실행하기 위해서 JVM은 애플리케이션의 실행을 잠시 멈춘다(Stop the world)

자바 메모리 영역에 대해 설명하세요

  • Static(Method) 영역 : 전역 변수, static 변수
  • Stack 영역 : 지역 변수, 지역 메서드, 매개변수
  • Heap 영역 : 동적 메모리 할당(new), 인스턴스,String 상수 풀, 배열 등

클래스는 객체를 만들어내기위한 틀

이렇게 만들어진 객체가 메모리가 할당된 실체를 인스턴스

Wrapper Class 란?

  • 원시 데이터 타입(기본 자료형)을 객체화 시키기 위한 클래스
  • 기본 자료형 -> 래퍼 클래스 = Boxing
  • 래퍼 클래스 -> 기본 자료형 = UnBoxing

하나의 스레드가 자원에 접근했을때 다른 스레드들이 이 자원에 접근하지 못하게 하는 것을 Synchonized(동기화) 라고한다.

String은 불변이다

String 을 new 없이 리터럴("") 로 생성하면 Heap영역의 String Constant Pool 영역에 저장된다.

  • 때문에 == 표시를 통해 비교하면 참이다
 String a = "asdf";
 String b = "asdf";
 System.out.println(a==b) //true 반환
  • 하지만 new String("asdf") 으로 선언하게 되면 false를 반환하게 된다.

String vs StringBuffer vs StringBuilder

  • String 불변, StringBuffer, StringBuilder 가변
    - StringBuffer 동기화 지원,멀티스레드 환경
    - StringBuilder 동기화 미지원, 싱글스레드 환경

리플렉션 : 자바 API : 구체적인 클래스 타입을 알지 못해도 접근할 수 있도록 ex) Intellij 자동완성

HashTable, HashMap 차이

  • HashTable :
    • 모든 내장 메서드가 Synchronized(동기화) 되어있어서 여러 스레드가 접근해도 안전
    • NULL 허용하지 않음
    • 느림
  • HashMap :
    • Synchronized가 되지 않음, 단일스레드 환경에서 빠르지만, 멀티 스레드 환경에서는 별도 조치가 필요
    • NULL 허용
    • 빠름

Vector와 ArrayList 차이

  • Vector :
    • 동기화, 멀티스레드에서 안전
    • 느림
    • 용량 다 차면 기존의 2배로 증가
  • ArrayList :
    • 동기화 안됌, 멀티스레드에서 별도의 동기화필요
    • 용량 다 차면 기존의 50%로 증가

Error와 Exception 차이

  • Error : 심각한 오류, 컴파일 지점에서 확인 불가, 오류 발생시 비정상 종료
  • Exception : 미미한 오류, 컴파일 지점에서 확인 가능한 경우가 있음, try-catch로 비정상 종료 방지

CheckedException과 UnCheckedException

  • CheckedException : 실행하기전 예외가 발생할 수 도 있음을 알려주고 반드시 예외처리 필요
  • UnCheckedException : 실행 후 알 수 있음, 예외처리 필요 없음

Optional API 란?

  • null여부를 판단하는 번거로움을 해결하기 위한 API
  • null을 컨트롤 할 수 있는 메서드를 제공

제네릭이란?

  • 사용할 데이터의 타입을 하나로 고정하는 것이아닌 포괄적으로 지정한다는 개념입니다.
  • 즉, 데이터 타입을 미리 고정하지 않고 클래스나 메서드를 사용할때, 필요한 데이터 타입을 지정할 수 있도록 하는 개념
    ex) List<T> 를 사용해서 리스트에 어떤 타입을 지정해줄지 사용할때 설정가능, String이던 Integer 둘다 올 수 있게 설정할 수 있다

직렬화란?

  • 애플리케이션에서 사용되는 객체들을 외부에서도 사용할 수 있도록 바이트 형태로 변환하는 기술
  • 이렇게 만들어진 바이트 형태를 다시 객체형태로 변환하는 것을 역직렬화 라고 합니다.

SerialVersionUID를 선언해야하는 이유

  • 객체는 시점에 따라서 변화할 수 있다
  • 시점에 따라서 직렬화 시킨 형태는 다를 수 있다.
  • 맞지 않는 형태를 역직렬화 하면 에러가 발생한다
  • 이러한 문제를 해결하기위해 사용한다

직렬화란?

자바에서 입출력은 스트림이라는 통로를 통해 데이터가 이동
스트림을 통하기 위해서는 바이트로 이루어져야함
객체는 바이트로 이루어져있지 않아서 스트림으로 전송할 수가 없음
때문에 객체를 바이트로 변환하는 과정을 직렬화라고 한다.
_반대로 바이트로 변환된 객체를 다시 객체 원래 모양으로 만드는 과정을역직렬화라고 한다.

Restful API에 대해 설명해주세요

  • Rest 규칙이 잘 지켜진 API
  • Rest : URI 주소로 자원 정보만 표현 + HTTP Method로 자원의 행위를 명시

프레임워크와 라이브러리 차이

제어 흐름의 주도권이 누구한테 있느냐에 따라 다름

  • 프레임워크 : 전체적인 흐름을 제어
  • 라이브러리 : 프레임 워크 안에서 개발자는 라이브러리에 대한 흐름 제어
  • IoC : 개발자의 수고를 덜어주기위해 프레임워크가 제어권을 가져감

Call By Value와 Call By Reference

  • Call By Value : 인자의 값을 복사해서 사용, 메모리 증가
  • Call By Reference : 인자값의 주소를 참조해서 그대로 사용, 기존 값에 영향줌
    ❗추가적으로 Java에는 Call By Value방식만 있는데 이때 레퍼런스값(reference 객체)를 전달할때에는 주소가 value로 복사돼서 넘어간다. 떄문에, Call By Reference의 역할을 하여 이전의 객체를 참조해서 사용하여 값을 변경할 수 있다. 하지만, 전달받은 변수에 새로운 객체를 할당하면 이는 로컬변수에만 영향을 주고 원본 객체에는 영향을 주지 않는다.

stack 영역 vs heap 영역

  • 동적할당(new) : heap 영역을 차지한다
  • 지역변수 : stack 영역을 차지한다
    따라서, String[] arr = new String[2]; 에서 arr은 stack 영역에 실제 String[2]는 heap 영역을 차지하고 arr은 String[2]를 참조하게된다.

CORS에 대해 설명해주세요

  • CORS(Cross Orgin Resource Sharing)으로, 웹 브라우저가 한 도메인에서 다른 도메인의 리소스에 접근할때 발생하는 문제
    • 도메인 : IP로 이루어진 주소를 네이밍한 것, ex) www.naver.com
  • 이 문제를 해결하기위해서 CORS에 대한 속성(Ex.Access-Control-Allow-Origin)을 헤더에 추가해줘야합니다.
  • 브라우저에서 발생하는 문제이기에 마이크로서비스들의 내부 통신에는 적용되지 않음

절차지향 vs 객체지향

  • 절차지향 : 순차적인 처리 중점
    • 어떤 절차로 처리할 것인가
  • 객체지향 : 실제 사물을 객체로 모델링
    • 누가 어떤 일을 할 것인가

객체지향의 4가지 특징에 대해 설명해주세요

순서대로 암기하면 쉽다.

  • 추상화 : 복잡한 시스템에서 핵심적인 부분만 드러내고 불필요한 세부 사항을 제거하여 단순화하는 것
    • Ex. 동물 클래스에서 모든 동물에 공통적인 행동(eat(), sleep())만 제공하고, 세부적인 구현은 하위 클래스에서 정의.
  • 상속 : 기존 클래스의 속성과 메서드를 재사용하고, 새로운 기능을 추가하거나 확장할 수 있도록 하위 클래스에 물려주는 과정
    • Ex. Animal 클래스의 Dog와 Cat 클래스가 eat() 메서드를 물려받아 사용.
  • 다형성 : 동일한 인터페이스나 메서드 호출이 객체의 타입에 따라 다른 동작을 수행하는 성질
    • Ex. Animal 클래스의 speak() 메서드가 Dog에서는 "Bark", Cat에서는 "Meow"를 출력.
  • 캡슐화 : 객체의 데이터(속성)와 이를 조작하는 메서드를 하나로 묶고, 외부에서의 직접 접근을 제한하여 데이터의 무결성과 보안을 유지하는 것
    • Ex. private 접근 제어자를 사용해 속성을 숨기고, getter와 setter 메서드를 통해 접근.
    • 내부를 알아서도 안되고 알필요도 없고 사용만 하면된다(자판기 생각)

객체지향의 5대 설계 원칙(SOLID)에 대해 설명해주세요

  • SRP(Single Responseiblity Prnciple) : 단일 책임 원칙
    • 객체는 단 하나의 책임만을 가져야 한다.
    • 객체의 변경의 이유가 단 하나만 존재해야 한다.
  • OCP(Open Closed Principle) : 개방 폐쇄 원칙
    • 확장에는 열려있고 수정에는 닫혀있어야 한다.
    • 새로운 기능을 추가할 때 기존 코드는 수정하지 않도록 설계
  • LSP(Liskov Subtituion Principle) : 리스코프 치환 원칙
    • 자식 객체는 언제든지 부모 객체로 교체될 수 있어야한다.
    • 교체 되어도 문제가 발생하지않는다
    • Ex. 사각형 클래스를 상속받는 정사각형의 구조에서, 부모클래스의 구현체로 정사각형 클래스를 사용한다면 사각형(부모)클래스 대신에서 사용될 수 없음
    public class Square extends Rectangle {
      @Override
      public void setWidth(int width) {
          this.width = width;
          this.height = width; // 정사각형 특성 적용
      }
      @Override
      public void setHeight(int height) {
          this.height = height;
          this.width = height; // 정사각형 특성 적용
      }
    }
    public static void main(String[] args) {
      Rectangle rect = new Square(); // 부모 타입으로 자식 클래스 사용
      rect.setWidth(4);
      rect.setHeight(5);
      // 기대: 사각형의 면적은 4 * 5 = 20
      // 실제: 정사각형의 특성 때문에 면적은 5 * 5 = 25
      System.out.println("Area: " + rect.getArea());
    }
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    • 인터페이스가 기능에 맞게 상세하게 잘 분리 되어야한다.
    • Ex. 프린터 인터페이스에서 print(), scan() 메서드를 한 곳에 몰아넣지 않고, 각각 Printer와 Scanner 인터페이스로 분리하여 설계
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙
    • 객체를 참조할때는 그 객체의 상위 객체(추상클래스,인터페이스)를 참조하라
      • Ex. 알림을 담당하는 비즈니스 로직이 이메일, SMS 등 과 같은 구체적인 구현에 의존하지 않고 Notifier라는 알림 담당 인터페이스를 통해 참조하도록 구현
    • 하위 모듈에 변화가 있을때마다 수정이 자주 발생하는 것을 막기 위해

OAuth 2.0 흐름에 대해 설명해주세요

OAuth 2.0 이란, 우리의 애플리케이션이 클라이언트를 대신해서 리소스 서버에서 제공하는 자원에 대한 접근을 위임받는 것 (간편로그인)
1. 사용자는 우리의 애플리케이션(이하 클라이언트)에게 요청
2. 클라이언트는 권한 서버에게 권한 승인 요청
3. 권한 서버에서 제공하는 로그인 페이지를 사용자에게 전달
4. 사용자가 로그인하면 권한 서버로부터 Authorization Code(인증 코드) 를 받음
5. 클라이언트는 인증코드를 갖고 요청
6. 권한 서버는 클라이언트와 인증코드를 검증한 후 Access Token을 제공
7. Access Token을 갖고 사용자 정보의 접근

동적 쿼리란 무엇인가요?

이름 그대로 실행하면서 동적으로 변할 수 있는 쿼리 문장을 의미합니다.
사용되는 경우에 따라서 where절이나 쿼리문이 변경되어야 할 때 사용됩니다.

CSRF(Cross-Site Request Forgery)

  • 사이트간 요청 위조, 공격자가 인증된 사용자의 정보를 이용해서 원하지 않는 요청을 보내서 공격하는 기법
  • 해결방법 : 특정 토큰(csrf 토큰)이 있어야만 상태를 변화시킬 수 있도록 처리

대칭키, 비대칭 키 암호화 방식이란

둘다 양방향 암호화 방식이다

  • 대칭키 : 암호화, 복호화 하는 키가 같다
    • 키가 유출되면 정보가 유출된다, 이를 해결하기위한 비대칭키 방식
  • 비대칭키 : 암호화와 복호화 하는 키가 다르다
    • 개인키는 노출이되면 안되고 공개키는 공개적으로 공개한다.

TDD(Test-Driven-Development)

단위 테스트 케이스를 먼저 작성한 후에 그 케이스에 맞게 코드를 작성하여 테스트를 통과하면서 진행하는 개발 방식
-> 코드의 버그를 방지하고, 간결한 코드를 작성할 수 있음

TDD에서 사용되는 Red-Green 과정

  • Red : 실패하는 테스트 코드를 작성 후 실패하는 지확인
  • Green : 성공하는 코드를 작성한 후 성공하는지 확인
  • Refactor : 모든 과정 확인 후 클린 코드로 수정
  • 위 과정을 반복

테스트 코드를 작성해야되는 이유

  • 기능 추가시에 에러를 빠르게 확인할 수 있다.
  • 실수를 방지할 수 있다.
  • 좋은 설계가 되도록 유도

DDD(Domain-Driven-Design)

  • MSA의 설계 방법론, 도메인 별로 나눠서 설계하는 방법
  • 도메인 : 현실에서 접하는 업무의 한 영역
    • ex) 고객, 음식점, 배달원, 주문, 결제, 결제 관련 은행

DDD에서 이야기하는 계층에 대한 설명

  • 표현 계층(presentation layer) : 사용자의 요청을 받고 응답 : controller
  • 응용 계층(application layer) : 비즈니스 로직 정의, 도메인 계층과 인프라스트럭처 계층 연결 : service
  • 도메인 계층(Domain layer) : 도메인에 대한 정보를 갖고 있음 : Entity
  • 인프라스트럭처 계층(infrastructure layer) : 외부(DB)와의 통신을 담당(Repository

MSA가 무엇인지 설명해주세요.

1개의 서비스를 기능별로 분리해서 배포하는 기술을 말합니다. 각각의 서비스는 API를 통해 데이터를 주고받으면 하나의 서비스를 구성합니다.

  • 모놀로식 아키텍쳐(Monolithic Architecture) 문제점을 해결하기 위해 등장

WAS와 WS의 차이를 설명해주세요

  • WAS는 비즈니스 로직을 포함시킬 수 있어 동적 페이지를 제공할 수 있습니다.
  • WS는 비즈니스 로직을 포함할 수 없어 정적인 페이지만 제공합니다.

Spring Framework에 대해 설명해주세요.

Spring 이란 자바로 개발하기 편리한 환경을 제공해주는 오픈소스 프레임 워크입니다.

  • POJO : 순수한 자바 객체를 사용하므로 유지보수와 확장이 편리합니다.
  • Bean : 객체를 Bean이라는 스프링에서 관리하는 객체로 저장시켜서 라이프 사이클 대신 관리
  • IoC(제어의 역전) : 객체의 제어를 프레임워크가 담당해줌(편리)
  • DI(의존성 주입) : 객체의 의존관계를 개발자가 아닌 프레임 워크가 주입
  • AOP(Aspect Oriented Programming, 관점 지향 프로그래밍) : 여러 상황에서 공통으로 사용되는 기능을 따로 관리할 수 있다.

Spring Boot Framework란?

  • JAVA개발을 편리하게 할 수 있는 스프링이지만 초기 설정에 대해서 복잡한 문제가 존재
  • 이러한 초기 설정에 대한 문제를 간편하게 자동화(라이브러리 설정)해서 설정
  • 내장 톰켓을 제공하기 때문에 바로 실행 가능
  • jar파일로 배포 가능, 가벼움
    • 반대의 war파일은 WEB-INF 폴더 내에 웹 설정 파일(web.xml), 서블릿, JSP 등 웹 관련 구성 요소와 정적 리소스(HTML, CSS, JavaScript 등)를 포함하여 무거움.

Spring MVC란?

Model, View, Controller별로 구분해서 개발 하는 디자인 패턴

  • Model : 데이터 관리, 비즈니스 로직 : DAO, DTO, Service
  • View : 클라이언트에게 제공되는 화면, UI : html, jsp, tymeleaf
  • Controller : 클라이언트로부터 요청 받고 가공된 데이터(Model)을 View로 연결시킴

MVC 과정

  1. 클라이언트는 URL을 통해 요청을 전송한다.
  2. 디스패처 서블릿은 핸들러 어댑터을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
  3. 핸들러 어댑터는 해당 컨트롤러에 요청을 전달한다.
  4. 컨트롤러는 비즈니스 로직을 처리한 후에 반환할 뷰의 이름을 반환한다.
  5. 디스패처 서블릿은 뷰 리졸버를 통해 반환할 뷰를 찾는다.
  6. 디스패처 서블릿은 컨트롤러에서 뷰에 전달할 데이터를 추가한다.
  7. 데이터가 추가된 뷰를 반환한다.

대량의 트래픽이 발생해서 오류가 발생한다면 어떻게 할건가

일반적으로

  • Scale-Up : 하드웨어의 스펙, 기능을 향상
  • Scale-Out : 서버를 여러대 추가해서 크기를 증가
    추가적으로
  • message queue
  • 오토스케일링
  • 로드밸런싱 (nginx, spring cloud gateway, eureka server)

Servlet 이란?

  • 자바 웹 프로그래밍 기술로, 클라이언트의 요청을 받아 처리하고 그 결과를 응답해줍니다.
  • controller 뜻함
  • doGet(), doPost() 소유

DAO, BO, DTO, VO

  • DAO(data access object) : DB의 데이터에 접근하는 객체(Repository, Mapper)
  • BO(Business Object) : 비즈니스 로직 담당하는 객체(service)
  • DTO(Data Transfer object) : 데이터의 교환이나 이동을 담당하는 객체
  • VO(Value Object) : 실제 데이터를 저장하는 객체(불변하는 객체 : Ex. 전화번호 클래스, 돈 클래스), + Entity 객체 아님!

싱글톤 패턴이란?

  • 요청에 따라 객체를 매번 생성하는 것이 아닌 하나의 객체를 생성한 후에 그객체를 공유해서 사용하는 방법
  • 메모리 공간 효율적

반대는 프로토 타입 : 빈의 Scope를 설정해서 싱글톤인지 프로토 타입인지를 편리하게 관리할 수 있다.

JPA와 같은 ORM을 사용하면서 쿼리가 복잡해지는 경우는 어떻게 해결할까?

  • JPA는 정적인 상황에서 사용하는 것을 권장한다
  • 때문에 동적인 쿼리에 대해서 문제가 발생하게 된다
  • 이를 JPQL을 사용해서 해결하는 것을 권장한다
    JPQL : Entity 객체를 대상으로 하는 SQL문, 다양하게 작성가능

추가적으로 JPA를 사용하면 복잡한 조인문을 구현하는 것이 어려운데 이때 QueryDSL을 사용하면 쉽게 조인문을 적용시킬 수 있다

public interface MemberRepository extends JpaRepository<Member, Long>, QuerydslPredicateExecutor<Member> {
    // Spring Data JPA 메서드 정의
}

@RequiredArgsConstructor
public class MemberRepositoryImpl implements MemberRepositoryCustom {
    private final JPAQueryFactory queryFactory;

    public List<Member> findByName(String name) {
        QMember member = QMember.member;

        return queryFactory
            .selectFrom(member)
            .where(member.name.eq(name))
            .fetch();
    }
}

도커, 이미지, 컨테이너, 쿠버네티스, 도커 볼륨, 도커 네트워크 등등

profile
멋있는 사람 - 일단 하자

0개의 댓글