면접 스터디 1주차

SaGo_MunGcci·2022년 10월 11일
0

면접준비

목록 보기
1/1

1~10문

1.JPA는 무엇인가?

  • JPA(Java persistence API)는 자바 ORM 기술에 대한 API 표준입니다. ORM이란 Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말합니다.

  • ORM을 사용하는 가장 큰 이유는 바로 자바에서의 객체와 데이터베이스의 패러다임의 불일치 때문입니다. 따라서 객체는 객체지향적으로, 데이터베이스는 데이터베이스대로 설계할수 있도록 ORM이 중간에서 2개를 매핑하는 역할을 합니다.

  • 장점
    - 특정 데이터베이스에 종속되지 않음
    - 객체지향적 프로그래밍
    - 생산성향상

  • 단점
    - 복잡한 쿼리 처리
    - 성능 저하 위험
    - 학습시간

1.5 Hibernate

  • jpa는 인터페이스고 이를 구현한 대표적인 구현체로 Hibernate, EclipseLink,DataNucleus등이있습니다. jpa 인터페이스를 구현한 가장 대표적인 오픈소스가 Hibernate입니다. 실질적인 기능은 Hibernate에 구현되어 있습니다.

참고 : 스프링부트 쇼핑몰 프로젝트 with JPA p.60

2.Spring Framework와 Spring Boot의 차이

2.1 Spring Framework

  • Spring Framework는 Transaction Manager, Hibernate Datasource, Entity Manager, Session Factory와 같은 설정을 하는데에 어려움이 많이 있습니다. 개발자가 Spring MVC를 사용해서 어플리케이션을 만들려고 할 때 상당히 많은 시간을 환경설정을 위해 투자하게 되고 설정을 제대로 하지 않으면 개발을 시작하기도 전에 404 error가 발생합니다.

2.2Spring boot

  • 1) spring-boot-starter-web
    그러나 Spring Boot는 버전 관리를 스프링 부트에 의해서 관리됩니다. 따라서spring-boot-starter-web을 사용하면 종속된 모든 라이브러리를 알맞게 찾아서 함께 가져오기 때문에 종속성이나 호환 버전에 대해 신경 쓸 필요가 없게 됩니다.

  • 2) Embed Tomcat
    스프링 부트는 내장형 톰캣을 가지고 있기 때문에 별도의 톰캣을 설정할 필요가 없어졌으며, 그렇기 때문에 독립적으로 실행 가능한 jar로 손쉽게 배포가 가능해졌습니다.

  • 3) AutoConfigurator
    공통적으로 필요한 DispatcherServlet같은 설정을 어노테이션을 이용하여 대신할 수 있도록 해줍니다. 스프링 부트의 main 메서드는 @SpringBootApplication 어노테이션을 가지고 있는데 이것은 ComponentScan + configuraion + EnableAutoConfiguration를 합친 어노테이션 이라볼 수 있습니다.

참고 : https://msyu1207.tistory.com/entry/Spring-VS-Spring-Boot-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%84-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

3.Spring Web MVC의 Dispatcher Servlet의 동작 원리에 대해서 간단히 설명해주세요.

1) MVC
Model, View, Controller 로써 유저의 요청을 효율적으로 처리하기 위한 모델입니다. 유저가 어떤 페이지를 요청하면

a).요청에 적합한 Controller 가 요청을 받아서
b).요청 페이지에 필요로 하는 정보인 Model 을 조회/생성하고
c).조회/생성한 Model 을 통해 최종 페이지인 View 를 생성하여 유저에게 반환하는 모델입니다.

2) DispatcherServlet의 동작 원리

  • (1). Client → DispatcherServlet
    - a. 가장 앞 단에서 요청을 받아 FrontController 라고도 불림

  • (2). DispatcherServlet → Controller
    - a.API 를 처리해 줄 Controller 를 찾아 요청을 전달
    - b.Handler mapping 에는 API path 와 Controller 함수가 매칭되어 있음
    (GET /user/signup → UserController 의 signup() 함수)
    - c.함수 이름을 내 마음대로 설정 가능했던 이유!
    - d.Controller 에서 요청하는 Request 의 정보 ('Model') 전달

  • (3). Controller → DispathcerServlet
    - a. Controller 가 Client 으로 받은 API 요청을 처리
    - b. 'Model' 정보와 'View' 정보를 DispatcherServlet 으로 전달

  • (4). DispatcherServlet → Client
    - a. ViewResolver 통해 View 에 Model 을 적용
    - b. View 를 Client 에게 응답으로 전달

