Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7주차 모의 면접 질문 정리 (Java, Spring) #27

Open
kyeong-hyeok opened this issue Feb 22, 2024 · 0 comments
Open

7주차 모의 면접 질문 정리 (Java, Spring) #27

kyeong-hyeok opened this issue Feb 22, 2024 · 0 comments
Assignees
Labels

Comments

@kyeong-hyeok
Copy link
Contributor

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

  • Filter는 Dispatcher servlet의 앞단에서 정보를 처리하고, Interceptor는 Dispatcher servlet에서 Controller로 가기 전에 정보를 처리한다.
  • 필터(Filter)는 특정 요청과 컨트롤러에 관계없이 전역적으로 처리해야 하는 작업이나
    웹 어플리케이션에 전반적으로 사용되는 기능을 구현할 때 적용
  • 인터셉터(Interceptor)는 클라이언트의 요청과 관련된 작업에 대해 추가적인 요구사항을 만족해야 할 때 적용

Spring IoC,DI,AOP 에 대해 설명해주세요

  • IoC는 프로그램의 제어 흐름을 프레임워크에서 관리하는 것으로 코드의 최종 호출은 개발자가 제어하는 것이 아닌 프레임워크의 내부에서 결정된 대로 이루어진다
  • DI는 Spring 프레임워크에서 지원하는 IoC의 형태로, 객체 간 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해준다.
  • AOP 는 관심사를 분리하여 공통의 관심사를 모듈화 하여 제공하는 프로그래밍 방법으로 트랜잭션, 보안, 인증 등이 공통 모듈의 대상이 된다.

JPA의 더티 체킹이란 ?

  • JPA는 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 DB에 자동으로 반영한다.
  • JPA는 최초 조회 시 데이터를 1차 캐시에 스냅샷 형태로 저장해둡니다. 그 이후 트랜잭션이 끝날 때 해당 스냅샷과 엔티티를 비교하게 되며 다른 점이 존재한다면 update 쿼리문이 날라가게 됩니다.
  • 이러한 과정은 영속성 컨텍스트가 관리하는 엔티티에만 적용이 되며, 준영속, 비영속 상태의 엔티티는 적용되지 않는다.
  • 더티 체킹은 상태 변경 검사이며, 트랜잭이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 자동으로 반영해준다.

Thread와 Process 차이

  • 프로세스: 운영체제로부터 자원을 할당받은 작업의 단위.
  • 스레드: 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위.

프론트 컨트롤러 패턴이란 무엇인가요? Front Controller 패턴을 사용하는 장점은 무엇일까요?

  • 클라이언트의 다양한 요청마다 서블릿을 만들어서 사용한다고 하면 개발과 유지보수의 효율이 떨어질 수 밖에 없습니다. 프론트 컨트롤러 패턴을 사용함으로써 각 요청을 적절한 곳으로 위임해줌으로써 개발과 유지보수의 효율성이 증가하고 모든 요청에 대해 보안, 국제화, 라우팅 및 로그와 같은 일반적인 기능을 한 곳에서 캡슐화할 수 있습니다.
  • Spring에서는 DispatcherServlet이 프론트 컨트롤러 패턴을 사용한 예이며, DispatcherServlet이 Bean으로 등록되어 package를 scan하고 @controller, @RestController 애노테이션을 확인하여 어떠한 요청이 들어왔을 때 적절한 Handler Method에 위임해줍니다.

Bean 생명 주기

  • Spring Bean 의 생명 주기는 생성 → 의존 설정 → 초기화 → 사용 → 소멸이다. 이것은 스프링 컨테이너에 의해 관리되며 등록시에는 컴포넌트 스캔을 이용하거나 빈 설정파일에 직접 빈을 등록하면 된다. 초기화 시에는 PostConstruct, 빈 소멸에는 PreDestroy 를 사용하면 된다.

