면접준비 - 스프링

jjunhwan.kim·2023년 1월 8일
0

Base64

  • 이진 데이터를 ASCII 문자로 바꾸는 인코딩 방식
  • ASCII 는 7bit 이고 1bit는 시스템별로 처리하는 방식이 상이하고 일부 제어문자의 경우 시스템별로 다른 코드 값을 가짐
  • 따라서 Base64 는 이진 데이터를 시스템 독립적으로 동일하게 전송 또는 저장되는 것을 보장하기 위해 사용함
  • ASCII 중 안전한 64개의 출력 문자를 사용
  • 데이터를 6비트 단위로 자름(64진법)
  • 자른 데이터를 Base64 코드표의 0~63에 해당하는 문자로 변환하는 것을 반복

JWT

  • Header - JWT 에서 사용할 타입과 해시 알고리즘 종류
  • Payload - 서버에서 첨부한 사용자 권한 정보와 데이터
  • Signature - Header, Payload 를 Base 64 URL safe Encode 하고 Header 에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명

JWT Filter

  • request에 token이 포함되어있으면 추출하여 validation 하고 유효하면 인증객체를 생성하여 SecurityContextHolder 에 저장

필터

  • 자바 기술
  • 디스패처 서블릿 전/후에 처리

디스패처 서블릿

  • 스프링 프레임워크에서 요청을 먼저 받는 프론트 컨트롤러
  • 요청을 처리할 컨트롤러를 찾아서 요청을 위임해주는 역할

인터셉터

  • 스프링 기술
  • 디스패처 서블릿이 컨트롤러를 호출하기 전/후에 처리
  • 필터 -> 디스패처 서블릿 -> 인터셉터 -> 컨트롤러

인터셉터 vs AOP

  • 인터셉터 대신 컨트롤러에 적용할 부가기능을 어드바이스로 만들어 AOP 적용가능
  • 단 인터셉터를 사용하는 것이 나을 수 있음
    • 컨트롤러는 타입과 실행 메서드가 제각각이라 포인트컷 작성이 어려움
    • 컨트롤러는 파라미터나 리턴 값이 일정하지 않음
    • AOP에서는 HttpServletRequest, HttpServletResponse 객체를 얻기 어렵지만 인터셉터에서는 파라미터로 넘어옴

필터 vs 인터셉터

  • 필터는 Request, Response 객체를 다른 객체로 바꿔서 전달하는 것이 가능
  • 인터셉터는 true, false 로 반환하므로 Request, Response 객체를 바꾸는 것이 불가능
  • 필터는 스프링과 무관하게 전역적으로 처리해야하는 작업들
  • 인터셉터는 세부적으로 처리해야하는 인증/인가 작업들, 특정 그룹 사용자에 대한 처리 등

인증vs인가

  • 인증
    • 사용자가 누구인지 확인하는 행위 ex) 로그인
  • 인가
    • 사용자의 권한이 있는지 확인하는 행위 ex) 유저 권한, 어드민 권한

