5. 사용자 인증 및 상태 관리를 위해 사용 되는 방법엔 어떤 것들이 있나요?
"사용자 인증 및 상태 관리를 위해 다양한 방법이 사용됩니다. 전통적으로 세션 기반 인증이 많이 사용되며, 이 경우 서버는 사용자의 로그인 상태를 서버의 메모리나 데이터베이스에 저장합니다. 클라이언트는 세션 ID를 쿠키를 통해 저장하고, 이를 이용해 요청마다 서버에 자신을 인증합니다. 반면, 토큰 기반 인증, 특히 JWT(JSON Web Token)는 상태를 유지하지 않는 RESTful 서비스에 적합하며, 서버는 사용자 상태를 저장하지 않고 사용자는 각 요청에 토큰을 첨부하여 자신을 인증합니다. OAuth와 같은 제3자 인증도 널리 사용되며, 사용자는 Google이나 Facebook 같은 서비스를 통해 다른 애플리케이션에 로그인할 수 있습니다. 또한, 최근에는 웹 스토리지, 예를 들어 localStorage나 sessionStorage를 사용해 클라이언트 측에서 사용자 상태를 관리하는 방법도 있습니다. 각 방법은 사용 사례와 보안 요구 사항에 따라 선택됩니다."
꼬리 질문 > 세션 기반 인증과 토큰 기반 인증 사이에서 어떤 상황에서 각각을 선택하는 것이 더 적합하다고 생각하나요?
"세션 기반 인증은 서버가 사용자의 로그인 상태를 추적하므로, 서버 측에서 사용자 상태를 직접 관리해야 할 때 적합합니다. 이 방식은 전통적인 웹 애플리케이션에서 유용하며, 사용자의 로그인 세션을 서버 메모리나 데이터베이스에 저장하여 관리합니다. 반면, 토큰 기반 인증, 특히 JWT는 상태를 유지하지 않는 API 서비스에 적합합니다. RESTful 애플리케이션과 마이크로서비스 아키텍처에서 서버가 사용자 상태를 유지하지 않고, 스케일 아웃을 용이하게 하는 무상태 특성을 갖추고자 할 때 유리합니다. 따라서 애플리케이션의 아키텍처, 확장성 요구, 그리고 보안 요구 사항에 따라 각각의 인증 방식을 선택할 수 있습니다. 예를 들어, 분산 시스템이나 클라우드 기반 서비스에서는 토큰 기반 인증이, 단일 서버 애플리케이션에서는 세션 기반 인증이 더 적합할 수 있습니다."
6. Docker에 대해 설명해주시고 MSA 구조에서 Docker를 사용함으로써 가져갈 수 있는 이점에 대해 설명해주세요.
"Docker는 애플리케이션을 컨테이너화하여 개발, 배포 및 실행을 단순화하는 오픈 소스 플랫폼입니다. 컨테이너는 애플리케이션과 그 의존성을 패키지화하여, 다양한 환경에서도 일관된 방식으로 실행할 수 있게 합니다. MSA(Microservices Architecture) 구조에서 Docker를 사용하면, 각 마이크로서비스를 독립적인 컨테이너로 배포할 수 있으며, 개발 환경과 운영 환경 간의 일관성을 보장합니다. Docker 컨테이너는 어떤 환경에서도 동일하게 실행되므로, "개발 환경에서는 잘 작동했는데 운영 환경에서는 안 된다"는 문제를 줄일 수 있습니다. 마이크로서비스 간의 격리를 통해 각 서비스의 독립성을 강화하며, 이는 서비스의 확장성과 안정성을 높입니다. 또한, 마이크로서비스의 빠른 배포와 스케일링을 가능하게 하며, CI/CD 파이프라인과 통합하기 용이하여 개발 및 배포 프로세스를 자동화할 수 있습니다. 이처럼, Docker를 사용함으로써 MSA 구조의 애플리케이션 개발과 관리가 더욱 유연하고 효율적으로 이루어질 수 있습니다."
꼬리 질문 > Docker 컨테이너화가 전통적인 가상 머신(VM) 환경과 비교했을 때, MSA 구조에 특히 어떤 추가적인 이점을 제공하나요?
"Docker 컨테이너화는 전통적인 가상 머신(VM) 환경 대비 MSA 구조를 갖는 애플리케이션의 개발, 배포, 운영을 더욱 민첩하고 효율적으로 만들어 줍니다. Docker 컨테이너는 가상 머신보다 훨씬 가벼우며, OS를 공유함으로써 리소스 사용을 최소화합니다. 이는 시스템 리소스를 효율적으로 활용하며, 더 많은 마이크로서비스를 동일한 하드웨어에서 실행할 수 있게 합니다. 또한, 컨테이너의 시작 시간이 빠르기 때문에, 마이크로서비스의 배포와 스케일링이 신속하게 이루어질 수 있습니다. 이는 MSA 환경에서 서비스의 빠른 반복 개발과 지속적인 통합/배포(CI/CD)를 지원하는 데 큰 이점을 제공합니다. Docker는 애플리케이션과 그 의존성을 컨테이너 내에 패키지화하여, 환경 간 설정 차이로 인한 문제를 최소화합니다. 이는 MSA의 다양한 서비스가 다른 환경에서도 일관된 방식으로 실행될 수 있도록 보장하며, 개발에서 운영까지 이어지는 파이프라인의 복잡성을 줄여줍니다."
7. Java에서 동기화의 개념은 무엇인가요?
"Java에서 동기화는 멀티 스레딩 환경에서 여러 스레드가 동시에 같은 자원에 접근할 때 발생할 수 있는 데이터의 불일치 문제를 방지하기 위해 사용되는 개념입니다. 동기화를 통해, 한 번에 하나의 스레드만 특정 자원이나 코드 블록에 접근할 수 있도록 제한함으로써, 데이터의 일관성과 무결성을 유지할 수 있습니다. Java에서는 `synchronized` 키워드를 메소드 또는 코드 블록에 적용하여 동기화를 구현합니다. 이렇게 동기화된 메소드나 코드 블록은 해당 자원을 사용하고자 하는 스레드가 잠금을 획득할 때까지 대기하게 되며, 잠금을 가진 스레드가 작업을 완료하고 잠금을 해제한 후에 다음 스레드가 접근할 수 있습니다. 이는 멀티 스레드 프로그래밍에서 중요한 데이터 일관성을 보장하는 핵심 방법입니다."
꼬리 질문 > 동기화를 구현할 때 synchronized 키워드 외에 Java에서 제공하는 다른 메커니즘은 무엇이 있나요, 그리고 이러한 방법들이 synchronized와 어떻게 다른가요?
"Java에서는 synchronized 키워드 외에도 ReentrantLock, ReadWriteLock 같은 명시적인 락 메커니즘을 제공합니다. 이러한 락들은 java.util.concurrent.locks 패키지에 있으며, 보다 세밀한 락 관리를 가능하게 합니다. 예를 들어,ReentrantLock은 synchronized와 유사한 기능을 제공하지만, 시도-획득-해제 패턴을 명시적으로 사용하며, 락 획득 시 대기 시간을 설정할 수 있는 기능 등 추가적인 기능을 제공합니다. ReadWriteLock은 읽기 작업과 쓰기 작업에 대해 다른 락을 제공하여, 여러 스레드가 동시에 읽기 작업을 수행할 수 있게 하면서 쓰기 작업은 단독으로 수행되도록 합니다. 이런 방법들은 synchronized보다 더 유연하고 세밀한 제어가 가능하게 하며, 특정 시나리오에서 성능 향상을 가져올 수 있습니다. 하지만 사용이 더 복잡하고, 잘못 사용할 경우 데드락 같은 문제를 일으킬 수 있으므로 주의가 필요합니다."
8. 데이터베이스 Replication에 대해 아는 만큼 설명해주세요.
"데이터베이스 Replication은 데이터를 하나의 데이터베이스 서버에서 다른 서버(또는 여러 서버)로 복사하거나 동기화하는 과정입니다. 이를 통해 데이터의 안정성, 가용성 및 분산 처리를 향상시킬 수 있습니다. Replication은 주로 백업, 분산 데이터 공유, 부하 분산 및 재해 복구 목적으로 사용됩니다. 주 서버(master)에서 복제 서버(slave)로 데이터를 전송함으로써, 여러 복제본을 유지할 수 있으며, 이는 읽기 쿼리의 부하를 분산시키고, 데이터의 지리적 근접성을 개선하여 응답 시간을 단축시킵니다.
Replication은 주로 동기식과 비동기식 유형으로 나누어집니다. 동기식 복제에서는 데이터의 변경이 모든 서버에 거의 동시에 적용되어야 트랜잭션이 완료되며, 이는 데이터 일관성을 보장하지만 성능에 영향을 줄 수 있습니다. 반면, 비동기식 복제에서는 변경 사항이 주 서버에 적용된 후 비동기적으로 복제 서버에 전송되므로 성능이 더 우수하지만, 주 서버와 복제 서버 간의 데이터 일관성이 지연될 수 있습니다.
데이터베이스 Replication은 고가용성, 데이터 보호, 성능 최적화를 위한 중요한 전략이며, 특히 대규모 분산 시스템이나 읽기 요청이 많은 시스템에서 유용합니다."
꼬리 질문 > 데이터베이스 복제(Replication)를 설정할 때 동기식과 비동기식 복제 사이에서 어떤 기준으로 선택해야 하나요, 그리고 각각의 방식이 특정 애플리케이션 유형에 더 적합한 이유는 무엇인가요?
"데이터베이스 복제 방식을 선택할 때는 애플리케이션의 데이터 일관성 요구 사항, 가용성, 성능 목표를 고려해야 합니다. 동기식 복제는 데이터 일관성을 매우 중시하는 애플리케이션에 적합합니다. 예를 들어, 금융 서비스나 중요한 거래 시스템에서는 데이터 손실이나 불일치가 치명적일 수 있으므로, 동기식 복제가 선호됩니다. 하지만 이 방식은 네트워크 지연에 민감하고 성능에 영향을 줄 수 있습니다.
반면, 비동기식 복제는 성능과 시스템 가용성을 최우선으로 하는 환경에 더 적합합니다. 예를 들어, 대규모 소셜 미디어 플랫폼이나 콘텐츠 배포 네트워크(CDN)에서는 빠른 응답 시간과 높은 시스템 가용성이 요구됩니다. 비동기식 복제는 주 서버에 부담을 주지 않으면서 데이터를 복제 서버에 전송할 수 있어, 이러한 유형의 시스템에서 선호됩니다. 그러나 데이터 일관성이 지연될 수 있는 단점이 있으므로, 애플리케이션의 특성과 요구 사항을 면밀히 검토한 후 결정해야 합니다."
'면접 (Java) > 준비' 카테고리의 다른 글
[면접] 프로젝트 면접 (9~12) (0) | 2024.03.27 |
---|---|
[면접] 기초 면접 (13~18) (0) | 2024.03.27 |
[면접] 기초 면접 (7~12) (0) | 2024.03.26 |
[면접] 프로젝트 면접 (1~4) (0) | 2024.03.25 |
[면접] 기초 면접 (1~6) (0) | 2024.03.25 |