참고 : 팀스파르타 스프링 심화 2주차 강의자료

요약.
1)클라이언트의 요청을 디스패처 서블릿이 받음
2)요청 정보를 통해 요청을 위임할 컨트롤러를 찾음
3)요청을 컨트롤러로 위임할 핸들러 어댑터를 찾아서 전달함
4)핸들러 어댑터가 컨트롤러로 요청을 위임함
5)비지니스 로직을 처리함
6)컨트롤러가 반환값을 반환함
7)HandlerAdapter가 반환값을 처리함
8)서버의 응답을 클라이언트로 반환함

4. Spring Bean Life Cycle에 대해 설명해주세요

스프링 IoC 컨테이너 생성 →  스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 메소드 호출 → 사용 → 소멸 전 콜백 메소드 호출 → 스프링 종료

  • 1)가장 처음에는 Spring IoC 컨테이너가 만들어지는 과정이 일어난다.

  • 2)Bean으로 등록할 수 있는 어노테이션들과 설정파일들을 읽어 IoC 컨테이너 안에 Bean으로 등록 시킨다.

  • 3)그리고 의존 관계를 주입하기 전의 준비 단계가 존재한다.
    이 단계에서 객체의 생성이 일어난다. 여기서 한 가지 알고 넘어가야 할 부분이 있다.
    생성자 주입 : 객체의 생성과 의존관계 주입이 동시에 일어남
    Setter, Field 주입 : 객체의 생성 ㅡ> 의존관계 주입으로 라이프 사이클이 나누어져 있음

  • 4)스프링은 의존관계 주입이 완료되면 스프링 빈에게 “콜백 메소드”를 통해 초기화 시점을 알려주며,
    5)스프링 컨테이너가 종료되기 직전에도 소멸 콜백 메소드를 통해 소멸 시점을 알려준다.

4.1빈 생명주기 콜백 3가지중 @PostConstruct(초기화), @PreDestroy(소멸)

최신 스프링에서 권장하는 방법!
어노테이션만 붙이면 되기 때문에 편리함
스프링에 종속적인 기술이 아니라 자바 표준 코드이기 때문에 다른 컨테이너에서도 동작
컴포넌트 스캔과 잘 어울림

이 방식의 유일한 단점
커스터마이징이 불가능한 외부 라이브러리에서 사용 불가능 (외부 라이브러리에서 초기화, 종료를 해야 할 경우 두 번째 방법 즉, @Bean의 initMethod와 destroyMethod 키워드를 사용)

참고 : 자바에서 초기화(initialization)란

객체를 선언하고 값을 '최초'로 할당하는 것이다

int a = 10; 이렇게 작성한 것은

선언과 동시에 초기화한 것이고

이후에 a = 20; 이렇게 주면 초기화가 아니라

값을 바꾸는 할당(allocation)이 된다

5.filter와 interceptor의 차이

1)Filter (Tomcat)
Servlet (J2EE 7 표준)스펙에 정의

1개의 함수로 DispatcherServlet 이전/이후에 호출
함수명: doFilter()
요청이 DispatcherServlet.service() 에 진입하기 직전(init() 후)에 호출
결과를 DispatcherServlet.service() 가 반환하는 직후(destroy() 전)에 호출

doFilter 함수가 요청 진입시 & 결과 반환시, 2번 호출되기 때문에, 암/복호화같은 요청 전 & 반환 후 두 곳에 전역적으로 처리해야하는 로직에 적합합니다.
2)Interceptor (Spring)
Spring Framework 스펙에 정의

3개의 함수로 Controller 이전/이후에 호출
함수명: preHandle()
요청이 Controller 에 진입하기 직전에 호출