트랜잭션

  • 물리 트랜잭션
    • 실제 데이터베이스에 적용되는 트랜잭션으로, 커넥션을 통해 커밋/롤백하는 단위
  • 논리 트랜잭션
    • 스프링이 트랜잭션 매니저를 통해 트랜잭션을 처리하는 단위
    • 트랜잭션 진행중 추가로 트랜잭션을 사용하는 경우에 사용
  • 논리 트랜잭션, 물리 트랜잭션 동작 원칙
    • 모든 논리 트랜잭션이 커밋되어야 물리 트랜잭션이 커밋됨
    • 하나의 논리 트랜잭션이라도 롤백되면 물리 트랜잭션은 롤백됨
    • 내부 논리 트랜잭션이 롤백되면 롤백 전용 마크를 표시
    • 외부 트랜잭션을 커밋할 때 롤백 전용 마크를 확인하여 롤백 전용 마크가 표시되어 있으면 물리 트랜잭션을 롤백하고, UnexpectedRollbackException 예외가 발생함
  • 스프링 JPA 에서 readOnly=true 설정시 성능 최적화 발생
    • 트랜잭션 커밋 시점에 플러시 호출하지 않음
    • 변경 감지를 위한 스냅샷 객체를 생성하지 않음
  • 예외
    • 체크 예외 발생시 트랜잭션 커밋
    • 언체크 예외 발생시 트랜잭션 롤백
  • 전파
    • 트랜잭션 진행 중 추가로 트랜잭션을 수행했을 때 어떻게 동작할지 결정하는 것
    • REQUIRED
      • 기존 트랜잭션이 없으면 생성하고, 있으면 참여
      • 기존 트랜잭션 없음: 새로운 트랜잭션을 생성
      • 기존 트랜잭션 있음: 기존 트랜잭션에 참여
    • REQUIRES_NEW
      • 항상 새로운 트랜잭션을 생성
      • 기존 트랜잭션 없음: 새로운 트랜잭션을 생성
      • 기존 트랜잭션 있음: 새로운 트랜잭션을 생성
    • SUPPORT
      • 기존 트랜잭션이 없으면, 없는대로 진행하고, 있으면 참여
      • 기존 트랜잭션 없음: 트랜잭션 없이 진행
      • 기존 트랜잭션 있음: 기존 트랜잭션에 참여
    • NOT_SUPPORT
      • 트랜잭션을 지원하지 않는다는 의미
      • 기존 트랜잭션 없음: 트랜잭션 없이 진행
      • 기존 트랜잭션 있음: 트랜잭션 없이 진행(기존 트랜잭션 보류)
    • MANDATORY
      • 트랜잭션이 반드시 있어야 함
      • 기존 트랜잭션이 없으면 예외 발생
      • 기존 트랜잭션 없음: IllegalTransactionStateException 예외 발생
      • 기존 트랜잭션 있음: 기존 트랜잭션에 참여
    • NEVER
      • 트랜잭션을 사용하지 않는다는 의미
      • 기존 트랜잭션이 있으면 예외 발생
      • 기존 트랜잭션 없음: 트랜잭션 없이 진행
      • 기존 트랜잭션 있음: IllegalTransactionStateException 예외 발생
    • NESTED
      • 기존 트랜잭션 없음: 새로운 트랜잭션을 생성한다.
      • 기존 트랜잭션 있음: 중첩 트랜잭션을 만든다.
      • 중첩 트랜잭션은 외부 트랜잭션의 영향을 받지만, 중첩 트랜잭션은 외부에 영향을 주지 않음
      • 중첩 트랜잭션이 롤백 되어도 외부 트랜잭션은 커밋할 수 있음
      • 외부 트랜잭션이 롤백 되면 중첩 트랜잭션도 함께 롤백

ORM vs SQL Mapper

  • SQL Mapper
    • JDBC 를 편리하게 사용할 수 있음
    • 개발자는 SQL 만 작성하면 됨
    • JDBC 의 반복 코드를 제거해주고 SQL 응답 결과를 객체로 편리하게 변환해줌
    • JdbcTemplate, MyBatis
  • ORM
    • 객체를 관계형 데이터베이스 테이블과 매핑
    • SQL 을 직접 작성할 필요 없음
    • JPA (자바 ORM 표준 인터페이스), 하이버네이트, 이클립스 링크

TCP

  • 전송 제어 프로토콜(Transmission Control Protocol)
  • 데이터 전달 보증, 순서 보장, 신뢰할 수 있는 프로토콜
  • 통신하고자 하는 양쪽 단말(Endpoint)이 통신할 준비가 되었는지, 데이터가 제대로 전송되었는지, 데이터가 가는 도중 변질되지 않았는지, 수신자가 얼마나 받았고 빠진 부분은 없는지 등 체크
  • 3-way handshake
    • TCP 통신은 3-way handshake 를 통해 통신을 시작, 수신자 송신자가 준비가 되어있는지 미리 확인
    • SYN, SYN/ACK, ACK
    • 송신자가 수신자에게 SYN 전송
    • 수신자가 송신자에게 SYN 을 받고 SYN/ACK 를 송신자에게 전송
    • 송신자가 수신자의 SYN/ACK 을 받고 ACK 를 전송
  • 데이터 전달 보증
    • 데이터 전송, 수신자는 송신자에게 ACK 전송
  • 순서 보장
    • 보내는 순서 대로 수신할 수 있도록 함

UDP

  • 사용자 데이터그램 프로토콜(User Datagram Protocol)
  • 3-way handshake, 데이터 전달, 순서가 보장되지 않지만 단순하고 빠름
  • IP + PORT + 체크섬 정도만 추가된 형태

0개의 댓글