자바 & 스프링 예상질문 10선

이상훈·2023년 8월 16일
0

CS

목록 보기
12/27

1. 자바의 메모리 영역에 대해 설명해주세요
 자바의 메모리 공간은 크게 Method 영역, Stack 영역, Heap 영역으로 구분되고, 데이터 타입에 따라 할당된다.

  • 메소드(Method) 영역 : 전역변수와 static 변수를 저장하며, Method 영역은 프로그램의 시작부터 종료까지 메모리에 남아있다.
  • 스택(Stack) 영역 : 지역변수와 매개변수 데이터 값이 저장되는 공간이며, 메소드가 호출될 때 메모리에 할당되고 종료되면 메모리가 해제된다. LIFO(Last In First Out) 구조를 갖고 변수에 새로운 데이터가 할당되면 이전 데이터는 지워진다.
  • 힙(Heap) 영역 : new 키워드로 생성되는 객체(인스턴스), 배열 등이 Heap 영역에 저장되며, 가비지 컬렉션에 의해 메모리가 관리되어 진다.

2. 인터페이스와 추상클래스의 차이
 추상 클래스는 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우를 말하고, 인터페이스는 모든 메소드가 추상 메소드로만 이루어져 있는 것을 말한다.

공통점

  • new 연산자로 인스턴스 생성 불가능
  • 사용하기 위해서는 하위 클래스에서 확장/구현 해야 함

차이점

  • 인터페이스는 그 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제하는 성격을 지님
  • 추상클래스는 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용
  • 추상클래스는 다중상속이 불가능하지만, 인터페이스는 다중상속이 가능

3. Error vs Checked Exception vs Unchecked Exception

Error

  • 에러는 시스템에 비정상적인 상황이 발생했을 경우에 발생
  • ex) 메모리 부족, 스택오버플로우

Exception

  • Exception은 프로그램 실행 중에 개발자의 실수로 예기치 않은 상황이 발생

  • Checked Exception

    • Checked Exception은 RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들을 의미
    • 반드시 예외 처리를 해야함(try/catch or throw)
    • ex) IOException, FileNotFoundException 등
  • UnChecked Exception

    • Unchecked Exception은 RuntimeException의 하위 클래스들을 의미
    • 예외 처리를 강제 X
    • 실행 중에(runtime) 발생할 수 있는 예외를 의미
    • ex) NullPointerException, ArrayIndexOutOfBoundsException


4. Reflection에 대해 설명해주세요

Reflection : 실행시간에 JVM의 메모리 영역에 저장된 클래스 정보를 꺼내와 활용하는 기술

  • Reflection으로 가져올 수 있는 정보 : field, method, constructor, annotation 등
  • 일반 사용자들은 되도록 사용 안하는게 좋음
  • 라이브러리나 프레임워크에서 Reflection을 주로 사용
    • 일반 사용자들은 클래스에 대해 잘 알지만, 라이브러리나 프레임워크는 런타임에 동적으로 클래스 정보를 가져오는 경우가 많음
    • ex) 스프링 엔티티에 기본생성자가 필요한 이유, 어노테이션의 작동 원리
      • 기본 생성자로 객체를 생성하고 필드를 통해 값을 넣어주는 것이 가장 간단한 방법이다.
        • 프레임워크나 라이브러리가 여러 생성자중 무엇을 선택할지 고르기 어렵다.
        • 파라미터의 타입이 같은 경우 필드와 이름이 다르면 값을 알맞게 넣어주기 힘들다.

[10분 테코톡] 파랑, 아키의 리플렉션,
[Java] 기본 생성자가 필요한 '진짜' 이유 (리플렉션 오해 바로 잡기!!!)


5. '==' vs equals

'==' : == 연산자는 비교하고자 하는 두개 대상의 주소값을 비교

  • int, char 같은 기본형은 Constant pool 영역에 있는 특정 상수를 참조
  • 같은 상수를 참조하면 주소값이 같기 때문에 결국 같은 값이면 동일하다고 판단할 수 있음

