ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기술면접] 신입 개발자 Spring 예상 면접 질문
    취업준비/기술면접 2022. 11. 6. 22:58

     

    📑 WS(Web Server)와 WAS 차이

     

    📌 Web server

    : 웹서버는 소프트웨어랑 하드웨어로 구분되는데 하드웨어는 web 서버가 설치되어 있는 컴퓨터를 의미하고, 소프트웨어는  웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠를 제공하는 컴퓨터 프로그램을 의미한다.  정적인 컨텐츠를 제공하면 ,WAS 거치지 않고 자원 제공. 빠르게 제공 가능.

     

    📌 WAS (Web Application Server)

    : WAS는 DB조회나 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application Server이다. HTTP를 통해 컴퓨터 장치에 애플리케이션을 수행해주는 미들웨어이다. JSP, SERVLET 등 구동 환경을 제공한다. 

     

     

    더보기

    static : web server는 파일 경로 이름을 받아 경로와 일치하는 file contents를 반환. 항상 동일한 페이지를 반환한다. ex) image, html, css, javascript 

     

    dynamic : 파라미터 내용 맞게 동적인 contents 반환. 웹 서버에 의해 실행되는 프로그램을 통해 만들어지는 결과물 ex) servlet

     

     

     

    📑 Spring Framework 특징

     

    : 스프링은 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크이며, 동적인 웹 사이트 개발하기 위한 여러 가지 서비스를 제공한다. 경량 컨테이너로 자바 객체를 직접 관리한다. 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다. 

     

     

    📌 1. 제어의 역행 (IoC : Inversion of Control)

     

    : 제어의 흐름 권한이 어디에 있는가가 중점이다. 애플리케이션 코드는 프레임워크가 짜 놓은 틀에 수동적으로 동작하기 때문에 제어의 흐름은 프레임워크가 가지고 있다. 컨트롤러의 제어권이 사용자가 아니라 프레임워크에 있어 필요에 따라 스프링에서 사용자의 코드를 호출한다. 이는 프레임워크의 특징이기도 하다. 

     

     

     

     

    📌 2. 의존성 주입 (DI : Dependency Injection)

     

    : 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다. ApplicationContext라는 존재가 필요한 객체들을 생성하고, 필요한 객체를 주입해 준다. 

     

    의존성 주입은 생성자 주입, 필드 주입, 세터 주입의 3가지 방법이 있는데 생성자를 통한 주입을 가장 권장한다. 

     

     

     

     

    📌 3. 관점지향 프로그래밍(AOP : Aspect-Oriented Programming)

     

    :  트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 하나의 단위로 묶거나 분리하여 관리할 수 있다. 장점으로 핵심 비즈니스 로직만 집중해 코드 개발이 가능하며, 코드 수정 최소화,  유지보수 용이가 있다. 

     

     

     

     

     

    📑 @RequsetBody, @RequestParam, @ModelAttribute의 차이

     

     

    📌 @RequestBody

     

    : 클라이언트가 전송하는 JSON 형태의 HTTP Body 내용을 MessageConverter을 통해 Java Object로 변환시켜주는 역할을 한다. @RequestBody를 사용하면 HTTP 메시지 컨버터가 HTTP 바디 내용을 우리가 원하는 문자나 객체 등으로 변환해준다. JSON데이터를 자바 객체로 역직렬화하기 위한 ObjectMapper 객체도 필요 없어지는 것. 여러줄의 코드를 단 한 두줄로 축약할 수 있다. HTTP 메시지 컨버터는 문자 뿐만 아니라 JSON 객체로 변환해준다. 

     

    view 조회를 무시하고, HTTP message body에 직접 해당 내용을 입력한다. 즉) 스프링에서 메서드의 반환형을 String으로 주면 return에 저장된 문자열은 view name으로 인지한다. 여기서 만약 간단한 메세지나 객체를 전달하려면? @ResponseBody 를 메서드 위에 붙여주면 된다. 

     

    📌@RequestBody 요청 : JSON -> HTTP 메시지 컨버터 -> 객체
    📌 @ResponseBody 요청 : 객체 -> 메시지 컨버터 -> JSON 응답

     

     

     

    📌 @RequestParam 

     

    : 파라미터 이름으로 바인딩한다. 즉) 1개의 HTTP 요청 파라미터를 받기 위한 사용헙이다. @RequestParam은 기본값이 true기 때문에 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야한다. 

     

    @RequestParam("username") String name 이렇게 메서드의 매개변수로 넣어주면 파라미터로 보낸 데이터 중 username이라는 값을 아래 메서드에서 String name으로 사용하겠다는 의미.

     

     

    📌 @ModelAttribute

     

    : 요청 파라미터를 받아서 필요한 객체를 만들고, 그 객체에 값을 넣는다. 즉) HTTP Body 내용과 HTTP 파라미터의 값들을 생성자, Getter, Setter를 통해 주입하기 위해 사용한다. 

     

     

     

    📑 Spring Boot란?

     

    스프링 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화하여 사용자가 정말 편하게 스프링을 활용할 수 있도록 돕는다. 스프링 부트 starter에서 dependency만 추가해주면 바로 API를 정의하고, 내장된 톰켓으로 웹 애플리케이션 서버를 실행할 수 있다. 

     

    Spring Boot는 Spring Framework와 몇 가지 차이가 있다.

    1. 내장 톰캣을 사용하기에 따로 Tomcat을 설치하거나 매번 버전을 관리해줘야 하는 수고로움을 덜어준다.
    2. starter을 통해 depedency 자동화로 dependency들의 호환되는 버전을 일일이 맞추지 않아도 된다.!! starter가 관리해주기 때문. 매우 편리한 기능이다.
    3. xml을 설정하지 않아도 된다.
    4. jar file을 이용해 자바 옵션만으로 손쉽게 배포가 가능하다. 

     

     

    📑 Spring MVC 패턴

     

    : Spring Project를 진행하면 가장 많이 보는 패턴이 바로 이 MVC 패턴이다. 한 번쯤은 들어봤을 것이다. MVC 는 비즈니스 로직을 처리하는 Model, 클라이언트에 출력되는 화면인 View, 모든 흐름 제어를 맡는 Controller 세게의 컴포넌트로 이루어져 있으며 각 컴포넌트는 고유한 역할을 하기에 유지보수에 유리하다. 

     

     

     

     

    📑 Spring 동작 과정 

     

     

    1. 클라이언트로 부터 요청이 들어오면 DispatcherServlet이 호출된다. 

    2. DispatcherServlet은 받은 요청을 HandlerMapping에 던져준다. 요청받은 URL을 분석하여 HandlerMapping에 적합한 컨트롤러를 선택하여 반환한다. 

    3. DispatcherServlet은 다음으로 HandlerAdapter를 호출한다. HandlerAdapter는 해당하는 Controller 중 요청한 URL에 맞는 적합한 Method를 찾아준다.

    4. Controller는 Business 로직을 처리하고, 해당하는 결과를 View에 전달할 객체 Model에 저장한다.

    5. Controller는 View name을 DispatcherServlet에게 리턴한다.

    6. DispatcherServlet은 viewResolver를 호출하여 Controller가 리턴한 view name을 기반으로 적합한 view를 찾아준다. 

    7. DispatcherServlet은 객체에 처리 결과를 넘겨 최종 결과를 보여주도록 요청한다. 

    8. view 객체는 해당하는 view를 호출하여, view Model 객체에서 화면 표시에 필요한 객체들을 가져와 화면에 표시를 처리하고 client에게 넘겨준다. 

     

     

    📌 DispatcherServlet 

    : HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러라 할 수 있다. HttpServlet을 상속받아 사용하고, 서블릿으로 동작한다. 

     

    📌 HandlerMaping(핸들러 매핑)

    : 핸드러 매핑에서 컨트롤러를 찾을 수 있어야 한다. 스프링의 빈 이름 ( @Component(""))를 통해 설정 가능) 이나, @RequestMapping을 통해 핸들러를 찾을 수 있다.

     

    📌 HandlerAdapter ( 핸들러 어댑터)

    : 핸들러 매핑을 통해 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다. Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야한다. 

     

    📌 ViewResolver(뷰리졸버)

    : ModelAndView를 반환할때 리턴값에 정적뷰 이름을 지정한 후 그냥 실행하면 오류가 발생한다. InternalResourceViewResolver라는 뷰 리졸버를 자동으로 등록하는데, 이때 application.properties에 등록한 설정 정보를 사용해서 등록한다.  스프링 부트에서는 src\main\resources\templates에 있는 경로로 자동으로 연동된다. 

     

     

     

    📑 Spring에서 Bean을 등록하는 방법

     

    1. @Component 어노테이션을 사용하면 자동으로 빈으로 등록된다.  @Controller, @Service, @Repository 모두 @Component를 포함하고 있다. 

     

    2. 설정 클래스를 따로 만들어 @Configuration 어노테이션을 붙이고, 해당 클래스 안에서 빈으로 등록할 메서드를 만들어 @Bean 어노테이션을 붙어주면 자동으로 해당 타입의 빈 객체가 생성된다. 

     

    ★ 스프링 빈이란? 스프링 컨테이너에 의해 관리되는 자바 객체(POJO)를 의미한다. 

     

     

     

    📑 Lombok이 만드는 메서드들이 생성되는 시점

     

    : Lombok은 메서드 컴파일 하는 과정에서 개입해 추가적인 코드를 만들어낸다. 이것을 어노테이션 프로세싱이라고 한다. 어노테이션 프로세싱은 자바 컴파일러가 컴파일 단계에서 어노테이션을 분석하고 처리하는 기법을 말한다. 

     

     

     

    📑 대용량 트래픽에서 장애가 발생하면 어떻게 대응할 것인가?

     

    : 스케일 업을 통해 하드웨어 스펙을 향상시키고, 스케일 아웃을 통해 서버를 여러대 추가해 시스템을 증가시킨다. 

     

    📌 스케일 업(Scale-Up)

    : 스케일 업은 기존 서버의 사양을 업그레이드해 시스템을 확장하는 것을 말한다. CPU나 RAM등을 추가하거나 고성능 부품, 서버로 교환하는 방법이다. 이처럼 하나의 서버 사양을 업그레이드 하기 때문에 수직 스케일로 불리기도 한다.

     

    📌 스케일 아웃(Scale-Out)

    : 스케일 아웃은 서버를 여러 대 추가하여 시스템을 확장하는 것을 의미한다. 서버가 여러 대로 나뉘기 때문에 각 서버에 걸리는 부하를 균등하게 해주는 '로드 밸런싱'이 필수적으로 동반된다. 이처럼 여러 대의 서버로 나눠 시스템을 확장하기 때문에 수평 스케일로 불린다. 

     

     

    📑 Spring 싱글톤 패턴이란?

     

    : 스프링에서 bean 생성 시 별다른 설정이 없으면 default로 싱글톤이 적용된다. 스프링은 컨테이너를 통해 직접 싱글톤 객체를 생성하고 관리하는데, 요청이 들어올 때마다 매번 객체를 생성하지 않고, 이미 만들어진 객체를 공유하기 때문에 효율적인 사용이 가능하다. 여기서 중요해야 될 점은, 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 상태를 무상태(stateless)로 설계해야한다. 즉) 특정 클라이언트에 의존적인 필드가 있음 안되고, 값을 변경할 수 있는 필드가 있으면 안된다. 

     

    public class StatefulService {
    
       // ↓ 이렇게 되면 안된다. 이게 싱글톤 방식의 주의점. 상태를 유지하면 안된다.
     //   private int price; //상태를 유지하는 필드
    
        public int order(String name, int price){
            System.out.println("name= " +name + ", price = " + price);
           // this.price = price; //여기가 문제가 된다.
            //따라서 공유되는 전역변수, 필드가 아닌 지역변수로 사용해야 한다.
            return price;
        }
    
       /* public int getPrice() {
            return price;
        }*/
    }

     

     

     

    📑 Spring의 스코프 프로트 타입 빈이란?

     

    프로토타입 빈은 싱글톤 빈과는 달리 컨테이너에게 빈을 요청할 때마다 매번 새로운 객체를 생성하여 반환해준다. 이렇게 scope를 간단하게 관리해줄 수 있는 것이 spring의 장점이다. scope 설정은 @Scope 어노테이션으로 설정하며, 프로토타입 scope로 설정하려면 @scope("prototype")와 같이 문자열로 지정해준다. 

     

     

    반응형

    댓글

Designed by Tistory.