본문 바로가기
스터디일지

CS 면접 질문 대비 11번 ~ 20번

by 똥쟁이핑크 2023. 10. 24.
  1. DI와 IoC에 대해 아는 만큼 설명해주실 수 있을까요?
    - 나의 답변 :
    DI는 의존 관계 주입 기능인데 객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입시켜주는 방식이다. 이렇게 되면 모듈간의 결합도가 낮아지고 유연성이 높아진다.
    Ioc는 제어의 역전이라는 의미인데 @Autowired라는 어노테이션을 써서 해당 객체를 주입받게 한다. 더 자세히 설명하자면 스프링 컨테이너에서 직접 객체를 생성해서 해당 객체에 주입시켜 주는 이 형태가 제어의 역전이 되는 것이다.이렇게 되면 객체간의 결합도를 줄이고 유연한 코드를 작성할 수 있게 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있게 한다.

    참고한 사이트 : https://velog.io/@gillog/Spring-DIDependency-Injection,

    - 모범 답안 : 
    ### DI (의존성 주입) - 객체지향 프로그래밍에서 의존성 주입은 특정한 클래스가 다른 클래스의 의존성을 외부에서 주입받는 기법을 말한다.
    - DI를 사용하면 클래스 내부에서 새로운 객체를 직접 생성하는 대신 외부에서 필요한 객체를 받아와서 사용한다.
    - 이를 통해 모듈 간의 결합도를 낮추고, 코드의 재사용성과 테스트 용이성을 향상시킬 수 있다.
    **즉 의존성 주입 ( DI )는 객체의 특정 기능이나 서비스를 외부에서 받아와서 사용하는 방식이다.

    ** ### IoC (제어의 역전) - IoC는 프로그램의 제어 흐름 구조가 전통적인 순차적 제어 흐름에서 벗어나 독립적인 모듈들이 중앙된 제어 코드 대신 사용자의 코드를 제어하게 되는 디자인 패턴을 의미한다.
    - 쉽게 말하면, 프로그램의 흐름을 직접 제어하는 것이 아닌, 프레임워크나 라이브러리 등 외부 요소에게 제어를 위임하는 것이다.
    - DI는 IoC의 한 형태로 볼 수 있습니다. IoC의 핵심 목적은 모듈 간의 결합도를 낮추는 것이며, DI는 그 방법 중 하나이다.

    #### 전통적인 제어흐름이란?
    프로그램 내에서 객체나 컴포넌트를 직접 생성하고 그 흐름을 개발자가 직접 제어한다.
    객체의 생성, 생명주기, 의존성 모든 것을 개발자가 코드로 직접 관리하는 것이 전통적인 제어 흐름의 특징이다.

    #### 모듈간의 결합도를 낮추는 이유
    1. 유지보수성 향상결합도가 낮은 모듈은 다른 모듈의 변경에 덜 민감하므로 하나의 모듈을 수정할 때 다른 모듈에 영향을 주는 확률이 줄어든다. 이는 유지보수 과정을 간소화하고 비용을 절감하는 데 도움이 된다.
    2. 재사용성 향상결합도가 낮은 모듈은 다른 환경이나 다른 프로젝트에서도 쉽게 재사용될 수 있다. 이는 개발 비용과 시간을 절약하는 데 도움이 된다.
    3. 테스트 용이성각 모듈이 독립적으로 동작하면 해당 모듈만을 대상으로 테스트를 진행할 수 있다. 이렇게 되면 단위 테스트가 더 간편하고 효율적으로 진행된다.
    4. 유연성결합도가 낮으면 기능의 변경이나 추가가 필요할 때 해당 모듈만 수정하거나 새로운 모듈을 추가하기 쉽다. 이는 시스템의 확장성과 유연성을 향상시킨다.
    5. 이해하기 쉬움각 모듈이 독립적으로 동작하고, 모듈 간의 의존성이 줄어들면 시스템 전체를 이해하기가 더 쉽다.
    6. 오류의 파급 효과 감소한 모듈에서 발생하는 오류가 다른 모듈로 쉽게 전파되지 않게 된다.이는 시스템의 안정성을 향상시키는 데 도움이 된다.

    **즉 DI는 객체의 의존성을 외부에서 주입받는 기법이며, Io*는 프로그램의 제어를 외부 요소에게 위임하여 코드의 결합도를 낮추는 디자인 패턴이다.**

  2. MVC 모델이란 무엇인지 설명해주실 수 있을까요?
    - 나의 답안 : 
    MVC 패턴은 디자인 패턴 중 하나이며 각각 Model, View, Controller 를 말하고 프로젝트를 구성할 때 해당하는 구성요소를 3가지의 역할로 구분한 패턴이다. Controller는 Model을 통해서 데이터를 가져오고 가져온 데이터를 View를 통해서 사용자한테 보여지게 된다. 
    이 패턴을 사용하면 비즈니스 로직과 UI 로직을 분리하게 되어 유지보수를 독립적으로 수행이 가능하게 되고 중복코드를 줄일 수 있다. 또한, Model과 View가 다른 컴포넌트에 종속되지 않아서 프로젝트의 확장성, 유연성에 유리하다.

    참고한 사이트 : https://cocoon1787.tistory.com/733,

    - 모범 답안 : 
    MVC 모델은 소프트웨어 디자인 패턴으로, 소프트웨어 애플리케이션을 구성하는 세 가지 핵심 요소로 구성됩니다:
    1. **Model (모델):** 데이터와 비즈니스 로직을 관리합니다.
    2. **View (뷰):** 사용자에게 정보를 표시하고, 모델의 데이터를 시각적으로 나타냅니다.
    3. **Controller (컨트롤러):** 사용자 입력을 처리하고 모델과 뷰 사이의 상호 작용을 관리합니다.

    MVC 모델은 다음과 같은 이점을 제공합니다:
    - 느슨한 결합: 각 구성 요소가 서로 독립적으로 개발되므로 변경과 유지보수가 용이합니다.
    - 재사용성: 모델과 뷰는 다른 부분에서 재사용 가능하며, 컨트롤러도 다른 뷰와 모델과 조합하여 재사용할 수 있습니다.
    - 테스트 용이성: 각 컴포넌트를 독립적으로 테스트하기 쉽습니다.MVC 패턴은 복잡한 소프트웨어 애플리케이션을 구성하고 유지보수하는 데 도움이 되며, 모델, 뷰, 및 컨트롤러의 역할과 책임을 분명히 합니다.

  3. Annotation이란 무엇이고 구체적으로 어떤 것이 있는지 예시를 들어 설명해주실 수 있을까요?
    - 나의 답안 : 
    Annotation은 주석이라는 사전적의미를 가지고 있고 특별한 의미나 기능을 수행하도록 만들어 준다. 
    Annotation의 용도는 문법 에러를 체크하도록 컴파일러에게 정보를 제공하거나 빌드시 코드를 자동으로 생성할 수 있도록 정보를 제공한다. 
    기본적으로 자바에서 제공되는 Annotation은  @Override 가 있는데 오버라이딩을 올바르게 했는지 컴파일러가 체크 할 수 있다.

    참고한 사이트 : https://velog.io/@jkijki12/annotation,https://honeyinfo7.tistory.com/56

    - 모범 답안 : 
    Annotation은 클래스, 메서드, 파라미터, 필드 등등에 특별한 표식을 남기기 위해 사용하는 것으로 그 자체로는 특별한 기능은 없습니다.
    하지만 Reflection을 이용하면 특정 Annotation이 남겨진 클래스, 메서드, 파라미터, 필드 등등에 값을 주입한다던지 기록을 남긴다던지 등등의 업무를 수행할 수 있습니다.
    구체적인 예시를 들어보자면, @Autowired라는 어노테이션이 존재하는데 해당 어노테이션이 필드에 붙는다면,Bean Container가 해당 필드의 타입에 부합하는 Bean을 찾아서 주입해줍니다.
    뿐만 아니라 @Component라는 어노테이션도 존재하는데 해당 어노테이션이 붙은 클래스들은역시나 Bean Container 안에 담기게 됩니다.
    이처럼 Annotation으로 표식을 남길 수 있고특수한 프로세서에 의해 특정 업무를 처리할 수 있습니다.


  4. Spring Security의 구조와 JWT 발급 과정에 대해 설명해주실 수 있을까요?
    - 나의 답변 : 
    Spring Security 는 Spring 기반 웹 애플리케이션의 보안을 담당하는 프레임 워크이고 JWT는 Json 형태로 표현된 정보를 전달하는 하나의 web token이다 
    Security는 인증(Authentication)과 인가(Authorization)가 Dispatcher Servlet으로 가기 전에 Filter에서 처리 된다. 그래서 처리가 되고 나면 Controller로 넘어가게 된다. 넘어가는 과정에서 인증이 되면 JWT를 생성해 주는데 생성이 되는 순간 인가가 된거다.
    JWT는 HS256 알고리즘을 사용해서 만들어지는데 Header에는 토큰의 타입과 해싱 알고리즘 정보가 담기고 Payload 에는 정보가 담긴다. 마지막으로 Signature에는 토큰의 정보를 신뢰할 수 있는지 판단하는 시크릿 키가 담기게 된다.

    참고한 사이트 : https://thalals.tistory.com/436,

    - 모범 답안 : 
    **Spring Security의 구조:**
    Spring Security는 다양한 보안 레이어 및 컴포넌트로 구성됩니다. 가장 일반적인 구조는 다음과 같습니다:

    1. **Authentication Manager (인증 관리자):**
    - 사용자의 인증을 처리하고 사용자의 신원을 확인하는 역할을 합니다. - 여러 인증 프로바이더 (예: In-Memory, JDBC, LDAP, OAuth)를 지원하며, 커스텀 인증 로직을 구현할 수 있습니다.

    2. **Security Filter Chain (보안 필터 체인):**
    - 다양한 보안 필터가 연결된 필터 체인으로, 요청을 처리하고 응답을 생성하기 전에 다양한 보안 검사를 수행합니다.
    - 예를 들어, 인증, 권한 부여, CSRF(Cross-Site Request Forgery) 방지 등을 처리합니다.

    3. **UserDetailsService (사용자 정보 제공자):**
    - 사용자의 신원을 확인하기 위해 사용자 정보를 제공하는 인터페이스입니다.
    - 주로 데이터베이스나 사용자 저장소로부터 사용자 정보를 검색하고, 인증 매니저가 사용자를 확인하는 데 사용합니다.

    **JWT 발급 과정:**
    JWT는 인증된 사용자에게 토큰을 발급하고 이를 사용하여 사용자의 신원을 확인하는 프로세스에 사용됩니다.
    다음은 JWT 발급 과정입니다:
    1. **사용자 로그인:**
    사용자가 자격 증명(아이디 및 비밀번호)을 제출하여 로그인을 시도합니다.

    2. **Authentication:**
    Spring Security는 사용자를 인증하고 사용자의 신원을 확인합니다. 이를 위해 UserDetailsService가 사용자 정보를 검색하고, PasswordEncoder를 사용하여 비밀번호 일치 여부를 확인합니다.

    3. **JWT 생성:** 사용자가 성공적으로 인증되면 서버는 JWT를 생성합니다. JWT에는 사용자 정보 및 권한이 포함됩니다.

    4. **JWT 서명:**
    서버는 생성된 JWT를 서명하여 데이터의 무결성을 보장합니다. 서명 키를 사용하여 JWT를 서명하고 클라이언트에게 반환합니다.

    5. **클라이언트 응답:**
    서버가 JWT를 생성 및 서명한 후, 클라이언트에게 JWT를 반환합니다. 일반적으로 이 JWT는 HTTP 헤더에 포함되거나, 응답 본문에 담겨서 클라이언트에게 전달됩니다.

    6. **클라이언트 요청:**
    사용자가 보호된 엔드포인트에 요청을 보낼 때, JWT는 요청의 Authorization 헤더나 쿼리 매개변수 등을 통해 서버로 전송됩니다.

    7. **JWT 유효성 검사:**
    서버는 클라이언트로부터 수신한 JWT의 유효성을 확인합니다. 이 과정에는 JWT의 서명을 검증하고 만료 시간 및 기타 클레임 정보를 확인하는 작업이 포함됩니다.

    8. **인가:**
    JWT가 유효하면 요청된 리소스에 대한 액세스를 허용하거나 거부합니다. 클라이언트는 JWT에 포함된 권한에 따라 요청된 작업을 수행할 수 있습니다.이러한 과정을 통해 JWT를 사용하여 Spring Security에서 사용자 인증 및 권한 부여를 구현할 수 있으며, 보안 및 인증을 효과적으로 관리할 수 있습니다.

  5. N+1 문제의 발생 이유와 해결 방법에 대해 설명해주실 수 있을까요? 해결 방법은 3가지 이상 말씀해주시면 좋습니다.
    - 나의 답변 : 
    N+1은 1번의 쿼리를 날릴때 의도하지 않게 N번의 쿼리가 추가적으로 실행 되는 것을 말하며 1 : N 혹은 N : 1의 관계를 가진 엔티티를 조회할 때 발생한다.
    엔티티를 조회할 때 JPA fetch가 EAGER로 데이터를 조회하는 경우 / 아니면 LAZY로 데이터를 가져온 이후에 연관관계인 하위 엔티티를 다시 조회하는 경우에 발생한다.
    Repository에서 find를 할 때 첫번 째 쿼리에서 하위 엔티티까지 한번에 가져오지 않고 하위 엔티티를 사용할 때 추가로 조회하기 때문에 발생한다.

    해결 방법
    1) Fetch join  - 미리 두 테이블을 join 시켜서 한번에 모든 데이터를 가져오게 하는 방법이다. join 시에는 inner join으로가져온다.
    단점은 1 : N 관계가 2개 이상인 경우에는 사용하지 못하고 패치 조인 대상에게 별칭을 부여 할 수 없다.또한 쿼리 한번에 모든 데이터를 가져오기 때문에 JPA 가 제공하는 Paging API 사용이 불가능하다.

    2) Entity Graph - 조회할 연관 엔티티명을 적어서 JPQL을 사용해 쿼리문을 작성해서 사용한다.Join을 하는데 Outer Join 으로 가져온다.

    3) FetchMode.SUBSELECT - 두번의 쿼리를 날려서 N + 1문제를 해결 할 수 있다.

    참고한 사이트 : https://dev-coco.tistory.com/165,

    - 모범 답안 :
    N+1 문제는 주로 데이터베이스에서 데이터를 가져올 때 발생하는 성능 문제입니다. 이 문제는 다음과 같이 발생합니다:
    1. **1번 쿼리 (N개 아이템을 가져옴)**:
    예를 들어, 여러 사용자의 정보를 가져올 때, 첫 번째 쿼리로 사용자 목록을 가져옵니다. 이때, N은 사용자의 수를 나타냅니다.

    2. **N번 쿼리 (개별 사용자 정보를 가져옴)**:
    그 다음, 각 사용자에 대한 추가 정보(예: 프로필 사진, 주소)를 얻기 위해 각 사용자에 대해 별도의 쿼리를 실행합니다.
    이것이 N+1에서 N+1 문제로 이름붙은 이유입니다.
    예를 들어, 10명의 사용자를 가져온다고 가정하면,
    1번 쿼리로 10명의 사용자 목록을 가져오고, 그 다음 10번의 추가 쿼리를 실행하여 각 사용자의 개별 정보를 가져온다는 것입니다.

    **해결 방법:**
    1. **Eager Loading**:
    모든 정보를 한 번에 가져오는 방법으로, 1번 쿼리에서 모든 데이터를 가져올 수 있습니다. 그러나 모든 정보가 필요하지 않을 때는 낭비가 될 수 있습니다.

    2. **Fetch Join**:
    데이터베이스 쿼리에 JOIN FETCH를 사용하여 추가 정보를 한 번에 가져올 수 있습니다. 이 방법은 Eager Loading과 유사하지만 정확하게 필요한 정보만 가져올 수 있습니다.

    3. **Batch Fetching**:
    여러 쿼리를 일괄로 실행하여 추가 정보를 가져옵니다. 이는 일부 ORM 라이브러리에서 지원됩니다.

    4. **DTO 사용**:
    필요한 정보만 선택적으로 가져오는 방식으로, N+1 문제를 피하면서 필요한 정보만 가져올 수 있습니다.

    간단하게 말하면, N+1 문제는 데이터를 효율적으로 가져오기 위한 방법을 고민하는 것이며, 이러한 방법 중 하나를 선택하여 성능을 최적화할 수 있습니다.

  6. 즉시로딩과 지연로딩은 각각 언제 사용하면 좋은지 설명해주실 수 있을까요?
    - 나의 답변 : 
    즉시 로딩 :  엔티티를 조회할 때 연관된 엔티티로 함께 조회하려고 할 때 사용한다. / 데이터가 많아지면 Join 때문에 성능에 부담이 생기기 때문에 즉시로딩 보다는 지연로딩을 사용하는 것이 나중에 더 좋다.

    지연 로딩 : 연관된 엔티티를 실제로 사용할 때 사용한다.

    참고한 사이트 : https://dodeon.gitbook.io/study/kimyounghan-orm-jpa/08-proxy/02-eager-and-lazy,

    - 모범 답안 :
    즉시로딩(Eager Loading)과 지연로딩(Lazy Loading)은 ORM(Object-Relational Mapping)을 사용하는 애플리케이션에서 데이터를 가져오는 방식을 나타냅니다.
    어떤 방식을 선택해야 하는지는 상황에 따라 다릅니다.
    아래에서 두 가지 방식의 특징과 언제 어떤 방식을 사용해야 하는지 설명하겠습니다.

    **즉시로딩 (Eager Loading):**-
    **특징**:
    - 관련된 모든 데이터를 한 번에 가져옵니다.
    즉, 연관 엔티티와 그에 속한 데이터를 모두 즉시 로딩합니다. - 데이터를 가져오는 쿼리가 실행될 때 함께 가져와집니다.
    - 주로 **`@ManyToOne`** 또는 **`@OneToOne`** 관계에서 사용됩니다.-

    **사용하는 경우**:
    - 연관 엔티티가 항상 필요하며, 부가적인 쿼리 비용을 감수해야 하는 경우.
    - 데이터의 양이 작고, 성능 영향이 미미한 경우.
    - 데이터베이스의 데이터 무결성 규칙을 지켜야 하는 경우.

    **지연로딩 (Lazy Loading):**-
    **특징**:
    - 연관된 데이터를 실제로 사용할 때까지 가져오지 않습니다.대신, 데이터를 처음에는 가져오지 않고, 필요한 순간에 추가 쿼리로 데이터를 가져옵니다.
    - 필요한 때에만 데이터베이스 쿼리를 실행하기 때문에 초기 데이터베이스 액세스 비용을 절감할 수 있습니다.
    - 주로 **`@OneToMany`** 또는 **`@ManyToMany`** 관계에서 사용됩니다.

    - **사용하는 경우**:
    - 연관된 데이터를 필요한 경우에만 가져오고, 불필요한 데이터베이스 액세스를 피하려는 경우.
    - 대규모 데이터베이스에서 데이터의 양이 크고, 성능에 민감한 경우.
    - 사용자 요청에 따라 데이터를 동적으로 로드해야 하는 경우.

    **어떤 방식을 선택할지 결정하는 요소**:
    - 데이터 양: 데이터가 큰 경우, 즉시로딩은 많은 데이터를 가져와 메모리 부담을 줄 수 있으므로 지연로딩이 유용합니다.
    - 애플리케이션 요구사항: 애플리케이션의 요구사항에 따라 어떤 데이터를 언제 필요로 하는지 고려합니다.
    - 성능: 애플리케이션의 성능 요구 사항에 따라 어떤 방식을 선택할 것인지 결정합니다.
    - 데이터 무결성: 데이터베이스의 데이터 무결성 규칙을 준수해야 하는 경우 즉시로딩을 사용할 수 있습니다.

    일반적으로는 필요한 순간에 데이터를 가져오는 지연로딩을 사용하여 성능을 최적화하며, 필요한 경우에만 데이터를 즉시로딩으로 가져올 수 있도록 설계하는 것이 좋습니다.

  7. Spring bean container 생성부터 스프링 종료까지의 사이클에 대해 알려주실 수 있을까요? @PostConstruct, @PreDestroy 어노테이션의 역할도 함께 알려주시면 좋습니다.
    - 나의 답변 : 
    1) xml파일, Config 클래스, @ 등으로 설정 파일을 읽어 빈 객체 인스턴스화 하기
    2) 빈 프로퍼티에 의존성 주입하고 Aware 관련 인터페이스가 구현되어 있으면 관련 메서드들을 호출한다.
    3) @PostConstruct → InitialzingBean 인터페이스 → init-method 속성 순으로 호출하면서 객체를 생성한다.
    4) 등록된 빈이 컨테이너가 종료될때 소멸 되는데 @PreDestroy → DiposableBean 인터페이스 → destry-method 순으로 호출되어 소멸한다.

    @PostConstruct - 객체가 생성된 후 별도의 초기화 작업을 위해 실행하는 메소드를 선언하고 해당 어노테이션을 설정해 놓은 init 메소드는 WAS가 띄어질 때 실행이 된다.

    @PreDestroy - 스프링 컨테이너에서 빈을 제거하기 전에 해야할 작업이 있다면 해당 메소드위에 선언하는 어노테이션이다. close() 하기 직전에 실행이 된다.


    참고한 사이트 : https://devkingdom.tistory.com/290, https://goddaehee.tistory.com/46

    - 모범 답안 :
    Spring bean container는 Spring Framework에서 빈(Bean) 객체의 생명주기를 관리하는 컨테이너입니다.
    Spring은 빈을 생성, 초기화, 사용, 소멸하는 데 필요한 모든 생명주기 관리를 제공합니다.

    1.Bean 객체 생성: Spring 컨테이너는 Bean 객체를 생성합니다.

    2.의존성 주입: Bean 객체의 의존성을 주입합니다. 이로써 Bean은 애플리케이션에서 필요한 다른 Bean과 협력할 수 있습니다.

    3.Bean 초기화: 이 초기화 단계에서 Bean의 설정과 초기화 작업을 수행합니다. 여기서 @PostConstruct 어노테이션이 사용됩니다. @PostConstruct 어노테이션은 의존성 주입이 이루어진 후 초기화를 수행하는 메서드입니다.
    이를 통해 Bean이 초기화되고 준비 상태로 전환됩니다.

    4.Bean 사용: 애플리케이션은 Bean을 사용할 수 있습니다.

    5.빈 소멸: 빈 객체가 더 이상 필요하지 않을 때 또는 컨테이너가 종료될 때 빈을 소멸시킬 경우 @PreDestroy어노테이션을 이용해 이를 통해 빈의 정리 및 해제 작업을 수행할 수 있습니다.

    6.컨테이너 종료 : 애플리케이션이 종료될 때 Spring 컨테이너도 종료되면서 이 때 컨테이너는 관리하는 모든 빈을 소멸시키고 자원을 정리합니다.


  8. AOP, Interceptor, Filter 의 차이점, Request가 들어올때 거치는 순서, 각 역할들의 장점을 설명해주실 수 있을까요?
    - 나의 답변 : 
    실행 되는 순서는 Filter →Interceptor → AOP → Interceptor → Filter 이다.
    Filter는 일반적으로 web.xml파일에 설정하고 WAS 구동시에 FilterMap이라는 배열에 등록되고 실행 시에 Filter Chain을 구성해서 순차적으로 실행이 된다. Dispatcher Servlet 전 / 후, ServletRequest / Response 객체 변경 및 조작 수행이 가능하다.
    Interceptor는 servlet-context.xml에 설정하고 Dispatcher Servlet 이후에 Controller 호출 전 / 후에 끼어들어 수행이 된다. Spring Context 내부에서 Controller의 요청과 응답에 관여하며 모든 Bean에 접근이 가능하다. Interceptor는 여러개를 사용할 수 있고 로그인 체크, 권한 체크, 프로그램 실행 시간 or 계산 작업 or 로그 확인 등의 업무처리에 사용한다.
    https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIqBbQ%2FbtrBbb51YGw%2FLJCkTdYfASIkjinQL4chiK%2Fimg.png

    AOP 는 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 관점에서 바라보고 처리한다.
    주로 로깅, 트랜잭션, 에러처리 등의 비즈니스단의 메서드에서 조금 더 세밀하게 조정할 때 사용한다.

    클라이언트 요청정보를 제공하는 SevletRequest 객체를 doFilter메소드의 chain.doFilter(request,response)를 기점을 전/ 후 처리를 하고 SevletRequest 인터페이스를 확장 시켜서 HttpServletRequest객체를 생성하고 서블릿의 서비스 메소드(doGet, doPost등)에 인수로 전달한다. 


    참고한 사이트 : https://carnival.tistory.com/77,https://baek-kim-dev.site/61

    - 모범 답안 :
    공통 기능을 핵심 기능에서 분리하여 중복 코드를 줄이고, 유지 보수를 쉽게 하려면 다음 3가지의 방법이 있다.
    **Filter(필터) - 핸들러 동작의 전 후 과정에 부가로직 처리, 웹 컨테이너에서 관리**
    **Interceptor(인터셉터) - 이하 비슷함, 스프링 컨테이너에서 관리**
    **AOP(관점 지향 프로그래밍) - 메서드 동작의 전 후 과정에 부가로직 처리**
    InterCeptor 와 Filter는 Servlet 단위에서 실행되는 반면, AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.
    실행 순서를 보면 Filter가 가장 밖에 있고 Interceptor, AOP 순서이며 요청이 들어오면 **Filter -> Intercepter -> AOP -> Intercepter -> Filter** 순으로 거치게 된다.
    Filter는 스프링이 아닌 자바 서블릿에서 제공하는 기능으로, 주로 XSS방어, 인코딩 변환처리, 요청에 대한 인증, 권한 체크등을 하는데에 쓰인다.
    들어온 요청이 DispatcherServlet에 전달되기 전, 헤더를 검사해 인증 토큰이 있는지 없는지, 올바른지 올바르지 않은지 등을 검사할 수 있다.
    Intercepter은 서버에 들어온 Request 객체를 컨트롤러의 핸들러로 도달하기 전에 낚아채서 부가적인 기능이 실행되게끔 만들어준다. 스프링의 기술이며 Controller 동작 전 후로 동작한다. 

    **Filter와의 차이점
    Intercepter가 스프링의 기술이기 때문에 스프링에서 관리하는 빈들을 사용할 수 있다.
    ** 인터셉터는 여러 개를 사용할 수 있으며 로그인 체크, 권한 체크, 프로그램 실행시간 작업, 로그확인 등의 업무에서 사용가능하다.AOP는 OOP를 보완하기 위해 나온 개념으로 관점 지향 프로그래밍이라 불린다.
    객체 지향 프로그래밍을 했을 때 중복을 줄일수 없는 부분을 줄이기 위해 종단면에서 바라보고 처리한다.
    주로 로깅, 트랜잭션, 에러처리에 사용되며, **Filter와 Intercepter와 다르게 비즈니스 로직을 처리할 때 사용된다.**
     메소드 전 후로 자유롭게 설정할 수 있다.InterCepter, Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.



  9. NoSQL과 RDBMS의 특징과 차이점에 대해서 장, 단점을 들어 설명해주세요.
    - 나의 답변 : 
    RDBMS = R(Relational - 관계) + DBMS(DataBase Management System - 사용자와 데이터베이스 사이에서 사용자의 요구에 다라 정보를 생성해 주고 데이터베이스를 관리해 주는 소프트웨어) = 관계형 데이터베이스라 한다.
    NoSQL = RDB 형태의 데이터베이스가 아닌 다른 형태의 데이터 저장 기술인데 테이블 간 관계를 정의하지 않는다.
    그렇기 때문에 테이블은 그냥 테이블일 뿐이여서 Join이 되지 않는다.
    NoSQL은 RDBMS처럼 스키마에 맞춰 데이터를 관리하지 않고 수평적 확장을 할 수 있다.

    RDBMS의
    장점은 
    1) 정해진 스키마에 따라 데이터를 저장해야 한다 → 명확한 데이터 구조를 보장한다.
    2) 데이터를 중복없이 한번만 저장할 수 있다.

    단점은
    1) 테이블과 테이블이 관계를 맺고 있어서 시스템이 커질 경우 Join문이 많은 복잡한 쿼리가 만들어 질 수 있다.
    2) 성능향상을 위해 서버의 성능을 향상시켜야 하는 Scale-up만 지원한다. → 비용이 많이 늘어난다.
    3) 스키마로 인해서 데이터가 유연하지 않고 스키마가 변경될 경우 번거롭고 어렵다.

    NoSQL의
    장점은
    1) 스키마가 없어서 유연하고 자유로운 데이터 구조를 가질 수 있다. → 언제든지 저장된 데이터를 조정하고 새로운 필드를 추가 할 수 있다.
    2) 데이터 분산이 용이 하며 성능향상을 위해 Scale - up 뿐만이 아니라 Scale-out 또한 가능하다.

    단점은
    1) 데이터 중복이 발생 할 수 있고 중복된 데이터가 변경될 경우는 모든 컬렉션에서 수정을 수행해야한다.
    2) 스키마가 존재하지 않기 때문에 명확한 데이터 구조를 보장하지 않는다. → 데이터 구조 결정이 어려울 수 있다.


    참고한 사이트 : https://khj93.tistory.com/entry/Database-RDBMS%EC%99%80-NOSQL-%EC%B0%A8%EC%9D%B4%EC%A0%90

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


  10. mvc 패턴에 대해서 설명해주세요.
    - 나의 답변 : 
    옛날에는 한 파일에 모든 기능을 넣어서 코드를 짰는데 이렇게 하다 보니 수정을 하기가 어려워 유지보수의 어려움을 겪었다.
    그래서 변경해야 할 코드와 그렇지 않아야 할 코드를 분리했는데 이런 것들을 디자인 패턴이라고 불렀고 MVC는 그런 디자인 패턴 중에 하나다.
    MVC는 Model - View - Controller 의 약자로 코드간의 종속성을 줄이고 구성 요소간의 역할을 명확하게 함으로써 코드 분리가 쉽고 협업을 용이하게 하는 장점을 가지고 있다.
    Model 은 데이터 베이스와 연동하는 역할이고 View와 Controller에 의존하지 않는다.
    View는 사용자에게 보이는 화면을 담당하므로 HTML과 CSS등을 통해서 디자인을 처리하는 영역이다.
    Controller는 MVC의 핵심으로 사용자 요청의 중심에 위치해야 한다. 즉, 사용자가 요청을 하게 되면 제일먼저 Controller 에서 요청을 받아들이게 된다.
    이 패턴의 장점은 유지보수 하기가 좋고 코드 재사용이 증가한다. 또한 단순하고 직관적이며 디자이너와 개발자의 분업이 가능하고 확장하기 용이하다.

    참고한 사이트 : https://binco.tistory.com/entry/Java-MVC%ED%8C%A8%ED%84%B4-%EB%B0%94%EB%A1%9C%EC%95%8C%EA%B8%B0,

    - 모범 답안 : 
    MVC 패턴이란 애플리케이션을 Model, View, Controller 세 가지 역할로 구분하여 개발하는 아키텍처 패턴으로 응용 프로그램 구성 요소들을 응용 프로그램의 비즈니스 로직을 나타내며 데이터의 상태 관리를 하고 변경 사항을 뷰 및 컨트롤러에 알리는 역할을 하는 Model, 사용자에게 데이터를 표시하고 사용자 입력을 받는 역할을 하는 View, 사용자 입력을 처리하고 모델 및 뷰 간의 상호 작용을 관리하는 Controller로 분리하기 위해 사용한다.
    MVC 패턴의 장점으로는 각 구성 요소가 서로 다른 역할을 수행해 수정하거나 대체할 때 용이하며, 다른 부분에 미치는 영향을 줄일 수 있고 구성요소들을 다른 응용 프로그램에 재사용할 수 있습니다.

'스터디일지' 카테고리의 다른 글

CS 면접 질문 대비 31번 ~ 40번  (0) 2023.11.17
CS 면접 질문 대비 21번 ~ 30번  (1) 2023.10.25
CS 면접 질문 대비 1번 ~ 10번  (1) 2023.10.11
Docker 사용해보기  (0) 2023.10.07
MSA란 무엇인가??  (0) 2023.10.05