개발자 취준 기록 1일차
1. Call by reference란 무엇이고 보통 어떻게 쓰이나요?
Call by reference는 메서드 인자로 전달되는 참조변수의 주소를 메서드 내부에 전달 해주는 방식입니다. 주로 호출자의 참조 변수를 직접 변경해야 하는 경우 Call by reference를 사용합니다.
java의 경우 call by value 방식으로 동작하며, 객체의 경우 주소값 자체를 복사하여 전달하기 때문에 call by reference 동작처럼 보입니다.
[추가 정리]
매개변수(parameter) : 함수 정의에 지정된 이름
인자(Argument) : 함수 호출에 제공 된 값
java는 call by value로 동작
→ 원시값은 복사
→ 객체는 힙메모리 주소 복사
2. Override 와 Overload 를 설명해주실 수 있을까요?
오버라이딩과 오버로딩은 이름이 비슷해서 오해가 생길 수 있지만 전혀 다른 개념입니다. 오버라이딩은 상위 메서드를 무시하고 하위에서 메서드를 재정의 하는 것이고, 오버로딩은 같은 메서드 이름으로 여러 기능을 구현하는 것 입니다.
오버로딩 조건 정확히 알고있나?
→ 파라미터의 개수 다르면 가능
→ 파라미터 타입 달라도 가능
→ 리턴값만 다르면 불가능
3. JPA는 언제 필요하고 언제 필요하지 않은지 설명해주실 수 있을까요?
JPA는 데이터베이스 테이블과 객체간의 맵핑을 단순화 하기 위해 사용하는자바의 표준 기술로, 객체지향적인 관점에서 쿼리문보다는 객체에 더 집중해서 프로그래밍 할 수 있습니다. 반면에 성능을 위하거나 혹은 복잡한 쿼리를 직접 사용해야 하는경우에는 JPA보다 SQL쿼리를 사용하는게 좋을 수 있습니다.
4. JPA의 더티 체킹이란 무엇인가요?
더티 체킹은 JPA의 특징 중 하나로 트랜잭션 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 기능입니다.
[추가 정리]
변경 감지 방법
1. DB에서 엔티티를 로딩하고 최초 엔티티의 상태를 스탭샷으로 저장합니다.
2. 트랜잭션 범위내에서 엔티티의 속성이 변경됐을 때 해당 변경사항을 추적합니다.
3. 커밋시점에 엔티티의 현재상태와 스냅샷 상태를 비교하여 변경된 부분만 DB에 업데이트 합니다.
특징
1. Entity Manager가 가지고 있는 영속성 컨텍스트(메모리 영역)는 역속 상태의 엔티티들을 가지게 되고, 영속상태의 엔티티들은 더티체킹의 대상이 된다.
2. 준영속/비영속 상태의 엔티티는 더티체킹의 대상이 되지 못한다.
5. JVM 이란 무엇이고 왜 필요한지 설명해주실 수 있을까요?
JVM(자바 가상 머신)은 자바언어로 작성된 프로그램을 컴파일하고 실행시켜주는 역할을 수행합니다. 프로그램 자체가 JVM위에서 동작하기 때문에 어떤 플랫폼이든지 JVM 환경만 갖춰진다면 자바 프로그램을 실행시킬 수 있습니다. 또한 JVM에서 GC를 해주기 때문에 메모리 해제작업을 해주지 않아도 됩니다.
6. Java가 컴파일되는 과정은 어떻게 되는지 설명해주실 수 있을까요?
프로그래머는 자바 소스 코드를 .java 확장자로 작성하고, .java 로 작성된 프로그램이 javac라는 컴파일러를 통해 자바 바이트코드(.class)로 컴파일 됩니다.
JVM은 자바 바이트코드를 OS가 실행할 수 있는 기계어 코드로 변환하고 실행합니다.
[추가 정리]
JVM 구조
→ 클래스 로더 시스템
→ 메모리
→ 실행엔진
- 인터프리터, GIT컴파일러, GC
→ 네이티브 메서드
7. JVM의 스택과 힙메모리 영역에 대해 아는 만큼 설명해주실 수 있을까요?
핵심 키워드 : 정적/동적 할당, 스레드, GC, 생성, 수거
JVM에서 스택영역은 스레드마다 별도로 할당되는 정적 메모리 영역으로, 메서드 호출 시 스택 프레임이 생성되고, 이 스택 프레임에 메서드의 지역변수, 매개변수가 저장됩니다.
JVM의 힙영역은 객체가 생성될때마다 저장되는 동적 메모리 영역으로, 하나의 프로세스내의 모든 스레드에서 공유할 수 있는 메모리 영역입니다. 또한 힙 영역에 있는 인스턴스들은 GC( Garbage Collector)의 대상이 되므로 사용하지 않는 인스턴스를 수거할 수 있습니다.
8. 클래스와 인스턴스의 차이에 대해 설명해주실 수 있을까요?
객체 정의, 설계, 생성(new)
클래스는 객체를 생성하기 위한 설계도입니다. 이 클래스를 통해서 객체정보를 정의하고 객체를 생성할 수 있습니다. 이러한 객체들은 클래스를 통해서 여러개가 생성될 수 있는데, 이렇게 생성된 여러개의 객체들 각각을 인스턴스라고 부릅니다.
[추가 정리]
쉽게 예시를 들 수 있으면 좋을 듯.
벤츠제작기계(클래스)
벤츠(객체)
생성된 실제 벤츠들(인스턴스)
9. Garbage Collector의 역할, 원리, 알고리즘에 대해 아는 만큼 설명해주실 수 있을까요?
핵심 키워드 : JVM, heap, Stack, 메모리, 할당과 해제, Mark / Sweep / Compact 과정
가비지컬렉터는 힙 영역에서 동적으로 할당됐던 메모리 중 사용하지 않는 메모리의 객체(garbage)를 모아 주기적으로 제거하는 역할을 수행합니다. GC의 RootSpace로부터 그래프 탐색방식으로 객체들을 탐색하면서 더 이상 참조되고 있지 않은 객체들을 찾아내 제거 합니다. 가비지 컬렉션을 수행중일 때 애플리케이션이 지연되는 문제가 발생하기 때문에, 이를 최적화 하기위해 다양한 가비지 컬렉션 알고리즘이 개발되었습니다. 대표적으로 Serial GC, Parallel GC, CMS GC, G1 GC등이 존재합니다. 애플리케이션의 특성과 메모리크기, 사용환경등에 따라 적절한 GC알고리즘을 선택하고 GC튜닝을 통해 최적의 성능을 얻을 수 있습니다.
1. Serial GC: Serial GC는 싱글 스레드로 동작하는 GC 알고리즘입니다. 즉, GC 동작 시 애플리케이션의 모든 스레드가 일시 중지됩니다. 따라서 작은 메모리 환경에서는 효과적이지만, 대규모 메모리에서는 성능이 저하됩니다.
2. Parallel GC: Parallel GC는 Serial GC와 비슷한 알고리즘이지만, 여러 스레드를 사용하여 GC 작업을 병렬화합니다. 따라서 대규모 메모리에서 더 빠른 GC 수행을 가능하게 합니다.
3. CMS GC: CMS(Concurrent Mark and Sweep) GC는 일시 중지 시간을 최소화하기 위해 개발된 알고리즘입니다. 애플리케이션 스레드와 함께 GC 작업을 병행하므로 일시 중지 시간이 짧습니다. 그러나 복잡한 애플리케이션에서는 성능 문제가 발생할 가능성이 있습니다.
4. G1 GC: G1 GC(Garbage First)는 대규모 메모리에서 최적화된 알고리즘입니다. 전체 힙을 여러 개의 작은 영역으로 분할하여 GC 작업을 수행하며, 일시 중지 시간을 최소화합니다. 이 외에도 다양한 GC 알고리즘이 있습니다. GC 알고리즘 선택은 애플리케이션의 특성과 메모리 크기, 사용 환경 등에 따라 다릅니다. 따라서 적절한 GC 알고리즘을 선택하고, GC 튜닝을 통해 최적의 성능을 얻을 수 있습니다.
10. Java Map의 내부 구현은 어떻게 이루어져 있을지 추측해보실 수 있을까요?
자바의 Map은 키-값의 쌍으로 저장되어 있는 구조입니다. 키-값 형태로 저장하기 위해서 내부적으로 해시테이블이나 트리의 형태로 구현되었을 것이라고 생각합니다.
해시테이블의 경우 해시 함수를 통한 키값을 통해 배열의 인덱스에 매핑하여 저장할 수 있고, 이를 통해 Map을 구현할 수 있을 것입니다.
트리의 경우 이진 탐색 트리를 기반으로 정렬된 키값을 통해 탐색하는 방식으로 Map을 구현할 수 있을
11. DI와 IoC에 대해 아는 만큼 설명해주실 수 있을까요?
DI(의존성 주입)은 기존에 class 내부에서 new 연산자를 통해 객체를 생성하는 것과는 달리, 외부에서 생성된 객체를 메서드 혹은 생성자를 통해서 전달받는 것입니다.
이렇게 내부에서 직접 생성하지 않고 외부에서 생성된 객체를 전달받아(주입받아) 사용된다고 해서 IoC(제어의 역전)이라고 부릅니다
12. MVC 모델이란 무엇인지 설명해주실 수 있을까요?
MVC 모델은 복잡한 애플리케이션을 역할에 따라 3가지로 분리하여 유지 보수, 확장성, 유연성 등의 장점을 가지는 디자인 패턴입니다.
M은 Model의 약자로 애플리케이션 상의 데이터들을 의미합니다.
V는 View의 약자로 사용자의 입력을 받거나 Model의 데이터를 출력하는 역할을 담당합니다.
C는 Controller의 약자로 Model과 사용자를 연결하는 역할을 수행하며, Model에 접근해 데이터를 제어하고, View를 통해 데이터 입/출력을 제어합니다.
13. Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?
어노테이션은 코드에 정보를 추가하여 컴파일 혹은 런타임시에 특별한 기능을 수행하도록 하는 기술입니다.
컴파일 시점에 문법을 검사하여 오류를 발생시키거나, 런타임 시점에 특정 코드를 추가하는등의 기능을 수행할 수 있습니다.
대표적으로 Java 에서 @Override가 있는데요, @Override어노테이션은 해당 메서드가 부모 클래스 혹은 인터페이스 메서드를 오버라이딩 하고 있다는 것을 나타냅니다.
컴파일러는 컴파일 시점에 해당 메서드가 부모메서드를 오버라이딩 하고 있는지 체크하고 잘못된 오버라이딩의 경우 오류를 발생시킵니다.
[추가 정리]
- 롬복의 @Getter : 컴파일 시점에 필요한 Getter 메서드를 추가해준다.
- 스프링의 @Component : 스프링이 컴포넌트들을 스캔할 때 @Component를 확인하면서 Bean으로 등록한다.
14. Spring Security의 구조와 JWT 발급 과정에 대해 설명해주실 수 있을까요?(추가 정리중)
spring security는 내부에 Filter chain을 가지고 있고, 요청에 대해 인증, 인가, 보안관련 작업들을 수행하는 여러개의 필터들로 구성되어있습니다. 사용자 요청에 대해 연속적인 filter들을 통과하고 응답에대해 다시 filter를 타고 되돌아오는 방식으로 동작합니다.
Spring Security에서는 Security Context라는 보안 정보를 통해 인증/인가를 관리할 수 있습니다.
Security Context에 Principal(사용자), Credentials(자격 증명), GrantedAuthorities(권한)라는 인증정보를 가지고 있고, Authentication Manager가 인증 정보를 검사합니다.
JWT를 발급하기 위해서는 크게 헤더(Header), 페이로드(Payload), 서명(Signature) 3가지 정보가 필요합니다.
헤더에는 토큰 유형 혹은 해싱 알고리즘에 대한 정보를 포함하고, 페이로드에는 사용자의 식별정보, 권한정보, 만료시간 등이 포함됩니다. 마지막으로 서명은 토큰을 발급할 때 사용되는 비밀 키를 사용하여 헤더, 페이로드를 인코딩하는 역할을 수행합니다.
Authentication Manager(인증 관리자) : 사용자의 인증정보를 검사합니다.
Security Filter Chain (보안 필터 체인) : 다양한 보안 필터가 연결된 형태로, 요청을 처리하고 응답을 생성하기 전에 다양한 보안 검사를 수행합니다.
15. N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다.
N + 1 문제는 ORM기술에서 1개의 엔티티를 조회할 때, 엔티티와 연관된 N개의 엔티티를 추가로 조회하면서 총 N + 1개의 쿼리문이 발생하는 상황을 의미합니다.
대표적으로 JPA기술에서 즉시로딩 방식을 사용할 때 findAll()메서드를 호출하거나, 지연로딩 방식에서 연관된 객체에 접근하는경우 추가적으로 N개의 쿼리가 발생할 수 있다.
N + 1문제를 해결하는 방법에는 Fetch Join, EntityGraph, Batch Size가 있습니다.
[추가 정리]
Fetch Join -
EntityGraph -
Batch Size -
16. 즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있을까요?
즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)은 ORM(Object-Relational Mapping)을 사용하는 애플리케이션에서 데이터를 가져오는 방식을 나타냅니다.
즉시로딩은 주로 @ManyToOne 또는 @OneToOne 관계에서 연관된 엔티티의 정보가 항상 필요한 경우에 사용될 수 있고, 쿼리 수행 횟수를 줄여 성능을 향상시킬 수 있습니다.
지연로딩은 주로 @ManyToMany 또는 @OneToMany 관계에서 당장 연관된 엔티티가 필요하지 않는경우에 사용될 수 있고, 필요한 경우에만 데이터를 로드하여 네트워크 트래픽과 메모리 사용을 최적화 할 수 있습니다.
[추가 정리]
프록시 객체란?
지연로딩의 조회 시점은 언제인가?
17. Spring bean container 생성부터 스프링 종료까지의 사이클에 대해 알려주실 수 있을까요? @PostConstruct, @PreDestroy 어노테이션의 역할도 함께 알려주시면 좋습니다.
스프링빈은 크게 생성, 의존성 주입, 초기화/소멸의 과정으로 이루어져 있습니다.
생성단계에서는 Bean이 스프링컨테이너에 등록되며 인스턴스가 생성됩니다.
의존성 주입단계에서 특정 Bean이 필요한 다른 Bean들에 대해 의존성 주입이 이루어집니다.
초기화와 소멸의 과정에서는 의존성 주입이 완료된 후에 Bean을 초기화 하는 작업이 이루어 집니다.
@PostConstruct가 붙은 메서드는 의존성 주입 이후 초기화단계에서 수행됩니다.
@PreDestroy가 붙은 메서드는 소멸 단계에서 빈이 제거되기 전에 수행됩니다.
[추가 정리]
@PostConstruct의 장점? 사용이유?
18. AOP, Interceptor, Filter 의 차이점, Request가 들어올때 거치는 순서, 각 역할들의 장점을 설명해주실 수 있을까요?
AOP, Interceptor, Filter모두 공통 로직을 핵심기능에서 분리하여 관리할 수 있다는 공통점이 있습니다.
Filter는 웹 컨테이너, Interceptor는 스프링 컨테이너에서 관리한다는 차이점이 있습니다.
또한 Filter와 Interceptor는 servlet 요청 단위로 이루어지고, AOP는 메서드 단위로 Proxy패턴의 형태로 동작합니다.
Filter는 요청이 스프링 컨테이너에 전달되기 전에 공통적인 로직을 FilterChain형태로 추가할 수 있습니다.
Interceptor의 경우네는 스프링 컨테이너가 관리하기 때문에 스프링에서 관리하는 빈들을 사용할 수 있다는 장점이 있습니다.
AOP의 경우 객체지향 프로그래밍을 보완하기 위해 나온 관점지향프로그래밍 방법입니다.객체 지향 프로그래밍을 했을 때 중복을 줄일수 없는 부분을 줄이기 위해 종단면에서 바라보고 처리한다. 주로 메서드 단위로 수행되기 때문에 비즈니스 로직에 많이 활용된다.(로깅, 트랜잭션)
요청순서는 request 요청이 들어왔을 때 Filter, Interceptor, AOP 순으로 동작합니다.
[추가 정리]
Proxy패턴이란?
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.