기술 면접(스프링)

유요한·2024년 2월 23일
0

기술면접

목록 보기
4/27
post-thumbnail

프레임워크란?

  • 특정 형태의 소프트웨어 문제를 해결하기 위해 상호 협력하는 클래스 프레임인터페이스 프레임의 집합

  • 특정한 틀을 만들고 거기에 추가하는 방식으로 작업 시간을 줄여줍니다.

    뼈대나 근간을 이루는 코드들의 묶음

  • 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성

  • 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의

  • 컴포넌트는 재사용 가능

중요한 이유

프레임워크가 중요한 이유는 객체지향 개발을 하게 되면서 개발자의 취향에 따라 다양한 프로그램이 나오게 되었다. 프로그램 개발에 투입되는 개발자도 점점 늘어남에 따라 전체 시스템의 통합성, 일관성이 부족하게 되었기 때문이다. 그래서 개발자의 자유를 제한하기 위해 프레임워크를 도입했다.

프레임워크 특징

  • 개발자가 따라야할 가이드라인 존재
  • 범위가 존재함
  • 다양한 도구 지원

프레임워크 장점

개발에 필요한 구조를 이미 코드로 만들어 놓았기 때문에, 실력이 부족한 개발자라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발이 가능하다. 회사 입장에서는 프레임워크를 사용하면 일정한 품질이 보장되는 결과물을 얻을 수 있고, 개발자 입장에서는 완성된 구조에 자신이 맡은 개발해서 넣기 때문에 개발 시간을 단축할 수 있다. 그리고 오류로부터 자유로울 수 있다.

프레임워크 단점

프레임워크에 너무 의존하면 개발 능력이 떨어지거나 프레임워크 없이 개발하는 것이 힘들다.

예로들어, 룸북같은 어노테이션을 사용하면 편리해서 그거만 사용하면 룸북의 기능을 직접 구현하려고 하면 힘듬

💡프레임워크와 라이브러리의 차이에 대해 설명해주세요

프레임워크와 라이브러리 차이는 제어 흐름이 누군가에게 있냐가 가장 큰 차이점인거 같습니다. 프레임워크는 통제권이 프레임워크가 가지고 있어서 사용자가 그 틀 안에서 사용해야 하는데 라이브러리는 통제권이 사용자에게 있습니다.


