백엔드 개발직 면접 예상 질문

5. Spring

계란💕 2023. 1. 24. 22:25

Spring

  • 스프링 프레임워크가 전자정부프레임워크로 자리 잡은 이유는?
    • 전자정부표준프레임워크(eGov)란?
      • 행정부 산하 한국 정보화진흥원에서 만든 웹 기반 애플리케이션 프레임워크로서 정부, 공공기과느 공기업 등의 웹 사이트에 자주 쓰이는 공통 기능을 자바의 Spring Framework와 유명 Java 라이브러리(마이바티스, 등)을 가지고 미리 만들어놓은 컴포넌트와 이를 개발하는 개발, 운영, 관리 환경 등으로 구성된다.
      • 다양한 기술이 난잡하게 사용된던 SI 업계에 표준을 지정해줘서 전체적인 생산성을 증가시키려는 목적이 있다.
      • 장점
        • 정형화되어 있어서 일정 수준 이상의 품질을 기대 가능하다
        • 전자 정부 프레임워크이기 때문에 한국에서 수요가 크다.
        • 확장성: 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
        • 복잡하지 않고 경량화된 애플리케이션 프레임워크
        • 개발자의 실력에 관련없이 일정 수준의 품질을 기대 가능
        • 담당자 또는 개발자가 중간에 바뀌더라도 유지 보수에 관한 리스크 줄일 수 있다.
      • 단점
    • 스프링이 선택된 이유는? 우리나라는 Java 점유율이 높기 때문에 자연스럽게 스프링이 선택되었다고 생각한다.

 

 

  • 스프링(Spring)이란?
    • Def) 스프링(Spring): 스프링은 스프링 프레임워크, 스프링 부트를 포함한 생태계를 일컫는다.
    • 필수(Spring Boot + Spring Framework) + 선택(Spring Security, … 등)
    • Spring Boot
      • 스프링 부트는 스프링의 복잡한 설정단순화하여 스프링을 쉽게 사용할 수 있도록 한다.
      • 쉬운 빌드 구성을 위해 starter 종속성을 제공한다.
      • 톰캣(Tomcat)을 내장해서 별도의 웹 서버 설치가 필요 없다. 설정도 자동 적용 (스프링 부트가 없으면 was가 필요)
      • 관례에 의한 간결한 설정을 해준다.
    • Spring Framework
      • 객체 지향 언어 Java웹 애플리케이션을 개발할 수 있도록 하는 프레임워크
      • 라이브러리와 프레임워크의 차이점이 중요한다. 아래 참고
    • 스프링의 핵심 기술: DI 컨테이너 기술, AOP
      • AOP란? (aspecct oriented programming, 관점 지향 프로그래밍)https://oranthy.tistory.com/263
        • 업무 등 책임이 있는 클래스 안에 본질적인 처리만 기술하고 본질적이지 않은 처리는 밖으로 꺼내는 기술을 말한다. (단일 책임 원칙과 비슷한 맥락?)
        • 핵심 비즈니스 로직공통 모듈구분하고 핵심 로직에 영향 주지 않으면서 공통 모듈을 효과적으로 끼워넣는 개발법이다.
        • 로그 출력, 예외 처리, 보안 인증, 트랜잭션 처리공통화할 수 있는 처리를 Aspect 하나의 단위로 묶어서 어떤 객체가 본질적인 역할만 하도록 하는 기술이다.
        • AOP와 인터셉터와 차이점
          • AOP는 인터셉터보다 구체적 조건(애너테이션, 파라미터, 주소 등)과 동작 위치(Afterthrowing 등)을 갖기 때문에 상황에 따른 구체적 처리가 가능하다.
          • AOP는 URL 보다는 패키지나 애너테이션 같은 자바 코드와 관련이 있다면 필터인터셉터에 더 크게 관련있다.
        • AOP 적용 방법
          • 컴파일 타임 적용: 컴파일 시점에 바이트 코드를 조작해서 AOP가 적용된 바이트 코드를 생성하는 방법이다.
          • 로드 타임 적용: 순수하게 컴파일한 다음, 클래스를 로딩하는 시점에 클래스 정보를 변경하는 방법을 말한다.
          • 런타임 적용: 스프링 AOP가 주로 사용하는 방법이다. A 라는 클래스 타입의 빈을 만들 때, A 타입의 프록시 빈을 만들어서 프록시 빈이 Aspect 코드를 추가해서 동작하는 방법이다.
        • https://code-lab1.tistory.com/193
    • 웹 기술: MVC
    • 데이터 접근 기술: 트랜잭션, JDBC, ORM 지원

 

 

  • 스프링프레임워크 특징 (1) - IoC란?
    • 제어의 역전(Inversion of Control, IoC): 프로그램의 제어 흐름을 개발자가 직접 제어하는 것이 아니라 외부에서 관리하는 것으로 코드의 최종 호출개발자가 제어하는 게 아닌 프레임워크 내부에서 결정한 대로 이뤄진다.
    • 라이브러리와 프레임워크의 차이점
      • 라이브러리 : 활용 가능한 도구들의 집합으로 개발자가 호출해서 사용
      • 프레임워크: 코드의 최종 호출을 프레임워크가 한다. 이를 “제어의 역전”이라고 한다.

 

 

  • 스프링프레임워크 특징 (2) - DI란?
    • 의존성 주입(Dependency Injection)
    • 스프링 프레임워크에서 제공하는 IoC 형태@Bean 설정 정보를 바탕으로 컨테이너클래스 사이의 의존 관계를 자동 연결해준다.
    • DI의 장점은?
      • 재사용성이 높은 코드가 된다
      • 가독성이 높아진다.
      • 테스트하기 좋은 코드가 된다.
      • 의존성이 줄어든다.

 

 

  • SOLID원칙 - 객체 지향 설계의 5가지 원칙 (OOP를 잘하는 방법)
    • SRP(Single Responsibility Principle, 단일 책임 원칙): 한 클래스는 하나의 책임만 가지도록 구현
    • OCP(Open Close Principle): 개방 폐쇄 원칙
      • 소프트웨어 요소(클래스)는 확장에는 열려있고 변경에는 닫혀있도록 한다.
    • LSP(리스코프 치환 법칙)
      • 프로그램의 객체는 프로그램의 정확성을 깨지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야한다. (ex.자동차가 엑셀을 누르는데 뒤로 가면 위반)
      • 부모 클래스의 어떤 메서드에 대해 자식 클래스는 동일한 동작을 해야 재활용 가능성이 높아진다.
      • 즉, 부모 타입을 인터페이스 처럼 생각해야한다.
    • ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
      • 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다. ??
      • 클라이언트는 자신이 이용하는 메서드에만 의존해야한다. (인터페이스를 사용하는 클라이언트를 기준으로 인터페이스를 분리해야 한다는 뜻이다.)
      • 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야 한다는 원칙이다.
      • 큰 덩어리의 인터페이스들을 구체적이고 작은 단위들로 분리시킴으로써 꼭 필요한 메서드들만 이용할 수 있도록 한다.
      • 효과: 시스템의 내부 의존성을 약화시켜 리팩토링, 재배포.. 를 쉽게 한다.
    • DIP(Dependency Inversion Principle, 의존 관계 역전 원칙)
      • DI(의존성 주입)는 DIP(의존관계 역전원칙) 구현 기법 중 하나이다.
      • 구현 클래스가 아닌 인터페이스에만 의존해야한다는 뜻이다.
      • 이유는? 구체화에 의존하는 경우 변경이 어려워지기 때문이다.
      • ex) 내가 사용하던 라이브러리를 다른 라이브러리로 변경하는 경우, 내 코드를 뜯어고쳐야 한다, 따라서 라이브러리에 의존하면 교체가 어려워진다.

 

 

 

  • 스프링 MVC 패턴 (Dispatch Servlet 동작 원리)
    • 참고 블로그)
    • 클라이언트가 요청을 보내면 Dispatch servlet 가 요청을 받는다.
    • Dispatch Servlet는 HandlerMapping를 통해 요청 처리할 컨트롤러를 확인한다.
    • Controller는 데이터베이스에 있는 필요한 정보를 가져온다. 객체 ModelAndView를 반환(모델에 데이터를 담아서 가져온다. 뷰 이름을 반환한다. )
    • view resolver는 모델과 View Resolver를 통해 사용자에게 보여줄 view 선택한다
    • Dispatch SEervlet는 response를 클라이언트에 전달한다.

 

 

  • 스프링 Bean이란?
    • IoC 컨테이너 안에 들어있는 객체를 말하며 필요할 때 컨테이너에서 가져와서 사용한다.
    • @Bean을 사용한다.

 

 

  • Bean 생성 과정
    • 객체 생성의존 설정초기화사용소멸 과정의 생명 주기를 가진다.
    • 빈 컨테이너가 생명 주기를 관리한다.
    • @PostConstruct: 빈 초기화
    • @PreDestroy : 빈 소멸

 

 

  • Bean의 scope란?
    • 빈이 존재할 수 있는 범위를 뜻한다.
    • 싱글톤(Singletone): 기본 스코프이다. 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다.
    • 프로토타입(Prototype): 빈의 생성의존 관계 주입까지만 관여한다.

 

 

  • IoC 컨테이너(Spring Container)의 역할은?
    • 애플리케이션 실행 시점에 빈 객체를 인스턴스화하고 의존 관계를 주입한 다음 최초로 애플리케이션을 기동할 빈 하나를 제공해준다.

 

 

  • DI 종류
      1. 생성자 주입: 생성자 호출 시점에 딱 1번만 호출되도록 보장하고 불변, 필수 의존 관계에 사용한다.
      2. setter 주입: 선택 변경 가능성 있는 의존 관계에 사용되며 스프링 빈을 선택적으로 등록 가능하다.
      3. 필드 주입: @Autowired를 사용하는데 외부에서 변경이 불가능하고 테스트 힘들다.

 

 

  • Autowiring
    • 컨테이너에서 타입을 이용해서 의존 대상 객체를 검색하고 할당할 수 있는 빈 객체를 찾아 주입한다.

 

 

 

  • Servlet의 Filter와 Spring MVC의 Interceptor의 차이점
    • 참고)
    • 공통점
      • 둘다 주소, URL, 프로토콜로 처리할 수 있는 웹 기반 기술이다.
      • 필터는 대부분의 요청을 처리하고 인터셉터는 일부 요청만 처리한다 (필터는 크고 인터셉터는 작다. )
      • 둘다 비즈니스 로직과 분리되어 특정 요구 사항(보안, 인증, 인코딩)을 만족시켜야할 때 적용한다.
      • 필터는 보통 요청이나 컨트롤러에 관계 없이 “전역적으로 처리하는 작업”이나 “웹 애플리케이션에 전반적으로 사용되는 기술”을 구현할 때 쓰인다.
      • 인터셉터는 클라이언트의 요청에 관한 작업에 대해 추가적인 요청 사항을 만족할 때 적용한다.
      • 모든 요청이 두 개를 항상 거치지는 않는다.
    • 차이점
      • 필터(Filter)
        • Spring mvc 구조 안으로 들어오기 전, 후 처리 담당. 전역적으로 처리하는 작업을 처리한다.
        • 필터는 Servlet 하위 인터페이스이므로 웹 컨테이너가 관리한다. (javax.servlet), 웹 애플리케이션에 등록
        • Request와 Response 객체 조작 가능하다.
        • 용도: 이미지, 데이터 압축 및 문자열 인코딩 같이 스프링과 분리되어야 하는 기능
        • ex) 해킹 시도(csrf(Cross-Site Request Forgery, 사이트 간 요청 위조), SQL Injection(sql 삽입 공격))를 막을 수 있다.
        • doFilter()를 오버라이드하고 @Component를 등록하기만 하면 필터를 만들 수 있다.
        • 필터를 인증과 인가에 사용하는 도구로 Spring Security가 있다. Spring Security는 필터 기반으로 인증, 인가 처리를 하기 때문에 Spring MVC에 종속적이지 않다.
      • 인터셉터(Interceptor)
        • DispatcherServlet컨트롤러 사이에 위치한다.
        • Spring MVC 안에 포함된 인터페이스이므로 Spring Container가 관리한다. ApplicationContext 에 등록
        • Request와 Response 객체 조작 불가능
        • 용도: 세부적인 보안 및 인증, 인가 공통 작업, 컨트롤러로 넘겨주는 정보를 가공한다.
        • Handler를 실행하기 전후나 view resolver를 통해 컨트롤러에서 반환한 view name으로부터 렌더링 담당할 view 객체를 준비해서 돌려준 다음, 실제 view를 렌더링 후에 어떠한 처리를 담당한다.
        • 실제 매핑된 Handler 정보 확인 가능 (어떤 것이 실제 내 요청을 처리하는 지도 확인 가능하다.)
        • 상세한 조건 식과 세부적인 스텍(pre, post, after)를 통해 구체적 시점에 구체적인 동작이 가능하다
      • AOP vs 필터, 인터셉터
        • AOP는 인터셉터 보다 구체적인 조건(애너테이션, 파라미터, 주소 등)과 동작 위치(@AfterThrowing 등)을 갖기 때문에 상황에 따라서 구체적인 처리가 가능하다.
        • AOP는 URL보다는 패키지, 애너테이션 같은 자바 코드와 관련이 있다면
        • 필터인터셉터에 더 치중한다. (URL, 프로토콜) .. ("AP"를 걸 수 있다????)

 

 

 

 

  • Spring의 CORS 에러 해결 방법
    • Servlet Filter를 사용해서 커스텀한 CORS를 설정하거나 WebMvcConfigurer를 구현한 Configuration 클래스를 만들어서 addCorsMappings()를 오버라이드할 수 있고
    • Spring Security 에서 CorsConfigutionSource를 bean으로 등록해서 config에 추가해줌으로 해결 가능하다.

 

 

  • @Bean, @Component 애너테이션 차이점
    • 둘다 IoC 컨테이너에 빈을 등록하기 위해 사용한다.
    • @Component : 개발자가 작성한 클래스를 기반으로 실행 시점에 인스턴스 객체를 싱글톤으로 생성한다.
    • @Bean: 개발자가 작성한 메서드를 기반으로 메서드에서 반환하는 객체를 인스턴스 객체로 싱글톤으로 생성한다.

 

 

  • @PathVariable, @RequestParam차이점은?
    • 공통점: 둘다 데이터를 받아오는데 사용한다.
    • 차이점
      • @PathVariable: 데이터를 하나만 받아올 수 있다.
        • name: uri에서 바인딩할 때 파라미터의 이름
        • value: uri에서 바인딩하여 별칭으로 정할 값
        • required: 필수적으로 값이 전달되어야할 파라미터이다.
      • @RequestParam: 여러 개의 데이터를 받아온다.
        • @RequestParam = @PathVariable + defaultValue()
          • defaultValue: 값이 없을 때 기본적으로 전달할 값

 

 

  • @ Controller vs @RestController 차이점
    • @Controller
      • Model 객체를 만들어서 데이터를 담고 View를 반환한다.
    • @RestController = @Controller + @RepsponseBody 동작을 하나로 결합한 컨트롤러이다.
      • Restful 웹 서비스에서 사용되는 특수 컨트롤러이다.
      • 메서드에서 RepsponseBody를 사용할 필요없다.
      • 모든 메서드의 반환 값은? View 대신 객체로 반환한다. ex) XML, JSON 형식
      • Ex)
      @Controller
      public class IndexController {
      	
      @GetMapping("/")
      	public String index(){
      	    return "index";
      	}
      	
      	@GetMapping("/user")
      	public @ResponseBody String user(){
      	    return "user";
      	}
      
      

 

 

 

회고록

  • Spring 개발자니까 Spring 관련 질문을 많이 들었다. 
  • 왜 Spring을 선택했는지에 대한 질문을 듣기도 했다. 
  • Spring의 장단점에 대한 질문을 처음 들었을 때 당황했다😂😂 횡설수설하면서 하찮은 답변을 했다 ㅠ.ㅠ 나중에 대니 멘토님께 여쭤보니까 본인의 생각을 물어보는 질문이라서 정해진 답은 없다고 하셔서 안심이 됐다 ㅎㅎㅎ
  • 빈출 질문
    • 필터와 인터셉터 차이점, 주요 애너테이션의 기능, 인터페이스 사용 방법
    • Dispatcher Servlet, MVC 구조
    • AOP란? AOP를 구현해봤는가?
    • Spring이란?
    • Spring의 장단점은?
    • Spring Framework란? 특징 설명
    • 라이브러리와 프레임워크의 특징은?
    • DI(의존성 주입)의 장점은?
    • @ Controller와 @RestController 차이점
    • SOLID 원칙이란?

 

 

 

 

참고) 아래 깃허브의 질문을 참고하여 내용을 보충해서 작성했습니다. 틀린 부분있다면 댓글 부탁드립니다 💖💛💚

백엔드 면접 질문 1

백엔드 면접 질문 2