저의 생각을 정리한거라서 답이 아닐 수 있습니다.
동기와 비동기의 차이점
- 동기: 호출된 함수가 작업을 완료하기 전까지 호출 함수가 대기합니다. 작업이 순차적으로 진행됨을 의미합니다.
- 비동기: 동기와 반대되는 개념으로 호출된 함수가 작업을 완료할 때 까지 기다리지 않고 작업을 다음 작업을 진행합니다. 작업이 순차적으로 진행되지 않고 비동기 호출이라면 동시에 일어나지 않음을 의미합니다.
결론: 동기는 함수가 실행을하고 작업을 완료하기 전 까지 호출 함수가 대기합니다. 하지만 비동기는 이와 반대되는 개념으로 호출 함수가 작업완료를 기다리지 않고 다음 작업을 진행합니다.
- 동기: 호출된 함수가 실행을 하고 작업을 완료하기 전까지 호출함수가 대기합니다
- 블로킹: 동기와 유사한 개념이지만 블로킹은 호출한 함수의 실행 결과를 기다리기 위해 실행을 멈추는 상태를 의미합니다.Java/Kotlin 기본Java 8에서 도입된 주요 기능들에 대해 설명해주세요 (Stream API, Lambda, Optional 등)
- 보통 모던 자바라고 부르는 Java 8에는 크게 Stream API, Lambda, Optional등 다양한 기능을 제공합니다. Optional을 NullPointerException을 방지해주는 역할, Stream API는 객체 외부의 흐름을 객체 내부에서 관리할 수 있도록 도움을 줍니다.
Lambda는 함수형 프로그래밍을 지원하기 위한 기능으로, 메서드를 하나의 식으로 표현 할 수 있도록 도와줍니다. 주로 함수형 인터페이스와 함께 사용됩니다.
Stream API는 컬렉션의 요소들을 람다식으로 처리하게 해줍니다. 다양한 메서드를 통해 중간/최종 연산을 제공합니다. 병렬 처리를 쉽게 할 수 있도록 구현되어 있습니다.
Kotlin의 장점과 Java와의 주요 차이점에 대해 설명해주세요
- 둘다 JVM이고 Kotlin은 멀티플랫폼 언어로 작성했을때 다른언어로 해석할 수 있습니다.
Null safety: 타입 시스템에서 Null을 명시적으로 표현할 수 있습니다.
Smart Cast: 타입검사와 캐스트를 한번에 처리합니다.
속성과 데이터 클래스를 통해 간편한 구현이 가능합니다.
코루틴을 사용해 강력한 비동기 처리가 가능합니다.
Java의 GC(Garbage Collection)에 대해 설명해주세요
- 자바는 런타임 과정에서 더이상 사용하지 않는 객체를 GC에 보냅니다.
GC의 동작 과정: Mark and Sweep 알고리즘
GC의 종류: Serial GC, Parallel GC, CMS GC, G1 GC 등
Stop-the-World 현상과 GC 튜닝의 중요성
가비지 컬렉터는 주기적으로 JVM의 heap 메모리를 점검하여 스택에서 참조되지 않는 객체를 메모리에서 해제하는 장치이다.
불변 객체(Immutable Object)의 장점과 구현 방법에 대해 설명해주세요
- 불변 객체는 말그대로 변하지 않는 객체를 의미합니다. 변하지 않는 객체는 객체가 중간에 변하지 않기 때문에 내부 값의 신뢰성이 높습니다. 구현 방식은 객체가 내부메서드에서 자기 자신의 값을 뱉거나 내부 값이 변경해야 하는 상황이 있다면, 그때 내부 필드를 변경하는 게 아니라 새로운 객체를 생성해서 return합니다.Spring Boot & Spring FrameworkSpring Boot가 Spring Framework와 비교했을 때 가지는 장점은 무엇인가요?
- 스프링(Spring)은 프레임워크이며, 스프링 부트(Spring Boot)는 스프링 프레임워크를 기반으로 한 도구입니다. 스프링은 설정 파일을 작성해야 하지만, 스프링 부트는 자동 설정을 제공하여 간편하게 개발할 수 있습니다. 또한, 스프링 부트는 내장 서버를 제공하여 쉽게 웹 애플리케이션을 실행할 수 있습니다. Spring은 스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에, Spring Boot는 빠르고 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에 사용됩니다.
Spring의 DI(Dependency Injection)와 IoC(Inversion of Control)에 대해 설명해주세요
- 스프링은 내부적으로 프레임워크의 시작점에서 컴포넌트 스캔이라는 것을 합니다. 이 과정을 거치게 되면 스프링에서 빈에 등록되어 사용되어야할 객체들의 정보를 가져오고, 그 정보를 바탕으로 객체를 생성하고 DI Container에 보관합니다. 그리고 각각 필요한 의존성을 주입해줍니다. 이것이 스프링 프레임워크의 IoC, 제어의 역전, 프레임워크가 실행을 제어한다라는 의미인 것 같습니다. 개발자가 프로그램의 생명주기및 객체생성을 제어하는 것이 아닌, 프레임워크가 객체의 생성주기를 관리하고 의존성주입을 하게됩니다.
Spring AOP의 동작 원리와 사용 사례에 대해 설명해주세요
- 관심사의 분리를 통해 모듈성을 증가시키는 패러다임입니다.
핵심 비즈니스 로직과 부가 기능을 분리시킬 수 있다는 장점이 있습니다. 로깅, 트랜잭션, 보안 등을 분리 가능한 부가기능으로 보는 경우가 많습니다. 내부적으로 AOP 적용시에 프록시 객체를 생성하게 됩니다. 만약 UserService에 AOP를 적용시키면 UserProxyService가 생성되고 로깅 트랜잭션 보안 등 메서드가 새로 생성될 것입니다.
Spring Bean의 생명주기와 Scope에 대해 설명해주세요
- 크게는 빈 생성, 초기화, 소멸 단계로 이루어집니다. 생성자를 통해서 빈을 생성하고 의존성을 필요로 한다면 상위 빈을 생성하고 모든 단계가 이루어 지면 주입시키고 객체를 생성합니다. 그리고 스프링 컨테이너가 종료될 때, 자원을 정리하고 종료됩니다.
Spring Security를 사용한 인증/인가 구현 경험이 있다면 설명해주세요
- spring security를 사용하지 않았지만, 서블릿에서 지원하는 filter라는 기능을 통해 인증 인가를 구현했습니다. OncePerRequestFilter를 사용하면 처음 서블릿에 오는 요청에 대해 1회 검증을 시도할 수 있습니다. 그것을 통해 redis서버에서 accesstoken을 검사합니다. accessToken은 redis에서 관리하고, redis는 ttl을 지원하기 때문에 accessToken의 만료여부를 쉽게 관리할 수 있습니다.Spring Security에 의존하지 않기 위해 혼자 구현했습니다.
Database
인덱스(Index)가 무엇이고 어떤 상황에서 사용하면 좋을지 설명해주실 수 있나요?
- 인덱스란, DB의 성능 최적화를 위한 하나의 방법으로, DB를 하나의 기준을 통해 정렬하여 조회 성능을 최적화 하는 기법입니다. 하지만, 인덱스를 사용하게 되면 command가 발생하여 DB의 컬럼이 추가 삭제 수정 될 때마다 인덱싱을 해줘야 하기 때문에 손해가 발생할 수 있습니다. 보통 where, order by, join 에서 자주 사용되는 컬럼을 인덱싱하는 경우가 많으며, 잦은 변경이 있는 테이블은 인덱싱이 오히려 불리할 수 있습니다. B-Tree 구조를 사용하여 데이터를 정렬된 상태로 유지합니다.
- B-Tree: 데이터베이스 인덱싱에서 사용되는 균형 트리 자료구조로, 하나의 노드가 여러 개의 키를 가질 수 있어 효율적인 검색이 가능합니다.
DB 정규화가 무엇이고 왜 필요한지 설명해주실 수 있나요?
- DB 정규화는 데이터 베이스의 무결성과 일관성을 유지하기 위해 고안된 방법으로, 데이터 컬럼의 속성이 너무 많은 정보를 가질경우 사용합니다. 예를 들어 유저의 ROLE이 너무 방대하거나 일정하지 않다면 정규화를 통해 일관성과 무결성을 가지는 컬럼으로 관리할 수 있습니다.
- 데이터베이스의 설계를 체계화하는 과정으로, 중복을 최소화하고 데이터의 일관성, 무결성을 보장하기 위한 과정입니다.
트랜잭션의 ACID 속성에 대해 설명해주실 수 있나요?
- ACID는 논리적 작업 단위라고 부릅니다. 프로세스에서의 작업단위와 데이터 베이스의 작업단위는 다릅니다. 예를들어 은행에서 금액을 조회하고 금액을 인출하는 프로세스가 있다고 가정한다면 하나의 프로세스이지만 데이터 베이스에서는 조회 쿼리 인출 쿼리가 진행 될 것이고 하나의 작업이 아닌 두개 이상의 작업이 이루어 집니다. 즉, 하나의 트랜잭션이 아니라 두개이상의 트랜잭션이 이루어지게 됩니다.
- 여기서 트랜잭션의 ACID는 원자성, 일관성, 격리성, 지속성의 약자로, 트랜잭션이 가져야 하는 속성을 의미합니다. 원자성은 하나의 트랜잭션이 성공하면 모두커밋되고 실패되면 모두 롤백되도록 하여야한다는 의미입니다. 일관성은 트랜잭션 전후의 무결성이 유지되어야 한다는 의미입니다. 격리성은 트랜잭션이 동시에 실행되더라도 서로의 작업 단위에 영향을 끼치면 안된다는 의미입니다. 마지막으로 지속성은 커밋된 트랜잭션은 영구적으로 반영되어야 하고, 시스템 장애가 발생하더라도 커밋된 내용은 보장되어야한다는 의미입니다. 지속성은 보통 DBMS가 지원하기 때문에 개념만 알면 될 것 같습니다.
DB 락(Lock)의 종류와 각각의 특징에 대해 설명해주실 수 있나요?
- DB락이란, 데이터 베이스의 트랜잭션이 진행되는 동안 다른 트랜잭션이 접근할 수 없도록 막는것을 DB락 이라고 합니다. 예를 들어, A 트랜잭션이 진행도중 B 트랜잭션이 접근하여 데이터를 접근해서 먼저 끝내버리면 A가 접근하는 데이터의 무결성과 일관성이 유지되지 못하기 때문에 이를 막기위해서 데이터베이스에 락을 걸어서 다른 트랜잭션이 접근 못하게 A트랜잭션이 종료될 때 까지 대기시키는 것이 락입니다. 락을 걸게 되면 데이터의 안정성이 보장되지만 실행 속도는 조금 저하될 수 있습니다. 조회용 쿼리는 락을 걸지 않도록하는것이 하나의 방법일 것 같습니다.
데이터베이스 인덱스의 장단점을 설명해주세요.
- 인덱스는 양날의 검입니다. 잘 사용하면 매우 좋지만 잘못사용하면 성능 저하를 발생시킵니다. 보통 조회의 비율이 높은 테이블에 인덱스를 걸고, 조회보다는 쓰기, 삭제 등 command 기능이 많은 테이블에는 인덱스를 걸지 않습니다. 인덱스는 트랜잭션이 일어날 때 마다 인덱싱을 다시 해주기 때문에 성능이 좋지않을 수 있지만, 잘 사용하게 되면 조회 기능에서의 엄청난 성능 개선이 가능합니다.
반응형
'BackEnd' 카테고리의 다른 글
FCM(Firebase Cloud Messaging)을 Spring boot에서 테스트 하기 좋은 코드로 만들어보기 (0) | 2025.01.13 |
---|---|
[Spring] FCM + 스프링 부트로 푸시 알림 구현 고민하기 (0) | 2025.01.07 |
[Spring] Filter에서 Exception을 관리하는 법 (0) | 2024.12.19 |
[Spring] @RestControllerAdvice를 통한 스프링에서의 예외처리 (1) | 2024.12.16 |
[DB] 효율적인 설계를 위해 어떤 SQL을 사용해야 할까? RDBMS vs NoSQL과 DB에서의 수직 확장(scale-up)과 수평 확장(scale-out) (0) | 2024.06.20 |