Spring 기술면접 예상질문 미리보기 <5>

NoSQL과 RDBMS의 차이,  Spring bean container 생성부터 종료 과정에 관련 질문들. 뭐라고 답해야 할까?
Jul 17, 2024
Spring 기술면접 예상질문 미리보기 <5>
 

Q (1). NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.

핵심 키워드 : 비정형 데이터, 읽기 쓰기, 성능 비교, 유연성과 안정성

수강생 답변

NoSQL은 비 관계형 데이터베이스 유형으로, 클라우드 환경에 맞는 저장 기술로 정형화된 데이터뿐만 아니라 비정형화된 데이터를 다룰 수 있습니다. RDBMS는 관계형 데이터베이스 유형으로 클라이언트/서버 환경에 맞는 저장 기술로 데이터 간의 상관관계에서 개체 간의 관계를 테이블 형태로 데이터를 다룹니다.
NoSQL이 RDBMS에 비해 저렴한 비용으로, 분산처리와 병렬처리가 가능해 빅데이터 처리를 빠르게 할 수 있습니다. NoSQL은 읽기 작업보다 쓰기 작업이 더 빠르며, 일반적으로 RDBMS에 비해 쓰기와 읽기 성능 둘 다 빠릅니다.
NoSQL은 가변적인 구조로 데이터를 저장할 수 있어, 데이터 모델의 유연한 변화가 가능하지만 데이터 일관성을 보장할 수 없습니다. 반면, RDBMS는 데이터를 정해진 구조로 저장해 데이터 일관성을 보장할 수 있습니다.
NoSQL은 고정되지 않은 테이블 스키마를 가지고 있어, 하나의 칼럼이 각기 다른 이름과 데이터 타입을 가질 수 있지만 데이터 무결성을 보장할 수 없습니다. RDBMS는 명확한 테이블 스키마를 정의하고 있어 데이터 무결성을 보장합니다.
 

멘토님 피드백

NoSQL과 RDBMS에 대한 정의와 비교 설명을 아주 잘한 답변입니다.
 

😄 좋은 부분

1) NoSQL과 RDBMS의 정의를 설명한 부분
  • "NoSQL은 비 관계형 데이터베이스 유형으로 클라우드 환경에 맞는 저장 기술로 정형화된 데이터뿐만 아니라 비정형화된 데이터를 다룰 수 있습니다.” (NoSQL 정의)
  • "RDBMS는 관계형 데이터베이스 유형으로 클라이언트/서버 환경에 맞는 저장 기술로 데이터 간의 상관관계에서 개체 간의 관계를 테이블 형태로 데이터를 다룹니다.” (RDBMS 정의)
 
2) NoSQL과 RDBMS를 비교 설명을 한 부분
  • 성능
    • NoSQL: 저렴한 비용, 분산처리, 병렬처리, 빅데이터 처리 빠름, 쓰기 작업 빠름
    • RDBMS: 상대적으로 느림
  • 데이터 구조와 일관성
    • NoSQL: 가변적 구조, 유연한 변화, 일관성 보장 어려움
    • RDBMS: 정해진 구조, 데이터 일관성 보장
  • 스키마와 무결성
    • NoSQL: 고정되지 않은 테이블 스키마, 유연한 칼럼 구조, 무결성 보장 어려움
    • RDBMS: 명확한 테이블 스키마, 데이터 무결성 보장
 
 

Q (2). AOP, Interceptor, Filter 의 차이점, Request가 들어올때 거치는 순서, 각 역할들의 장점을 설명해주실 수 있을까요?

핵심 키워드 : 서블릿, 프록시, filter chain, 관점 지향, 컨트롤러

수강생 답변