함수명: postHandle()
결과를 Controller 가 반환하는 직후에 호출

함수명: afterCompletion()
Controller 결과에 따라 View 를 생성한 직후에 호출

컨트롤러 진입 혹은 결과 반환 시점에 디테일하게 처리해야하는 로직에 적합합니다. 예를 들어 특정 URL 로 진입되는 요청에 대해서는 컨트롤러 진입 직전에 해당 URL 에 특화된 정보들을 미리 세션에 설정하여 컨트롤러 내부 로직에서 활용할 수 있게 할 수 있습니다. 다른 URL 이라면 본 로직을 수행하지 않도록 조건을 추가할 수도 있습니다.

참고 : https://aaronryu.github.io/2021/02/14/a-tutorial-for-spring-mvc-and-security/

6. Dependency Injection (방법 3가지)

  1. 생성자 주입(Constructor Injection)
@Controller
public class CocoController {  //final을 붙일 수 있음 
private final CocoService cocoService;  //---------------------------------------------------------  //
@Autowired
public CocoController(CocoService cocoService) {
this.cocoService = cocoService;
    }
}

클래스의 생성자가 하나이고, 그 생성자로 주입받을 객체가 빈으로 등록되어 있다면  @Autowired를 생략 할 수 있습니다.

  1. 필드 주입(Field Injection)
@Controller
public class CocoController {
   @Autowired  
   private CocoService cocoService;
}

필드에 @Autowired 어노테이션만 붙여주면 자동으로 의존성 주입됩니다.
사용법이 매우 간단하기 때문에 가장 많이 접할 수 있는 방법입니다.

 단점
코드가 간결하지만, 외부에서 변경하기 힘들다.
프레임워크에 의존적이고 객체지향적으로 좋지 않다.

  1. 수정자 주입(Setter Injection)
@Controller
public class CocoController { 
   private CocoService cocoService;  
@Autowired
public void setCocoService(CocoService cocoService) { 
this.cocoService = cocoService; 
   }
}

Setter 메소드에 @Autowired 어노테이션을 붙이는 방법입니다.
선택적인 의존성 주입이 필요할 때 유용합니다.
단점:필수적인 의존성을 주어야 하는 곳에서 사용하면NullPointerException이 발생하므로 null에 대한 검증 로직을 모든 필드에 추가해야 함

Spring Framwork reference에서 권장하는 방법은 생성자를 통한 주입입니다.

  1. 순환 참조를 방지할 수 있다.
    순환참조시 필드 주입과 수정자 주입은 빈이 생성된 후에 참조를 하기 때문에 어플리케이션이 아무런 오류 그리고 경고 없이 구동됩니다.
    그리고 그것은 실제 코드가 호출될 때까지 문제를 알 수 없다는 것입니다.

  2. 불변성(Immutability)
    생성자로 의존성을 주입할 때 final로 선언할 수 있고, 이로인해 런타임에서 의존성을 주입받는 객체가 변할 일이 없어지게 됩니다.
    하지만 수정자 주입이나 일반 메소드 주입을 이용하게되면 불필요하게 수정의 가능성을 열어두게 되고,
    이는 OOP의 5가지 원칙 중 OCP(Open-Closed Principal, 개방-폐쇄의 원칙)를 위반하게 됩니다.
    그러므로 생성자 주입을 통해 변경의 가능성을 배제하고 불변성을 보장하는 것이 좋습니다.
    또한, 필드 주입 방식은 null이 만들어질 가능성이 있는데, final로 선언한 생성자 주입 방식은 null이 불가능합니다.

  3. 테스트에 용이하다.
    생성자 주입을 사용하게 되면 테스트 코드를 좀 더 편리하게 작성할 수 있습니다.
    DI의 핵심은 관리되는 클래스가 DI 컨테이너에 의존성이 없어야 한다는 것입니다. 
    즉, 독립적으로 인스턴스화가 가능한 POJO(Plain Old Java Object)여야 한다는 것입니다.

참고 : https://dev-coco.tistory.com/70