equals와 hashCode란 ?

  • equals는 두 객체의 동등성을 비교한다. 즉, 둘의 참조 값이 다르더라도 객체 내부 값을 비교하는 것이다.
  • hashCode는 객체의 주소 값을 이용하여 객체 고유의 hashCode를 리턴한다.
  • hashCode는 메서드의 리턴 값이 우선 일치하고 equals 메서드의 리턴 값이 true여야 논리적으로 같은 객체라고 생각한다. 만약 equals만 재정의한다면 hashCode는 Object 클래스의 기본 hashCode 메서드를 사용한다. 그렇다면 equals 값은 동일하지만 주소 값은 다르기 때문에 hashCode 판단에서 다른 객체라고 인식해서 문제가 생긴다.

얕은 복사 vs 깊은 복사

  • 얕은 복사 : 새로운 객체를 만들고, 원본의 값을 복제하는 게 아닌, 원본을 참조하는 형식. 불변 요소는 가져오지만, 가변 요소는 같은 주소를 가리킴
  • 깊은 복사 : 새로운 객체를 만들고, 내용을 새로 생성해서 복사함. 복사된 객체는 원본 객체와 무관.

N+1 문제와 해결 방법에 대해 설명해주세요

  • N + 1 쿼리 문제는 즉시 로딩과 지연 로딩 전략 각각의 상황에서 발생할 수 있습니다. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우를 이릅니다.
  • 즉시 로딩에서 발생하는 이유는 JPQL을 사용하는 경우 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시로딩 전략이 동작하기 때문입니다.
  • 지연 로딩에서 발생하는 이유는 지연로딩 전략을 사용한 하위 엔티티를 로드할 때, JPA에서 프록시 엔티티를 unproxy 할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생합니다.
  • 해결 방법으로는 Fetch Join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는 @EntityGraph를 사용하는 방법, @Fetch(FetchMode.SUBSELECT)를 사용하는 방법, @BatchSize를 사용해 조절하거나 전역적인 batch-size를 설정하는 방법이 있습니다.

BeanFactory와 ApplicationContext의 차이점이 무엇인가요 ?

  • BeanFactory는 Bean을 제공하고 관리하는 기본적인 IoC 컨테이너 인터페이스고 getBean()이 호출될 때 빈을 인스턴스화한다.
  • ApplicationContext는 BeanFactory의 확장된 버전으로, 애플리케이션에 대한 모든 정보, 메타 데이터 등을 가지고 있으며 애플리케이션이 시작될 때 빈을 인스턴스화한다.

추상 클래스와 인터페이스의 차이점을 바탕으로 어떤 상황에 어떤 것이 더 적합한지 설명해주세요.

  • 인터페이스는 구현 객체가 같은 동작을 한다는 것을 보장하기 위해 사용합니다. 다중 상속이 가능합니다. 인터페이스를 구현하는 집합간에는 관계가 없을 수 있습니다.
  • 추상클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용합니다. 단일 상속만 가능합니다. 추상클래스를 상속하는 집합간에는 연관관계가 있습니다.
  • 인터페이스 - implements 라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현
  • 추상 클래스 - extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장

클래스와 인스턴스의 차이

  • 클래스란 객체를 만들어 내기 위한 설계도이고 연관되어 있는 변수와 메서드의 집합이다. 인스턴스란 설계도를 바탕으로 구현된 구체적인 실체다. 즉, 객체를 실체화 하면 그것을 인스턴스라고 부른다. 실체화된 인스턴스는 메모리에 할당된다.

컬렉션클래스에서 제네릭을 사용하는 이유

  • 다양한 타입의 데이터를 저장하고 관리하기 위해서입니다. 예를 들어, ArrayList 클래스는 배열을 이용하여 데이터를 저장하며, Object 타입으로 모든 데이터를 다룰 수 있습니다. 그러나 이렇게 Object 타입으로 데이터를 다루면, 런타임 시점에서 데이터 타입을 체크하기 어렵기 때문에, 데이터 타입이 일치하지 않을 경우에는 런타임 에러가 발생할 수 있습니다. 따라서, 제네릭을 사용하여 ArrayList 클래스를 정의하면, 데이터 타입이 일치하는지 컴파일 시점에서 체크할 수 있으며, 코드의 안정성을 높일 수 있습니다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

4 participants