공통 기능을 핵심 기능에서 분리하여 중복 코드를 줄이고, 유지 보수를 쉽게 하려면 다음 3가지의 방법이 있습니다. Filter(필터)는 핸들러 동작의 전후 과정에 부가 로직 처리를 하며, 웹 컨테이너에서 관리합니다.
Interceptor(인터셉터)는 이하 비슷하며, 스프링 컨테이너에서 관리합니다. AOP(관점 지향 프로그래밍)는 메서드 동작의 전후 과정에 부가 로직 처리를 합니다. Interceptor와 Filter는 Servlet 단위에서 실행되는 반면, AOP는 메소드 앞에 Proxy 패턴의 형태로 실행됩니다. 실행 순서를 보면 Filter가 가장 밖에 있고 Interceptor, AOP 순서이며 요청이 들어오면 Filter -> Interceptor -> AOP -> Interceptor -> Filter 순으로 거치게 됩니다.
Filter는 스프링이 아닌 자바 서블릿에서 제공하는 기능으로, 주로 XSS 방어, 인코딩 변환 처리, 요청에 대한 인증, 권한 체크 등을 하는 데 쓰입니다. 들어온 요청이 DispatcherServlet에 전달되기 전, 헤더를 검사해 인증 토큰이 있는지 없는지, 올바른지 올바르지 않은지 등을 검사할 수 있습니다.
Interceptor는 서버에 들어온 Request 객체를 컨트롤러의 핸들러로 도달하기 전에 낚아채서 부가적인 기능이 실행되게끔 만들어줍니다. 스프링의 기술이며 Controller 동작 전후로 동작합니다. Filter와의 차이점은 Interceptor가 스프링의 기술이기 때문에 스프링에서 관리하는 빈들을 사용할 수 있다는 것입니다. 인터셉터는 여러 개를 사용할 수 있으며 로그인 체크, 권한 체크, 프로그램 실행 시간 작업, 로그 확인 등의 업무에서 사용 가능합니다.
AOP는 OOP를 보완하기 위해 나온 개념으로 관점 지향 프로그래밍이라 불립니다. 객체 지향 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면에서 바라보고 처리합니다. 주로 로깅, 트랜잭션, 에러 처리에 사용되며, Filter와 Interceptor와 다르게 비즈니스 로직을 처리할 때 사용됩니다. 메소드 전후로 자유롭게 설정할 수 있습니다.
Interceptor, Filter는 주소로 대상을 구분해서 걸러내야 하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있습니다.
 

멘토님 피드백

3가지 방식에 대해서 적절하게 잘 설명하고 있습니다. 하지만 AOP가 메서드 전후에서만 사용되는 아니라, 포인트컷 설정에 따라 달라질 수 있기 때문에 이 부분은 조금 더 정확한 표현을 수정하는 것이 올바를 것 같습니다.
 

🤔 아쉬운 부분

1) AOP 적용 범위 추가
  • "AOP는 메서드 전후뿐만 아니라, 메서드 실행 중 여러 지점에서 적용될 수 있습니다."
  • "포인트컷(Pointcut)이라는 개념을 사용하여 어떤 메서드나 클래스에 어드바이스(Advice)를 적용할지 정의합니다."
  • "또한 메서드 실행 전(Before), 후(After), 전후(Around), 예외 발생 시(AfterThrowing) 등 다양한 시점에 로직을 삽입할 수 있습니다."
 
 

Q (3). Spring bean container 생성부터 스프링 종료까지의 사이클에 대해 알려주실 수 있을까요? @PostConstruct, @PreDestroy 어노테이션의 역할도 함께 알려주시면 좋습니다.

핵심 키워드 : 생명 주기, 의존성 주입, 초기화, 메모리

수강생 답변

Spring bean container는 Spring Framework에서 빈(Bean) 객체의 생명주기를 관리하는 컨테이너입니다. Spring은 빈을 생성, 초기화, 사용, 소멸하는 데 필요한 모든 생명주기 관리를 제공합니다. 이 과정은 다음과 같이 진행됩니다. 먼저 Spring 컨테이너가 Bean 객체를 생성합니다. 그다음, Bean 객체의 의존성을 주입하여 Bean이 애플리케이션에서 필요한 다른 Bean과 협력할 수 있게 합니다. 의존성 주입이 완료되면 Bean 초기화 단계로 넘어갑니다. 이 단계에서는 Bean의 설정과 초기화 작업을 수행하며, 여기서 @PostConstruct 어노테이션이 사용됩니다 @PostConstruct 어노테이션은 의존성 주입이 이루어진 후 초기화를 수행하는 메서드를 지정하는 데 사용됩니다. 이를 통해 Bean이 초기화되고 준비 상태로 전환됩니다. 초기화가 완료되면 애플리케이션에서 Bean을 사용할 수 있게 됩니다. Bean 객체가 더 이상 필요하지 않거나 컨테이너가 종료될 때는 Bean을 소멸시킵니다.
이때 @PreDestroy 어노테이션을 사용하여 Bean의 정리 및 해제 작업을 수행할 수 있습니다. 마지막으로, 애플리케이션이 종료될 때 Spring 컨테이너도 함께 종료됩니다. 이 과정에서 컨테이너는 관리하던 모든 Bean을 소멸시키고 자원을 정리합니다. 이렇게 Spring bean container는 Bean의 전체 생명주기를 관리하며, 개발자가 비즈니스 로직에 집중할 수 있도록 도와줍니다.
 