equals : 비교하고자 하는 두개의 대상의 값 자체를 비교


6. Access Modifer에 대해 설명해주세요

Access Modifier : 변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 Java 의 예약어를 의미하며 총 네 가지 종류가 존재한다.

  • public : 어떤 클래스에서라도 접근이 가능하다.

  • protected : 클래스가 정의되어 있는 해당 패키지 내 그리고 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다.

  • default : 클래스가 정의되어 있는 해당 패키지 내에서만 접근이 가능하도록 접근 범위를 제한한다.

  • private : 정의된 해당 클래스에서만 접근이 가능하도록 접근 범위를 제한한다.


7. IOC와 DI에 대해 설명해주세요

IOC(제어의 역전) : 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것

DI(의존성 주입) : 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아서 사용하는 것

  • DI에는 생성자 주입, 필드 주입, Setter 주입 등이 있지만 대부분 생성자 주입을 사용
  • 롬복의 @RequiredArgsConstructor를 사용하면 필드 주입처럼 간편하게 사용 가능

8. Spring Filter와 Interceptor에 대해 설명하고, 사용 예시를 설명해주세요.

필터

  • 요청과 응답을 거른뒤 정제하는 역할
  • 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리되며 스프링 범위 밖에서 처리
  • Dispatcher Servlet에 요청이 전달되기 전 / 후에 url 패턴에 맞는 모든 요청에 대해 부가
  • 사용 사례
    • 보안 및 인증/인가 관련 작업
    • 모든 요청에 대한 로깅 또는 검사
    • 이미지/데이터 압축 및 문자열 인코딩
    • Spring과 분리되어야 하는 기능

인터셉터

  • 요청에 대한 작업 전 / 후로 가로채 요청과 응답을 참조하거나 가공하는 역할
  • 웹 컨테이너에서 동작하는 필터와 달리 인터셉터는 스프링 컨텍스트에서 동작
  • Dispatcher Servlet이 Controller를 호출하기 전 / 후에 인터셉터가 끼어들어 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공
  • 사용 사례
    • 세부적인 보안 및 인증/인가 공통 작업
    • API 호출에 대한 로깅 또는 검사
    • Controller로 넘겨주는 정보(데이터)의 가공

Spring - 필터(Filter)와 인터셉터(Interceptor)의 차이


9. Controller로 들어오는 입력값에 대한 Validation 방법

 스프링에서 유효성 검사를 수행하는 방법은 다양하다. 주로 validation 패키지의 애노테이션을 사용하여 입력값의 유효성을 검사한다. 대표적으로 @NotNull, @NotEmpty, @Min, @Max 등이 있다. 이러한 애노테이션들을 DTO 클래스의 필드에 적용한다. 컨트롤러 메서드에서 유효성 검사 결과를 처리하기 위해 BindingResult 객체를 활용할 수 있다. BindingResult는 유효성 검사 결과와 에러 메세지를 포함하고 있다. BindingResult 객체를 통해서 서비스 단에서 직접 클라이언트에게 예외가 발생하였음을 알릴 수도 있지만 유효성 검사가 필요한 메서드마다 일일이 예외처리 로직을 작성하는 것은 불필요하다. 따라서 보통 @ControllerAdvice를 이용한 전역 에러 핸들링을 통해 간편화 할 수 있다.


10. @Pathvariable vs @RequestParam vs @RequestBody vs @ModelAttribute

@PathVariable : 값을 하나만 받아올 수 있으며 보통 id 값을 전송할때 주로 사용함

@RequestParam : param 형식으로 간단한 데이터를 전송할때 주로 사용함, 주로 검색값, 페이지네이션(Page, Size)에서 사용됨

@RequestBody : Json 형식으로 데이터를 전송할때 주로 사용함

@ModelAttribute : 폼 형태의 데이터를 전송할떄 주로 사용함. MultipartFile 형식이 필요할때 주로 사용함, @Setter 필수

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글