스프링 프레임워크

  • 경량 프레임워크(light-weight)

  • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크

  • 예전 프레임워크는 다양한 경우를 처리할 수 있는 다양한 기능을 가지도록 만들다 보니 하나의 기능을 위해서 너무 많은 구조가 필요했다. 기술이 너무나 복잡하고 방대하기 때문에 전체를 이해하고 개발하기에는 어려움이 많았다. 그래서 스프링 프레임워크가 등장했고, 특정 기능을 위주로 간단한 JAR파일 등을 이용해서 모든 개발이 가능하도록 구성되어 있다.

    JAR

    JAR는 여러개의 자바 클래스 파일과, 클래스들이 이용하는 관련 리소스 및 메타데이터를 하나의 파일로 모아서 자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷이다.

    스프링 프레임워크의 장점

  • 복잡함에 반기를 들어서 만들어진 프레임워크

  • 프로젝트 전체 구조를 설계할 때 유용한 프레임워크

  • 다른 프레임워크들의 포용(여러 프레임워크를 혼용해서 사용가능)

  • 개발 생산성과 개발도구의 지원

    스프링 프레임워크의 특징

  • POJO 기반의 구성

    POJO(Plain Old Java Object) 기반의 구성

    • 오래된 방식의 간단한 자바 객체
    • Java 코드에서 일반적으로 객체를 구성하는 방식을 스프링에서도 그대로 사용할 수 있다는 말이다.

    장점

    • 객체지향적인 설계를 자유롭게 적용할 수 있다. 그렇기 때문에 언제든지 재활용할 수 있다.

    • POJO로 개발된 코드는 자동화된 테스트에 매우 유리하다.

    • 특정 기술과 환경에 종속되지 않은 오브젝트는 재사용이 가능하며 유연하게 확장할 수 있는 코드를 작성할 수 있다.

    • 특정 종속 코드를 작성하지 않기 때문에 간결한 코드를 작성할 수 있고 테스트를 단순하게 진행할 수 있다.

      "진정한 POJO란 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트이다"

  • 간단한 컴포넌트로 복잡한 애플리케이션을 구성하고 설정할 수 있음

  • 의존성 주입(DI)을 통한 객체 간의 관계 구성

    의존성 주입(DI)을 통한 객체 간의 관계 구성

    DI : DI란 말그대로 의존성 주입이다.

    의존성(Dependaency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미한다. 예를 들어 A객체가 B 객체 없이 동작이 불가능한 상황을 A가 B에 의존적이다 라고 표현한다.

    주입(Injection)은 말 그대로 외부에서 밀어 넣는 것을 의미한다. 예를 들어 어떤 객체가 필요로 하는 객체를 외부에서 밀어 넣는 것을 의미한다. 주입을 받는 입장에서는 어떤 객체인지 신경쓸 필요가 없고 어떤 객체에 의존하든 자신이 하던 역할은 변하지 않게 된다. 필요할 때만 주입을 통해서 넣는 것이다.

    *의존
    ⓐ → ⓑ
    a 객체에서 b 객체를 직접 생성
    
    *의존성 주입
    ⓐ → ???? ← ⓑ
    a가 b를 필요로 한다는 신호를 보내고, b 객체를 주입하는 것은 
    외부에서이루어짐

    의존성 주입방식을 사용하기 위해서는 ???라는 존재가 필요하게 된다. 스프링 프레임워크에서는 ApplicationContext가 ???라는 존재이며, 필요한 객체를 생성하고 주입까지 해주는 역할을 한다. 따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고, 이러한 객체들을 엮는(Wiring) 작업의 형태로 개발하게 된다.

    ApplicationContext가 관리하는 객체들을 빈(Bean)이라 부르고, 빈과 빈 사이의 의존 관게를 처리하는 방식으로 XML, Java 코드, 어노테이션 방식을 이용할 수 있다.

    DI 사용 장점

    • 객체 간 결합도를 낮춘다.
    • 유연한 코드 작성 가능
    • 가독성 증가
    • 코드 중복 방지
    • 유지보수가 용이
    • 기존에는 개발자가 직접 객체의 생성과 소멸을 제어했는데 DI로 인해 객체의 생성과 소멸 등 클래스간 의존관계를 스프링 컨테이너가 제어
    • DI는 객체의 생성, 소멸, 의존 관계를 개발자가 직접 설정하는 것이 아니라 XML이나 어노테이션을 통해 스프링 프레임워크가 제어
    • 기존에는 개발자가 직접 객체를 생성해줬던 반면에 스프링 프레임워크에서는 객체의 제어를 스프링이 직접 담당해주는 IoC 특징을 가진다

    단점

    • 의존성 주입을 위한 선행 작업이 필요해 간단한 프로그램에서는 번거롭다.
    • 코드 추적이 어렵다.

    주입 방식

  • AOP(Aspect-Oriented-Programming)지원

    트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있습니다. 이러면 개발자가 비즈니스 로직에만 집중할 수 있습니다. 스프링 프레임워크는 반복적인 코드를 제거해줌으로써 핵심 비즈니스 로직에만 집중할 수 있는 방법을 제공한다. 보안이나 로그, 트랜잭션과 같이 비즈니스 로직은 아니지만 반드시 처리가 필요한 횡단 관심사(cross-concern) 라고 한다. 스프링 프레임워크는 이러한 횡단 관심사를 분리해서 제작하는 것이 가능하고 횡단 관심사를 모듈로 분리하는 프로그래밍을 AOP라고 한다. 이를 통해 3가지의 이점이 생깁니다.

    1) 핵심 비즈니스 로직에만 집중하여 코드 개발
    2) 각 프로젝트마다 다른 관심사를 적용할 시 코드 수정 최소화
    3) 원하는 관심사의 유지보수가 수월한 코드 구성이 가능

  • 편리한 MVC 구조

  • WAS의 종속적이지 않은 개발 환경

  • 크기와 부하의 측면에서 경량

  • IoC이라는 기술을 통해 애플리케이션의 느슨한 결합을 도모

    객체의 생성부터 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀐 것을 의미 한다. 개발자는 프레임워크에 필요한 부품을 개발하고 조립하는 방식으로 개발을 하고 최종 호출은 개발자가 아니고 프레임워크의 내부에서 결정된 대로 이뤄지게 되는데 이런 현상을 제어의 역전이라고 한다.

    객체의 생성부터 Life Cycle을 관리하고 제어해주는 것을 말합니다. 즉, 제어권이 스프링 프레임워크로 넘어오게 되면서 DI(의존성 주입), AOP(관점 지향 프로그래밍) 등을 가능하게 합니다.