멘토님 피드백

라이프 사이클에 대한 설명은 잘 되어 있습니다. 하지만 빈 초기화 과정과 생성자 함수 호출 부분의 차이점이 명확하지 않습니다. 초기화 과정에서 어떤 작업을 하는 것이 좋은지, 그리고 생성자 함수 호출 부분에서는 어떤 작업을 하는 것이 적절한지에 대한 설명이 부족합니다. 이 부분들을 추가로 공부하고 설명한다면 더 완벽한 답변이 될 것 같습니다.

🤔 아쉬운 부분

1) 빈 초기화 과정과 생성자 함수 호출 부분의 차이점 추가
빈 초기화 과정과 생성자 함수 호출 부분의 차이: 생성자 함수는 객체가 생성될 때 가장 먼저 호출되며, 객체의 기본 상태를 설정합니다. 반면 빈 초기화 과정은 모든 의존성 주입이 완료된 후에 실행됩니다. 초기화 과정에서는 @PostConstruct 어노테이션이 붙은 메서드가 호출되어 추가적인 설정 작업을 수행합니다.
2) 초기화 과정에서 수행해야 할 작업 추가
  • 외부 리소스와의 연결 (예: 데이터베이스 연결)
  • 복잡한 데이터 구조 초기화
  • 캐시 준비
  • 설정 파일 로딩
  • 다른 서비스나 시스템과의 통신 설정
  • 빈의 유효성 검사
  • 특정 비즈니스 로직 실행
 
3) 생성자 함수 호출부에서 수행하면 좋은 작업 추가
  • 필수적인 의존성 주입
  • 기본적인 속성 초기화
  • 불변 객체 생성
  • 간단한 유효성 검사
  • 로깅 설정
 
 

Q (4). RDBMS의 정규화에 대해 설명해주세요.

핵심 키워드 : 연관 관계, 정규형, 중복 제거

수강생 답변

RDBMS에서 정규화(Normalization)는 데이터베이스 설계의 과정 중 하나로, 데이터의 중복성을 최소화하고 데이터 일관성과 무결성을 유지하기 위해 테이블을 구조화하는 프로세스입니다. 정규화는 관계형 데이터베이스의 성능, 유지보수 및 확장 가능성을 향상시키는 데 도움이 됩니다. 주요 정규화 단계에는 다음과 같은 것들이 있습니다.
제1 정규형(1NF)은 각 열(Column)은 원자적인 값만 가지며, 테이블에 중복된 데이터가 없어야 합니다. 각 행(Row)은 고유한 식별자(Primary Key)를 가져야 합니다. 제2 정규형(2NF)은 모든 비주요 속성들이 기본키에 완전히 종속되어야 합니다. 즉, 비주요 속성들은 기본키 전체에 의존해야 하며 부분적으로 의존해서는 안 됩니다.
예를 들어, "학생" 테이블에서 "학번: 12345"라는 기본키 값을 가진 행을 선택한다면 그 행에 있는 이름과 나이 값은 오직 해당하는 학번인 12345와 관련된 정보입니다. 따라서 이름과 나이는 부분적으로 의존하지 않고 전체적으로 기본키(학번)에 의존해야 하며, 다른 어떤 값도 필요하지 않습니다.
제3 정규형(3NF)은 비주요 속성들 간의 이행적 종속 관계를 제거해야 합니다. 즉, 한 속성의 값을 알면 다른 비주요 속성들의 값을 추론할 수 없어야 합니다. 예를 들어, "학생" 테이블에 학번, 이름, 주소라는 비주요 속성들이 있다고 가정해봅시다. 여기서 학번에 따라 이름을 알 수 있고, 이름에 따라 주소를 알 수 있다면 이는 이행적 종속 관계입니다. 따라서 "학생" 테이블을 분리하여 기본 테이블인 "학생 정보" 테이블과 "주소" 테이블로 나눌 수 있습니다. 그리고 두 테이블 간의 관계(Relationship)을 설정합니다. 여기서 기본 테이블인 "학생 정보" 테이블은 학번과 이름 정보만을 가지며, "주소" 테이블은 학번과 해당하는 주소 정보를 가집니다.
추가적으로 보다 높은 정규형인 BCNF (Boyce-Codd Normal Form), 4NF (Fourth Normal Form), 5NF (Fifth Normal Form) 등도 있습니다. 이러한 단계를 거치면서 데이터베이스 설계자는 중복된 정보와 이상 현상(anomaly)을 최소화하고 데이터 일관성과 효율성을 개선할 수 있습니다.
BCNF (Boyce-Codd Normal Form)는 제3 정규형을 만족하면서 모든 결정자(candidate key)가 함수적 종속성을 가지지 않도록 하는 것을 목표로 합니다. 함수적 종속성이란 한 속성의 값이 다른 속성의 값을 결정하는 관계를 의미합니다. BCNF에 따라 테이블을 분해하여 함수적 종속성을 제거하고, 필요한 경우 관계(Relationship)를 설정하여 연결할 수 있습니다.
4NF (Fourth Normal Form)은 4NF는 BCNF를 만족하면서 다치 종속(Multivalued Dependency) 현상을 제거하는 것을 목표로 합니다. 다치 종속은 한 테이블에서 A->B, A->C와 같은 함수적 종속성과 함께 B->C와 같은 다른 함수적 종속성이 존재하는 상황입니다. 4NF에 따라 테이블을 분해하여 다치 종속 현상을 해소하고, 필요한 경우 관계(Relationship)를 설정하여 연결할 수 있습니다.
5NF (Fifth Normal Form), 또는 PJ/NF (Project-Join Normal Form)은 5NF는 다치 종속과 조인(JOIN) 연산에 대한 중복 현상(Dependency Preservation Anomaly)을 해결하기 위해 사용됩니다. 다치 종속과 조인 연산으로 인해 발생하는 중복된 정보를 최소화하고 데이터 일관성 및 성능 개선에 초점을 맞춥니다. 5NF에 따라 테이블 구조를 조정하여 중복된 정보와 조인 연산에 의한 문제점들을 해결할 수 있습니다.
 

