엄지월드

CS 공부 본문

알고리즘

CS 공부

킨글 2025. 1. 2. 22:17
  • WEB서버와 WAS를 한 곳에 두었을 때에 단점은?
    • 한 곳에 두면 문제 생겼을 때에 에러 페이지 조차 보여주지 못할 수 있다.
    • 반대로 나누게 되면 WAS에 문제 생겼을 때에 WEB 서버에서 에러 페이지를 보여줄 수 있다. 
    • 필요한 서버만 확장하면 되니깐, 확장성이 용이해진다. 
  • 공유 변수를 사용하면 안되는 이유?
    • 스프링은 싱글톤으로 이루어져 있기 때문에 A 사용자가 B 사용자의 정보를 볼 수 있다. 
  • 서블릿 객체를 누가 호출하는가? 
    • 쓰레드가 호출한다. 
  • 서블릿과 스프링 빈의 차이는?
    • 작동위치 : 서블릿은 톰캣과 같은 웹 컨테이너에서 관리되고, 빈은 스프링 컨테이너에서 관리됨
    • 역할 : 서블릿은 주로 컨트롤러 역할을 하고 빈은 서비스, 리포지토리 등 다양한 비즈니스 로직을 구현하고, 의존성 주입을 통해 다른 빈과 협력합니다.
    • 생명주기 : 웹 컨테이너에 의해 관리되며, 요청이 있을 때 인스턴스가 생성되고 초기화됩니다. 빈은 애플리케이션시작 시점에 생성되고, 필요한 경우 초기화 및 소멸 메소드를 호출
    • 공존 : 서블릿(DispatcherServlet)을 통해 클라이언트 요청을 받고, 해당 요청을 처리하기 위해 스프링 빈(서비스, 레포지토리)을 호출합니다. 이 과정에서 서블릿은 요청을 라우팅하고 빈은 비즈니스 로직을 처리하면서 공존합니다. 
    • 흐름 : 클라이언트 -> 서블릿(HTTP 요청) -> 서블릿은 필요한 정보를 바탕으로 스프링 빈 호출 -> 스프링 빈이 비즈니스 로직 처리 -> 결과를 서블릿으로 반환 -> 서블릿이 HTTP 응답 생성 -> 클라이언트
  • AOP VS IOC
    • AOP는 관점 지향 프로그래밍으로 주요 비즈니스 로직과 부가적인 관심사(Ex 로깅, 보안, 트랜잭션 관리 등)를 분리하여 모듈화하는 방법입니다. 
      • Aspect : 공통 관심사를 모듈화한 것입니다. 예를 들어, 로깅이나 트랜잭션 관리 등이 Aspect로 구현될 수 있습니다.
      • Join Point : Aspect가 적용될 수 있는 지점을 의미합니다. 메서드 호출, 객체 생성 등 다양한 지점이 될 수 있습니다.
      • Advice : Join Point에서 Advice를 적용할지를 정의하는 표현식입니다.
      • Weaving : Aspect와 비즈니스 로직을 결합하는 과정입니다. 컴파일 시, 로드 시 또는 실행 시에 이뤄질 수 있습니다.
      • 장점 : 코드의 중복을 줄이고, 공통 기능을 분리하여 관리할 수 있습니다.
      • 비즈니스 로직에 영향을 주지 않으면서 부가적인 기능을 추가할 수 있습니다.
      • 유지보수가 용이해지고, 코드의 가독성이 향상됩니다.
    • IOC(Inversion of Control)는 제어의 역전이라는 개념으로, 객체의 생성과 생명주기를 개발자가 아닌 프레임워크가 관리하는 것을 의미합니다.
      • 스프링에서는 주로 의존성 주입(DI)을 통해 IoC를 구현합니다. 
      • 의존성 주입 : 객체가 필요로 하는 의존성을 외부에서 주입해줌으로써, 객체간의 결합도를 낮추고 테스트 용이성을 높입니다. 
      • 예를 들어, 클래스의 생성자나 setter 메서드를 통해 필요한 객체를 주입 받습니다.
      • 장점 : 코드의 유연성과 재사용성이 향상됩니다.
      • 테스트가 용이해집니다(목 객체 사용 가능)
      • 객체 간의 결합도가 낮아져 유지보수가 쉬워집니다.
  • Controller를 사용해서 경로를 지정했을 때와 jsp를 바로 띄워줬을 때에 차이는? 
    • .jsp 파일을 보여주는 것이 아닌 Controller를 거쳐서 보여주고 싶은 파일만 보여줄 수 있음. 
  • 프론트 컨트롤러 패턴이란?
    • 컨트롤러의 입구를 하나로 만들 수 있다.
    • MVC 패턴은 프론트 컨트롤러 패턴을 구현한 것으로 볼 수 있다. 
    • 필터랑은 다른것이다. 
    • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
    • HttpServletRequest, HttpServletResponse 등을 파라미터로 받지 않아도 됨. @WebServlet 선언하지 않아도 됨.
    • 스프링도 결국 서블릿이 앞에 있는 것이고, 그게 앞에서 처리해주는 것이다. 그게 DispatcherServlet이다. 
    • 서블릿의 urlPatterns에 /path1/path2/* 와 같이 마지막에 *을 사용하면 일단 해당 path1/path2/의 경로에 대한 모든 하위 요청이 들어오게 된다. 
    • 다형성을 활용하여 controller.process(request, response)을 통해 map에 추가해 놓은 경로를 실행할 수 있다.
      (private Map<String, ControllerV1> controllerMap = new HashMap<>();
  • 핸들러
    • 핸들러 어댑터 : 중간에 어댑터 역할을 하는 어댑터가 추가되었는데 이름이 핸들러 어댑터이다. 여기서 어댑터 역할을 해주는 덕분에 다양한 종류의 컨트롤러를 호출할 수 있다.
    • 핸들러 : 컨트롤러의 이름을 더 넓은 범위인 핸들러로 변경했다. 그 이유는 이제 어댑터가 있기 때문에 꼭 컨트롤러의 개념 뿐만 아니라 어떠한 것이든 해당하는 종류의 어댑터만 있으면 다 처리할 수 있기 때문이다. 
    • boolean supports(Object handler)
      • handler는 컨트롤러를 말한다.
      • 어댑터가 해당 컨트롤러를 처리할 수 있는지 판단하는 메서드다.
    • ModelView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
      • 어댑터는 실제 컨트롤러를 호출하고, 그 결과로 ModelView를 반환해야 한다.
      • 실제 컨트롤러가 ModelView를 반환하지 못하면, 어댑터가 ModelView를 직접 생성해서라도 반환해야 한다.
      • 이전에는 프론트 컨트롤러가 실제 컨트롤러를 호출했지만 이제는 이 어댑터를 통해서 실제 컨트롤러가 호출된다.
  • Dao VS Repository
    • DAO
      • DAO는 데이터베이스와의 직접적인 상호작용을 담당하는 객체입니다.
      • 주로 CRUD 작업을 수행하며, 특정 데이터베이스 기술에 종속적일 수 있습니다.
      • 데이터베이스와의 연결, 쿼리 실행 등을 캡슐화하여, 비즈니스 로직과 데이터 접근 로직을 분리합니다.
    • Repository
      • 리포지토리는 도메인 모델과 데이터 접근 레이어 사이의 중재자 역할을 합니다.
      • 비즈니스 로직을 위한 객체를 제공하며, 여러 DAO를 조합하여 복잡한 쿼리나 비즈니스 로직을 처리할 수 있습니다.
      • 일반적으로 도메인 중심 설계(DDD)에서 사용되며, 데이터의 저장소 개념에 더 중점을 둡니다. 
    • DAO는 데이터베이스와의 직접적인 상호작용을 담당하고, Repository는 비즈니스 로직과 데이터를 연결하는 중재자 역할을 하며 더 높은 수준의 추상화를 제공합니다.
  • SELECT후 INSERT가 좋을까? INSERT하고 에러 처리를 하는게 좋을까?
    • 일반적으로 쿼리를 한번만 날리고 예외 처리를 하는게 좋다. 
    • 성능 : 네트워크 지연과 처리 시간이 추가로 생기기 때문이다. 
    • 일관성 : 한 번의 쿼리로 데이터를 가져오면, 데이터의 일관성을 유지할 수 있습니다.두 번의 쿼리를 날리면 그 사이에 데이터가 변경될 수 있어, 서로 다른 결과를 반환할 위험이 있습니다. 
    • 코드 간결성 : 예외를 한 번에 처리하면 코드가 더 간결해지고 이해하기 쉬워집니다. 복잡한 로직을 피할 수 있습니다.
    • 트랜잭션 처리 : 트랜잭션을 사용할 경우, 여러 쿼리를 하나의 단위로 묶어 처리할 수 있어 데이터의 일관성을 더욱 보장할 수 있습니다. 
  • 스프링 부트가 스프링에 비해서 부팅 속도가 빠른 이유는?
    • 설정 간소화
      • 자동 설정을 사용하면 복잡한 XML 파일이나 Java Config 클래스를 작성할 필요가 없습니다. 이는 초기화 과정에서 설정 파일을 읽고 해석하는 시간을 줄여줍니다. XML 파일이나 여러 Java Config 파일을 읽고 로드하는 데 시간이 걸리기 때문에, 이러한 과정을 생략함으로써 부팅 속도를 높일 수 있습니다. 
        • Java Config 클래스
          • 정의 : 스프링 3.0부터 도입된 Java 코드로 스프링 컨테이너의 설정을 정의하는 방법입니다.
          • @Configuration 어노테이션을 사용하여 설정 클래스를 정의하고, @Bean 어노테이션을 사용하여 빈을 생성합니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

@Configuration
public class AppConfig {
    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
        dataSource.setUsername("user");
        dataSource.setPassword("password");
        return dataSource;
    }
}

 

  • 스프링 부트가 스프링에 비해서 부팅 속도가 빠른 이유는?
    • 필요한 빈만 로드
      • 스프링부트는 애플리케이션의 클래스패스를 스캔하여 필요한 빈만을 자동으로 로드합니다. 이 조건부 로딩 덕분에 불필요한 빈이 초기화되지 않으며, 이로 인해 메모리 사용량과 초기화 시간이 줄어듭니다. 
        수많은 빈을 수동으로 설정하는 경우, 불필요한 빈이 로드될 가능성이 높아지고, 이로 인해 부팅 시간이 증가할 수 있습니다. 
    • 미리 정의된 기본값 사용
      • 기본값이 빠르게 적용되므로 초기화 과정이 단순해지고 속도가 빨라집니다. 

'알고리즘' 카테고리의 다른 글

백준 1049 기타줄  (0) 2024.09.19
백준 1940 주몽  (0) 2024.09.18
백준 1748 수 이어 쓰기 1  (2) 2024.09.17
백준 1302 베스트셀러  (0) 2024.09.16
백준 1269 대칭 차집합  (2) 2024.09.14
Comments