7.AOP로 실제 개발한 경험이 있다면 설명해주세요

없음.

8.maven/gradle의 차이를 설명해주세요

  • Maven이란?
    아파치 메이븐은 자바용 프로젝트 관리 도구이다.
    아파치 Ant의 대안으로 만들어졌다.
    아파치 라이센스로 배포되는 오픈 소스 소프트웨어이다.
    프로젝트를 진행하면서 사용하는 수많은 라이브러리들을 관리해주는 도구입니다.
    여기서 메이븐의 특징적인 점은 그 라이브러리들과 연관된 라이브러리들까지 거미줄처럼 모두 연동이 되서 관리가 된다는 점입니다.
    즉, 메이븐은 네트워크를 통해 연관된 라이브러리까지 같이 업데이트를 해주기 때문에  사용이 편리합니다.

  • POM - Project Object Model
    Maven의 기능을 이용하기 위해 POM이 사용됩니다.
    POM은 약자 이름 그대로 Project Object Model의 정보를 담고 있는 파일입니다.
    pom.xml에서 주요하게 다루는 기능들은 아래와 같습니다.
    프로젝트 정보 : 프로젝트의 이름, 라이센스 등
    빌드 설정 : 소스, 리소스, 라이프사이클별 실행한 플로그인 등 빌드와 관련된 설정
    빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
    pom 연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등

    1. 그래들(Gradle)
      Gradle이란?
      빌드, 프로젝트 구성/관리, 테스트, 배포 도구
      안드로이드 앱의 공식 빌드 시스템
      빌드 속도가 Maven에 비해 10~100배 가량 빠름
      JAVA, C/C++M Python 등을 지원
      빌트툴인 Ant Builder와 Groovy 스크립트 기반으로 만들어져 기존 Ant의 역할과 배포 스크립트의 기능을 모두 사용 가능
  • 그루비
    Groovy는 스크립트 언어이고, 소스 코드를 그대로 실행합니다. 또한 Java와 호환되고, Java 클래스 파일을 그대로 Groovy 클래스로 사용할 수 있습니다.

9.아파치, 톰캣은 각각 멀티 프로세스인가 멀티 쓰레드인가?

아파치는 기본적으로 멀티 프로세스로 구현되어 있다. 하지만 설정에 따라 멀티 쓰레드를 같이 운용할 수 있다.
톰캣은 요청을 처리하기 위한 쓰레드 풀을 관리하고 있다. 그리고 요청이 오면 해당 쓰레드 풀에서 쓰레드를 꺼내 요청을 처리하도록 한다.

프로세스 : 운영체제로부터 시스템 자원을 할당받는 작업의 단위
스레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위

참고 : https://mangkyu.tistory.com/95

10.Spring Security 인증은 어떻게 이루어지나요?

1.사용자는 http Request로 id(username) 과 password를 가진 상태로 접근한다.
2.Authentication Filter는 사용자로 부터 받은 id(username) 과 password를 이용하여 UsernamePasswordAuthenticationToken을 만든다.
3.그렇게 형성된 Token을 Authentication Manager로 보내주게 되면 Authentication Manager는 Token에 저장된 username을 4,5,6 번 과정을 거쳐 DB에 존재하는 지 확인하게 된다.
4.DB의 user 존재여부를 확인한 Authentication Manager는 username 해당 유저가 있다면 UsernamePasswordAuthenticationToken에서 password를 DB에 저장된 형태와 같은 해쉬함수를 사용하여 암호화 시킨후 DB의 user 객체의 password와 비교한다.
5.모든 비교가 성공하면, Authentication Manager는 Authentication이라는 객체를 형성하여 SecurityContextHolder 내부의 SecurityContext에 저장하여 세션값을 유지시킨다.

즉 위의 모든 일련 과정은 사용자로 부터 받은 id(username) 과 password를 이용하여 Authentication이라는 객체를 형성하여 세션값을 유지시키는 일련의 과정이다.

참고 : https://sjh836.tistory.com/165

profile
이리저리 생각만 많은 사고뭉치입니다.

0개의 댓글