JAVA
JVM의 구조와 Java의 실행방식을 설명해주세요.
1) JVM의 구조
-
Class Loarder: 클래스를 JVM 메모리에 로드한다.
-
Execution Engine: 인터프리터,JIT compiler를 이용해 데이터 영역에 배치된 바이트 코드를 실행 및 GC로 메모리 관리
-
Runtime Data Area: 프로그램 수행을 위해 OS 에서 할당받는 공간.
2) 자바 실행과정
- 자바 컴파일러를 통해 자바 클래스 파일(.java)를 자바바이트코드(.class)로 변환함.
- 클래스로더를 통해 바이트코드를 JVM 런타임 영역에 로드함.
- 실행 엔진을 통해 실행
GC가 무엇인지, 필요한 이유는 무엇인지, 동작방식에 대해 설명해주세요.
-
GC란? : 갈비지 컬렉터로 힙 영역에 사용하지 않는 객체들을 자동으로 제거해주는 역할을 합니다.
-
필요이유: 자바는 개발자가 직접 메모리를 해제해줄 수 없기 때문에 필요함.
-
동작방식: 객체 생성 -> Eden 영역에 위치 -> MinorGC로 사용하지 않는 객체 제거, 살아남으면 점점 뒤로.. -> Old 영역까지 밀리면 FullGC를 통해 제거됨.
컬렉션 프레임워크에 대해서 설명해주세요.
다수의 데이터를 처리하는 클래스의 집합을 의미합니다.(List,Set,Map)
제네릭에 대해서 설명해주세요.
ArrayList가 다룰 객체를 미리 명시해줌으로써 형변환을 하지 않고 사용하는 것입니다.
애노테이션에 대해서 설명해주세요.
자바에서는 @ 주석으로 특정 기능을 수행하도록 하는 기술
오버라이딩과 오버로딩이 무엇이며 어떤 차이가 있을까요?
- 오버라이딩 : 재정의
- 오버로딩 : 메서드의 이름은 같지만 매개변수 타입이나 갯수가 다른 것
인터페이스와 추상클래스의 차이점에 대해 설명해주세요.
- 추상클래스 : 일반 클래스지만 추상 메서드가 하나라도 포함된 경우
- 인터페이스 : 모두 추상메서드
클래스는 무엇이고 객체는 무엇인가요?
- 클래스 : 객체를 만들기 위한 설계도로 field,method
- 객체 : 클래스 구현을 통해 만들어진 무언가
자바의 원시타입들은 무엇이 있으며 각각 몇 바이트를 차지하나요?
- boolean - 1bit
- byte - 8bit
- short- 16bit
- int,float - 32bit
- long,double - 64bit
접근 제어자의 종류와 이에 대해 설명해주세요.
- public : 같은 프로젝트 안에서 사용가능
- default: 같은 패키지 안에서만 사용가능
- protected: 같은 패키지 + 상속 관계일 때
- private : 같은 클래스 내에서만.
객체지향에 대해서 설명해주세요.
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법
SOLID(객체지향 5대원칙)에 대해서 설명해주세요.
-
Single Responsiblity (단일 책임 원칙) : 응집도는 높고 결합도는 낮은 프로그램을 의미
-
Open-Closed (개방-패쇄 원칙): 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야함(인터페이스).
-
Liskov Substitution (리스코프 치환 원칙) : 자식은 부모에서 가능한 행위를 수행할 수 있어야함.
-
Dependency Inversion (의존 역전 원칙) : 의존관계를 맺을때, 변화하기 어려운 것에 의존 해야함.
-
Interface Segregation (인터페이스 분리) : 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하면 안됨.
동일성(identity)와 동등성(equality)에 대해 설명해주세요. (equals(), ==)
- 동일성 : 두개의 오브젝트가 완전히 같은 경우
- 동등성 : 같은 정보를 가지고 있는 경우
원시타입과 참조타입의 차이에 대해 설명해주세요.
- 원시타입 : 실제 데이터 값을 저장하는 타입
- 참조타입 : 메모리 주소를 통해 객체를 참조하는 타입
Checked Exception과 Unchecked Exception에 대해 설명해주세요.
- Checked Exception : 컴파일시점에 확인, 반드시 예외처리 해야함 안하면 에러... (IOException)
- Unchecked Exception : 런타임에 확인, 명시적으로 예외처리 안해도 됨. (NullPointException)
Java8에서 추가된 Feature에 대해서 설명해주세요.
- 람다 표현식
- 스트림 API : 데이터를 추상화하여 다룰 수 있게 됨
- java.time 패키지 : 더 직관적인 Date, Time API 제공
- 나즈혼 : JS 새로운 엔진도입
try-with-resource에 대해서 설명해주세요.
try에 자원 객체를 전달하면, try 코드 블록이 끝나면 자동으로 자원 할당을 해제해주는 기능.
강결합과 느슨한 결합이 무엇인지 설명해주세요.
강결합은 서로 높은 의존성을 가지고 있음.
약결합은 서로 낮은 의존성을 지님 -> 유지보수 용이
직렬화(Serializable)와 역직렬화에 대해서 설명해주세요.
- 직렬화 : 객체를 전송 가능형태로 만드는것을 의미.
- 역질렬화: 전송받은 직렬화 된 데이터를 다시 객체 형태로 복원하는 것
자바의 동시성 이슈(공유자원 접근)에 대해 설명해주세요.
- 여러 스레드에서 같은 자원에 접근하는 경우, 원하는 결과를 도출 못하는 상황을 의미.
- 해결 방안
- 암시적 Lock: 하나의 스레드가 메서드를 실행할때 다른 메서드가 해당 메서드를 실행 못하게 대기.(synchronized)
- 명시적 Lock: ReentrantLock를 사용해서 동시에 여러 Lock을 사용하고 싶을때 사용.직접 Lock객체를 생성, 사용
Mutable 객체와 Immutable 객체의 차이점에 대해 설명해주세요.
변하다 = 주소값 유지하며 값을 변경할 수 있다,없다의 차이
- Mutable: 변할 수 있음
- Immutable: 변할 수 없음 (String, Boolean,Integer,Float,Long...)
Spring
Spring DI/IoC는 어떻게 동작하나요?
IoC는 제어의 역전으로 인스턴스의 생성 및 소멸을 개발자 대신 스프링 컨테이너가 대신 해주는 것을 의미.
이를 실제로 제어하는 방법으로 DI가 있는데 Bean(POJO=스프링 컨테이너에서 생성된 일반 자바 객체)으로 등록된 객체 생성시 의존성을 주입해준다.
- 동작 : Url-> dispacher-servlet 으로 요청 전달 -> 핸들러 매핑(요청에 맞는 컨트롤러 검사) -> 컨트롤러 로직처리 후 결과를 Model And View로 반환 -> ViewResolver로 View의 실제 위치 전달 -> View에서 Model과 같이 jsp그린후 dispacher-servlet전달 -> 최종적으로 클라이언트에게 반환.
Spring Bean이란 무엇인가요?
POJO로 XML 을 통해 생명주기, 종속성 등을 가진 스프링 컨테이너가 생성한 일반 자바객체
스프링 Bean의 생성 과정을 설명해주세요.
ApplicationContext를 이용해서 객체를 생성하고 스프링 컨테이너를 초기화 -> 빈 객체 생성 -> <property>
태그로 지정한 의존을 설정(이때 의존 주입) -> 모든 의존 설정이 완료되면, 빈 객체 초기화 -> 빈 소멸
스프링 Bean의 Scope에 대해서 설명해주세요.
- singleton
- prototype : 하나의 Bean 정의 다수의 객체 존재 O
- request : 하나의 Bean 마다 하나의 HTTP request 생명주기.
- session : session하나마다 하나의 Bean
- global session : 글로벌 새션 주기 안에 하나의 Bean
IoC 컨테이너의 역할은 무엇이 있을까요?
- IoC 컨테이너는 Bean에 대한 제어권을 가지고 Bean의 생명주기 등을 관리해서 객체들간의 낮은 결합을 도와주는 역할을 합니다.
DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?🤯
-
Field Injection : @Autowired Annotation을 붙이는 방식으로 의존성을 주입하기는 쉽지만,스프링에 의존적인 코드가 된다.
-
Setter Injection : setter 메소드를 통해 외부에서 제공받는 오브젝트 레퍼런스를 내부 메소드에서 사용하며 의존성을 주입하는 방식.
-
Constructor Injection : 필요한 의존성을 모두 포함하는 클래스의 생성자를 통해 의존성 주입.
Autowiring 과정에 대해서 설명해주세요.🤯
- Autowiring : 필요한 의존 객체의 "타입"에 해당하는 Bean을 Ioc컨테이너에서 찾아 주입해주는 것.
- 동작과정: BeanPostProccessor라는 인터페이스의 구현체인 AutowiredAnnotationBeanPostProcessor에 의해 의존성을 주입
프론트 컨트롤러 패턴이란 무엇인가요?
- 클라이언트 요청에 맞는 컨트롤러를 찾아서 호출해서 처리하는 패턴. -> 공통 코드로 처리가능.
Servlet Filter와 Spring Interceptor의 차이는 무엇인가요?
- 공통점 : 여러 작업을 처리함을써 중복된 코드를 제거할 수 있음.
- 차이점 :
- 필터는 요청이 servlet 전/후에 url패턴에 맞는 부가작업을 처리할 수 있음.(Init,destroy)
- 인터셉트는 디스패처 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능
Spring에서 CORS 에러를 해결하기 위한 방법을 설명해주세요.
-
CrossOrigin 어노테이션 사용하기
-
WebMvcConfigurer 에서 설정하기
-
CorsFilter 생성하기(커스텀)
Bean/Component 애노테이션에 대해서 설명해주시고, 둘의 차이점에 대해 설명해주세요.
- 공통점 : 둘 다 IoC 컨테이너에 빈으로 등록하기 위한 방법.
- 차이점 : @Bean은 개발자가 컨트롤 못하는 외부 라이브러리, @Component는 직접 컨트롤하는 클래스
Spring Web MVC에서 요청 마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성될 수 있을까요?
생성한 Controller 클래스에 대한 정보가 JVM 메모리 영역 중 '메서드 영역'에 올라가기 때문입니다. 객체는 힙에 생성 되지만, 해당 클래스의 정보는 메소드영역에 생성 됩니다. 그래서 결국 모든 쓰레드가 객체의 메서드를 공유할 수 있습니다.
JPA
JPA란?
자바 인터페이스의 모음으로 자바의 ORM 기술 표준으로 DB와 스프링 프로젝트 중간에서 자동으로 매핑을 진행해주는 기술입니다.
JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.
- 1차 캐시 : 내부의 캐시에 엔티티를 저장할 수 있음
- 동일성 보장 : 엔티티의 동일성(주소와 값 모두..)을 보장해줌.
- 트랙잭션을 지원하는 쓰기 지연: 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 내부 쿼리 저장소에 INSERT SQL을 모아 커밋할 때 모아둔 쿼리를 DB에 보냄.
- 변경 감지 : 엔티티 수정할 때는 단순히 엔티티를 조회해서 데이터를 변경하면 된다
- 지연 로딩 :
JPA를 쓴다면 그 이유에 대해서 설명해주세요.
- 패러다임 불일치를 대신 해결해줌 : SQL 맵핑의 중복과 반복 단점을 해결해준다. (상속, 연관관계, 객체 그래프 탐색, 비교)
- SQL 중심적인 개발에서 객체 중심으로 개발 : 영속 계층과 관련된 로직을 컬렉션 다루듯이 사용할 수 있도록 해준다.
- 유지보수 -> 필드만 추가하면 SQL은 JPA가 대신 처리
- 데이터 접근 추상화와 벤더 독립성
- 성능 최적화 (1차 캐싱, SQL 배치 요청, 지연 로딩)
패러다임 불일치란?
객체와 RDB는 지향하는 목적이 다르기에 객체를 다루는 방식과 테이블을 다루는 방식간의 패러다임 불일치가 존재
- 대표적인 불일치
- 상속: 객체는 상속 O, DB는 X
-방향성 : 객체는 단방향 . 테이블은 양방향