멘토님 피드백

정규화에 대한 정의와 과정을 잘 설명하고 있고 예시와 심화 과정 부분까지 잘 설명하고 있는 좋은 답변입니다.
 

😄 좋은 부분

1) 정규화에 대한 정의
  • "RDBMS에서 정규화(Normalization)는 데이터베이스 설계의 과정 중 하나로, 데이터의 중복성을 최소화하고 데이터 일관성과 무결성을 유지하기 위해 테이블을 구조화하는 프로세스입니다."
 
2) 정규화 과정 설명
  • 제1 정규형(1NF), 제2 정규형(2NF), 제3 정규형(3NF)에 대한 설명 부분
 
3) 예시 제공
  • 각 정규형에 대한 구체적인 예시를 들어 설명한 부분
 
4) 심화 과정 설명
  • BCNF, 4NF, 5NF 등 더 높은 단계의 정규형에 대한 추가 설명 부분
 
 
 
 
스프링 (Spring) 기술 면접 질문, 도움이 되셨나요? 기술면접 대비는 현직 개발자의 시선에서 어떤 답변이 좋을 지를 파악할 수 있어서 취업 리부트 코스 수강생들의 만족도가 가장 높은 세션 중 하나 인데요. 앞으로도 React, Spring의 기술면접 Q&A를 꾸준히 발행할 예정이니, 관심이 있다면 항해99 블로그를 구독해주세요.
 
 

🚢 개발자 취업 준비 어떻게 시작해야 할지 모르겠나요? 취업으로 향하는 거친 항해에서 든든한 메이트가 되어 드리겠습니다.

취업 실패 시 교육비 0원. 반드시 취업까지 책임질 수 있다는 항해의 자신감입니다.
높은 수준의 개인 프로젝트 경험이 없는 개발 유관 전공자, 전반적인 학습이 부족한 부트캠프 수료생이라면 개발자 취업 리부트 코스에 합류하세요. 자료구조 공부, 프로젝트, 코테준비, 이력서와 면접 대비까지 취업 리부트 코스에서 한 번에 할 수 있습니다. 갈수록 높아지는 개발자 취업의 벽, 개발자 취업 리부트 코스로 11주 만에 취업의 문을 열어 보세요
 
 
 
CREDIT
글 | 송민영 팀스파르타 에디터
Share article
Subscribe to our newsletter

IT 커리어 성장 코스, 항해