아파치 & 톰캣

아파치란?

  • 아파치 재단에서 만든 소프트웨어이다. ( HTTP 웹 서버이다. )
  • 정적인 데이터를 처리하는 웹서버이다.
    • 웹서버는 클라언트가 GET , POST , DELETE 등등의 메소드를 이용해서 요청​을하면 그에 대한 결과를 돌려주는 기능이다.
    • 정적인 HTML이나 이미지를 제공하는 서버를 웹서버라고 한다.

reverse proxy

서버의 정보를 감추는 것이다. 서비스가 몇 번 포트로 돌아가는지 정적 파일이 어디에 있는지 그러한 정보들을 감추는 것이다.

로드밸런싱

사용자들이 몰릴 때 분산해서 서버에게 나누어주는 역할을 한다.

톰캣이란?

  • 아파치 재단에서 만든 소프트웨어 입니다.
  • 동적인 데이터를 처리하는 웹서버이다.

    동적인 처리를 담당하는 서버를 WAS(Web Application Server)라고 하고 , 대표적인 WAS가 아파치톰캣(톰캣이라고 부르기도 한다)입니다.

  • WAS(Web Application Server) 라고 불리며 , 웹서버와 웹 컨테이너의 결합으로 당야한 기능을 컨테이너에 구현하고 다양한 역할을 수행할 수 있는 서버를 말합니다.

💡아파치와 톰캣의 장단점

💡웹 서버와 WAS는 각각 무엇이고 차이점은 무엇인가?

웹 서버는 하드웨어와 소프트웨어로 구분할 수 있는데 하드웨어는 web 서버가 설치되어 있는 컴퓨터이고 소프트웨어는 웹 브라우저 클라이언트로부터 HTTP 요청을 받고, 단순 html문서, css, javascript, 이미지, 파일 등즉시 응답이 가능하고 정적인 컨텐츠를 제공하는 컴퓨터 프로그램이다. 또한 웹 서버에서 동적 컨텐츠의 요청을 받으면 WAS에게 해당 요청을 넘겨주고 WAS에서 처리한 결과를 클라이언트에게 전달해주는 역할도 합니다.

WAS는 동적인 컨텐츠를 제공하기 위해 만들어진 서버이다. WAS는 jsp, servlet 구동환경을 제공해주기 때문에 웹 컨테이너 혹은 서블릿 컨테이너라고 불린다. 두 개의 차이점은 웹 서버는 정적인 컨텐츠를 제공하여 기능 분배를 해서 서버 부담을 줄이고 WAS는 요청에 맞는 데이터를 DB에서 가져와 비즈니스 로직에 맞게 그 때마다 결과를 만들고 제공함으로써 자원을 효율적으로 사용할 수 있다는 차이점을 가지고 있습니다.

profile
발전하기 위한 공부

0개의 댓글