programming study/CS -기타 cs

스프링 / JAVA / JPA / Network / DB / infra / 업무

gu9gu 2023. 6. 7. 17:11

스프링

스프링을 사용하는 이유가 뭔가요?

스프링은 자바 기반 어플리케이션을 개발하는데 도움을 주는 프레임워크이고

POJO 로 개발을 할 수 있게 AOP, IOC, PSA 같은 기술들을 지원해주기 때문에 사용합니다.

 우선 스프링은 프레임워크이기 때문에 이미 만들어진 기술을 가져다 사용할 수 있고 정형화된 구조로 개발을 할 수 있다는 장점이 있습니다.

스프링은 자바로된 프레임워크이고 자바는 객체지향 언어입니다.

스프링 프레임워크는 객체지향 프로그래밍의 성질인 다형성을 이용해서 IOC, DI 기능을 지원하기 때문에 스프링을 사용합니다. 추가적으로 AOP 기능 , 스프링MVC 기능도 스프링을 사용하는 이유가 될 수 있습니다.

spring 기본 요약 (사용 이유, 객체지향, IOC/DI/container, 빈 등록, 의존관계 주입, 스코프 등) (tistory.com)

 

POJO(Plain Old Java Object)

오래된 방식의 자바 객체라는 말인데, 순수한 java 구성되어서 특정 기술에 종속되지 않는 객체라는 의미입니다.

그리고 객체지향적인 원리를 지키면서 필요에 따라 재활용 할 수 있는 객체란 의미도 있습니다.

예를 들어 스프링이 Hibernate를 사용하고 싶을 때 JPA( Java Persistence API)에 의존하게 되면 별도 구현 없이 순수 java코드로만 개발이 가능하기 때문에 POJO개발방식을 유지한다고 할 수 있습니다.

 

 

IOC란? 좋은 점은?

객체를  직접  생성해서 의존성을 부여하는게  아니라 의존관계를 미리 설정을 해두면 스프링 컨테이너가 의존성 주입을 대신 해주는 걸 보고 IOC 즉 제어의 역전이라고 합니다.

IOC에 의해서 코드의 결합도를 낮출 수 있고 의존관계 관리를 직접 하지 않아도 된 다는 게 장점입니다.

 

AOP (Aspect Oriented Programming)기능이란, 장점은?

[10분 테코톡] 봄의 AOP와 SPRING AOP - YouTube

Spring AOP, Aspect 개념 특징, AOP 용어 정리 :: effortDev (tistory.com)

AOP는 관점 지향 프로그래밍으로 핵심적인 비지니스 로직과 공통적으로 실행해야 하는 부가적인 로직을 각각 나눠서 프로그래밍 하는 것을 말합니다.

로깅 처리, 성능분석 과 같이 공통적으로 적용되는 기능을 따로 구현해서 비지니스 로직에서 사용할 수 있게 함으로써 코드의 중복을 줄이고 비지니스 로직의 수정을 피하면서 부가적을 기능을 따로 개발할 수 있다는 장점이 있습니다.

 

AOP 동작 원리

스프링에서 AOP는 프록시 기반으로 동작합니다.

AOP 대상 메서드로 요청이 왔을 때 AOP프록시  객체가 대신 요청을 받아 AOP 작업이 있으면 수행하고 원본 메서드를 실행합니다. 원본 메서드 실행이 끝나면 다시 AOP프록시객체에서 AOP작업이 있으면 수행을 하는 식으로 동작합니다.

참고로 프록시는 사용목적에 따라 2가지 패턴으로 구분됩니다.

클라이언트가 타깃에 접근하는 방법을 제어하기 위한 프록시 패턴

타깃에 부가적인 기능을 부여해주기 위한 데코레이터 패턴

 

그리고 스프링 AOP는 메서드 조인 포인트만 지원하는데, AspectJ를 사용하면 객체의 생성, 필드값 조회 등 다양한 작업에 부가기능을 사용할 수 있습니다.

 

 

PSA

Portable Service Apstration

휴대용 서비스 추상화라는 건데, PSA는 서비스를 추상화 해놓음으로서 구현 내용을 몰라도 간편하게 사용할 수 있게 해놨고 또 기존 로직의 수정 없이 간편하게 기능 변경이 가능하다는 것을 뜻 합니다.

 

예시로 Spring Web MVC가 있습니다. Spring Web MVC를 사용할 때 spring-boot-starter-web 으로 의존성만 설정해놓으면 내부 구현 내용을 몰라도 @Controller, @GetMapping 같은 어노테이션으로 HTTP 요청을 맵핑할 수 있습니다.

또 의존성 부분을 수정하면 WAS를 tomcat에서 netty 로 간편하게 변경할 수 있습니다.

 

tomcat vs netty

Netty와 Spring Webflux — 뮤묘뮤의 묘지 (tistory.com)

 

 

mvc 패턴이란?

스프링 프레임워크에서는 DispetchServlet 클래스를 통해 mvc패턴 기능을 제공합니다.

mvc 패턴이란 controller로 요청을 받아 처리하고 처리한 결과를 model에 담아 반환하고 view에서 model에 담긴 데이터를 이용해 화면을 그리는 것을 말합니다.

mvc 패턴으로 프로그래밍 하게 되면 화면과 비지니스 로직을 나눠서 작업함으로써 유지보수 및 협업에 좋다는 게 장점입니다.

 

참고) React.js를 사용할 떄 CSR 방식으로 구조를 잡은 경우 스프링 서버는 REST API 역할을 합니다.

REST API는  MVC 패턴에서 model, controller만 있고 view는 클라이언트 측에서 생성하기 때문에 일반적인 MVC 패턴을 적용하지 않았다고 볼 수 있습니다.

 

Web Server vs WAS(Web Application Server)

네트워크 (8) 이름이 귀여운 WAS와 Web Server에 대해 알아보자 (tistory.com)

[React] SSR과 CSR(SPA) 차이 — 시간이 멈추는 장소 (tistory.com)

 

자원을 효율적으로 이용하고 장애처리나 편리한 배포를 위해 구분해놓은 것으로

 

Web Server는 쉡게 말하면 웹페이지를 client에게 전송하는 서버입니다.

http 프로토콜을 사용합니다.

이미지, HTML, CSS와 같은 정적인 자원을 제공해주는 역할을 하는 서버입니다. 예를 들면 Apache Server, Nginx(엔진x 라고 읽네...)같은 것들이 있습니다. 클라이언트의 request을 Web Server가 먼저 받고 정적자원이라면 바로 클라이언트로 response을 하고 동적 자원이 필요하면 request를 WAS로 전달합니다.

 

WAS는 DB조회나 복잡한 비지니스 로직 수행을 필요로 하는 동적인 자원을 제공해준는 역할을 하는 서버입니다. 예를 들면 Tomcat이나 Netty 같은 것들이 있습니다.  JSP와 Servlet 구동 환경을 제공하며 정적 자원을 전달하는 역할도 가능하기 떄문에 WAS 혼자서 Web Server의 역할도 할 수 있고 서버측에서 Web Server를 빼고 WAS와 DB로만 구성 가능합니다.

하지만 WAS 혼자서 너무 많은 역할을 담당하면 과부하가 일어날 수 있어서 Load Balancing 목적으로도 Web Server를 활용하고 SSL에 대한 암호화 복호화 작업, 보안 작업을 위해서 Web Server를 이용합니다.

 

고전적인 JSP가 아니라 요즘 SPA(Single Page Application, 한번 로딩한 후에 브라우저에서 렌더링해서 동작하는 방식) 방식인 react, vue.js를 사용해서 웹 어플리케이션을 구성하게 될 경우 클라리언트에게 동적으로 HTTP API를 응답하는 역할을 합니다.

 

J2EE Java EE ( Java Enterprise Edition )?

java application을 개발하기 위한 기술들

 

JSP (Java Server Page)?

Servlet과 마찬가지로 클라이언트의 요청으로부터 동적 컨텐츠를 생성하여 응답해주는 서버측 웹 프로그래밍 기술

HTML 코드 기반으로 개발됨. 자바문법을 사용할 수 있게 하는 웹페이지 스크립트 언어

 JSP로 쉽게 개발한다음 WAS를 통해 Servlet으로 변환하여 클라이언트에게 반환하게 된다.

 

 

Servlet이란?

 Servlet이란 was에서 클라이언트 요청을 처리하고 동적 컨텐츠를 생성하여 응답해주는 서버측 웹 프로그래밍 기술입니다.

.java 확장자를 가진 자바 파일에 HTML 코드가 내부에 들어가는 형식

WAS 안에 있는 Servlet Container에서 JAVA Thread를 이용하여 동작합니다.

 

Spring Thread Pool (velog.io)

[WEB] Multi-Thread & Thread Pool의 이해 (tistory.com)

꾸준히 듣게되는 Servlet과 Dispatcher Servlet에 대해 알아보자 (tistory.com)

[Spring] 디스패처 서블릿이란? (Dispatcher Servlet) (tistory.com)

Servlet Container?

Servlet Container가 servlet의 소멸과 생성을 관리합니다.

http 요청을 servlet container(was에 servlet container가 있음)가 전달받아 thread pool에서 미리 만들어놓은 thread를 가져와 thread로 servlet을 실행시킵니다. 그리고 servlet이 dispatcher servlet에 의해 맵핑된 컨트롤러에 전달됩니다.

각 요청을 dispatcher servlet이 먼저 받아서 controller로 전달하기 때문에 front controller라고도 합니다.

 

DispathcerServlet 흐름

요청할 컨트롤러를 찾아서 실행시키고 결과를 받아서 뷰파일을 찾아 응답하는 과정입니다.

1. 클라이언트의 요청을 dispathcer serlvet이 받습니다.

2. Handler Mapping 을 통해 요청에 알맞은 컨트롤러를 찾습니다.

3. Handler Adapter가 해당 컨트롤러를 실행시킵니다.

4. 컨트롤러가 요청을 처리한뒤 결과와 해당 뷰 정보(ModelAndView)를 다시 dispatcherServlet에게 전달합니다.

5. dispatcherServlet이 viewResolver를 통해  view 파일을 찾아 응답합니다.

 

Thread Pool

Tomcat 같은 WAS는 다중 요청을 처리하기 위해 부팅할 때 Thread Pool을 생성하고 http요청이 들어오면 Thread Pool에서 Thread를 꺼내서 servlet을 실행시킵니다. dispatcherServlet에 의해 servlet을 처리하고 나면 thread는 Thread Pool에 반환됩니다. WAS에서 미리 생성할 Thread 수를 지정할 수 있습니다. Thread 수를 높게 설정하면 서버의 임계점을 초과하기 때문에 요청이 몰렸을 때 서버가 다운 될 수 있고 서버가 처리할 수 있는 수보다 Thread 수를 낮게 잡으면 서버의 자원을 사용 못하는 상황이 됩니다. 성능 테스트를 통해 안정적인 Thread pool을 설정해야 합니다. ( 어떻게 성능 테스트 할까?..)

 

was의 thread pool 처리

스프링부트는 어떻게 다중 유저 요청을 처리할까? (Tomcat9.0 Thread Pool) (oopy.io)

[Spring] Reactive Spring WebFlux: Tomcat과 Netty (tistory.com)

 

스프링과 쓰레드

 여러 요청이 오게 되면 

 

 

filter vs interceptor vs aop

filter : 

interceptor : dispatcherServlet과 컨트롤러 사이에 동작

aop : interceptor와 컨트롤러 사이에 동작

filter, intercepter, aop (tistory.com)

[Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1) - MangKyu's Diary (tistory.com)

[Spring boot] Filter 설정 (tistory.com)

(Spring)Filter와 Interceptor의 차이 : NHN Cloud Meetup

Spring Filter와 Interceptor | Carrey`s 기술블로그 (jaehun2841.github.io)

[Spring] DispatcherServlet의 예외처리 전략(HandlerExceptionResolver) (velog.io)

@ExceptionHandler, @ControllerAdvice (tistory.com)

1) filter

  • filter는 java에서 제공하는 기술로 dispatcherServlet 실행 전에 실행되고 dispatcherServlet  전 후에 처리가 가능합니다.
  • filter를 구현할 때는filter 인터페이스를 구현하면 되고  dofilter()메서드에서 chain.dofilter(request, response)를 호출해야지만 applicationFilter Chain에 의해 다음 필터로 넘어가고 모든 필터가 동작했으면 다음 단계로 넘어갑니다.
  • filter를 구현했으면 @Bean어노테이션이 설정된 메서드에서 FilterRegistrationBean 으로 빈을 등록하거나 @Componet 어노테이션으로 등록이 가능하고 @WebFilter 어노테이션을 이용하여 특정 url에 대한 filter로 등록할 수도 있습니다. @WebFilter 어노테이션을 사용할 때는 @ServletComponetScan 어노테이션을 @SpringBootApplication과 같이 설정해줘야 합니다.
  • 그리고 특징으로는 filter는 dispatcherServlet 실행 전 후 즉 외부에서 동작하므로 dispatcherServlet 범위 내에서 예외를 잡아내는 @ContrllerAdvice 어노테이션으로 예외처리를 할 수 없습니다.
    filter 내에서 발생하는 에러는 try catch문으로 잡아서 response객체에 직접 예외처리를 하거나 HandlerExceptionResolver 인터페이스의 resolveException 함수를 사용해서 exception을 @ExceptionHandler에서 처리할 수 있도록 만들어주는 방법이 있습니다??? (확인 필요)
  • 보통 모든 요청에 대한 로깅, 공통된 보안 및 인증 인가 작업, 문자열 인코딩, 이미지나 데이터에 대한 압축을 할 때 사용합니다.  interceptor에서도 인증 및 인가 작업을 하곤 하는데, spring mvc와 분리시켜서 인증 및 인가를 하고 싶을 때 filter를 사용합니다. 대표적으로 spring security가 filter로 인증 및 인가를 처리해서 spring mvc에 종속적이지 않습니다.

 

2) interceptor

  • interceptor는 스프링에서 제공해주는 기술로 dipetcherServlet이 controller를 호출하기 전 후에 실행됩니다.
  • 예외처리를 할 때 dispatcherServlet 범위 내에서 예외를 잡아내는 @ControllerAdvice 어노테이션으로 예외 처리를 할 수 있습니다.
  • handlerInterceptor 인터페이스를 구현하여 interceptor를 만들고 WebMvcConfigurer를 구현한 클래스에서 addInterceptors 메서드에서 interceptor를 등록합니다. preHandelr() 메서드를 사용하면 controller 실행 전 postHandler() 메서드를 사용하면 controller 실행 후에 처리됩니다.
  • api 호출에 대한 로깅, 세부적인 인증 및 인가, contrller로 넘겨주는 데이터의 가공을 할 때 사용합니다.

 

3) AOP ( Aspect Oriented Programming)

  • AOP는 관점 지향 프로그래밍으로 핵심적인 비지니스 로직과 공통적으로 실행해야 하는 부가적을 로직을 각각 나눠서 프로그래밍 하는 것을 말합니다.
  • 스프링에서 제공하는 AOP는 메서드 실행 전 후에 동작합니다. AspectJ를 사용하면 객체의 생성 전후, 필드값 조회 시에도 AOP를 실행시킬 수 있습니다.
  • AOP는 프로시 패턴으로 동작합니다. AOP 대상 메서드에 요청이 오면 AOP 프록시 메서드가 요청을 대신 받아 AOP에서 구현해놓은 로직을 수행하고 원본 메서드를 실행시킵니다. 그리고 원본 메서드 처리가 끝나면 AOP프록시 메서드가 다시 후 처리를 하고 최종적으로 반환합니다.
  • spring boot starter aop 의존성을 추가해서 사용합니다. @Aspect, @Component 어노테이션으로 aop를 생성하고 @PointCut 어노테이션으로 대상 메서드를 지정합니다.

 

 

스프링부트에서 예외 처리

[Spring] 스프링의 다양한 예외 처리 방법(ExceptionHandler, ControllerAdvice 등) 완벽하게 이해하기 - (1/2) - MangKyu's Diary (tistory.com)

스프링부트에서 예외가 발생하면  기본적으로  /error로 전달 하도록 WAS에 설정이 되어있습니다.

그래서 별도의 설정이 없다면 BasicErrorController로 에러처리 요청이 전달됩니다.

그리고 스프링에서는 보통 @ControllerAdvice를 통해서 전역으로 에러를 잡을 수 있게 클래스에 설정하고  @ExceptionHandler 어노테이션으로 메서드에 설정해서 특정 에러마다 처리를 해주는 식으로 처리를 합니다. 이렇게 하면 BasicErrorController까지 error가 전달되지 않고 WAS가 응답을 정상적으로 처리했다고 인식합니다.

 

filter 내에서 발생하는 에러는 try catch문으로 잡아서 response객체에 직접 예외처리를 하거나 HandlerExceptionResolver 인터페이스의 reslveException 함수를 사용해서 exception을 @ExceptionHandler에서 처리할 수 있도록 만들어주는 방법이 있습니다.

 

 

스프링 vs 스프링 부트

스프링 부트는 스프링을 간편하게 사용하기 위한 도구라고 할 수 있습니다.

1) spring security, JPA, spring web MVC 같은 것을 사용할 때 설정이 필요한데,  spring framework에서는 빈을 생성하면서 관련된설정을 해줘야하지만 spring boot에서는 application.yml 파일에서 짧은 코드로 설정이 가능합니다. dependency를 설정할 때도 spring boot에서는 starter을 사용해서 짧은 코드로 설정할 수 있고 버전관리도 알아서 해줍니다.

2) spring boot틑 tomcat 같은 Web Application Server를 내장하고 있어서 jar파일로 배포하여 별도로 was 없이 실행 시킬 수 있습니다.

3) spring boot는  @SpringbootApplication 어노테이션이 설정되는데, @SpringbootApplication에 포함된 @EnableAutoConfiration 어노테이션에 의해 spring.factories에 사전에 정의한 것들을 빈으로 등록합니다.

(1) '스프링'과 '스프링 부트'의 차이 [ 스프링 부트 (Spring Boot) ] - YouTube

[Spring] Spring VS Spring Boot 차이점 (tistory.com)

 

 

스프링에서 스테레오 타입이란

스프링 컨테이너가 빈을 생성하고 의존성 주입을 해주는데, 스프링 컨테이가 생성하는 빈의 대상이 되는 클래스를 식별해주는 표시입니다. 스프링 컨테이너가 스캔을 해서 스테레오 타입이 지정되어 있는 것을 보고 빈으로 만들어서 빈으로 DI를 해줍니다.

  • @Component : 기본적인 스테레오 타입 어노테이션인데, 클래스에 Component 어노테이션이 설정하면 빈 생성에 대상이 됩니다. class 이름이 bean 이름이 됩니다. 그리고 @Component 어노티이션을 포함하는 @Configuration, @Controller, @Service, @Repository 어노테이션이 있습니다.
  • @Configuration : @Bean과 같이 사용되는 스테레오 타입입니다. 클래스 @Configuration이 설정하면 클래스 내부에 있는 메소드에 @Bean을 설정하여 메서드가 반환하는 객체를 bean으로 생성합니다.. 메서드 이름이 bean의 이름이 됩니다.
  • @Controller : @Controller 어노테이션이 설정된 클래스는 Dispatcher Sevlet에 의해 MVC 컨트롤러 역할을 하게 됩니다. @RequestMapping 어노테이션을 같이 설정해서 특정 클라이언트의 요청을 특정 컨트롤러로 전달하는데 사용합니다.
    그리고 @Controller 클래스에서 메서드의 반환값은 view를 출력하는데, @ResponseBody 어노테이션을 같이 설정해서 @RestController 어노테이션으로 만든다음에 데이터를 반환 할 할 수도 있습니다.
  • @Service는 @Component와 같은 기능을 하고 단순히 service 클래스라는 것을 표시하기 위합입니다.
  • @Repository는 DAO(db에 접근하는 쿼리를 전달하는 역할을 하는 것)에 설정을 하는데, DAO에서 발생하는 예외를 Spring DataAccessException으로 변환하는 역할을 해줍니다.

 

 


JAVA

JVM (Java Virtual Machine, 자바 가상 머신)이란?

[JAVA] JVM이란? 개념 및 구조 (JDK, JRE, JIT, 가비지 콜렉터...) (tistory.com)

JVM은 OS에 종속받지 않고 자바를 실행할 수 있게 하는 기계를 말합니다.

 

JVM의 구성

클래스 로더, 실행 엔진, 런타임 데이터 영역 으로 나눠집니다.

 

JVM 실행 과정

먼저 Java 파일이 JDK 안에 있는 Java compiler에 의해 JVM이 인식할 수 있는 java bytecode로 구성된 *.class 파일로 변환이 됩니다.

그러면 JVM의 클래스 로더가 Java byteCode가 포함된 클래스 파일을 JVM의 메모리에 로드합니다. 정확히는 런타임 데이터 영역에 각 종류에 맞게 로드합니다.

그 다음 실행엔진에 의해 자바 바이트 코드를 JVM 내부에서 기계가 실행할 수 있는 기계어로 변경하여 실행시킵니다.

 

런타임 데이터 영역에서 어떻게 로드 되는지.

런타임 데이터 영역은 모든 쓰레드가 공유하는 메서드 영역 Method area, 힙 Heap

각 쓰레드마다 생성하는 스택 Stacks, ,피시 레지스터 PC Register, 네이티브 메서드 스택 Native Method stacks

로 나눠집니다.

 

OOP (Object Oriented Programming, 객체지향 프로그래밍)이란?

공통적인 부분을 추상화 해서 객체로 만들고 객체를 상호작용하여 동작하도록 프로그래밍 하는 것을 말합니다.

캡슐화, 상속, 다형성 같은 개념을 사용해서 프로그래밍 합니다.

 

객체지향 프로그래밍의 3요소 5원칙 | HyunGyu (gusrb3164.github.io)

3요소 : 캡슐화,상속,다형성

5원칙 : SOLID

 

자바 다중 상속 문제

자바에서의 다중상속 문제(a.k.a. Diamond Problem) | 기록하는개발자 | DevAndy (youngjinmo.github.io)

자바에서는 클래스간 다중상속을 지원하지 않습니다. 만약 다중상속을 지원한다고 하면 4개의 클래스가 다이아몬드 구조로 상속을 받았을 때 문제가 발생합니다. 최상위 클래스의 메서드를 두 클래스에서 각각 상속하여 오버라이딩 합니다. 그런다음 최상위 클래스를 상속받았던 두 클래스를 최하위클래스에서 다중상속 받았을 때 다중상속 받은 클래스에 같은 시그니쳐의 메서드가 존재하므로 어떤메서드를 상속 받을지 모호해지는 문제입니다. 따라서 자바에서는 클래스 간에 다중상속을 지원하지 않습니다. 

인터페이스 간에는 다중상속을 지원합니다. 왜냐하면 두 메서드에 같은 시그니쳐의 메서드가 있다고 하더라도 구현체가 없기 때문에 최종적으로 상속받은 클래스에서 구현을 하면 되기 때문에 문제가 발생하지 않기 때문입니다.

 

 

객체 지향 설계의 5가지 원칙 ( SOLID )

1) 단일 책임 원칙 (SRP : Single Resposibility priciple)

 - 한 클래스는 하나의 책임만을 가져야 한다는 원칙입니다.  요구사항이 변경돼서 기능을 변경해야 하는 경우 하나의 클래스에서 변경을 하여 다른 곳에 영향을 적게 주는 것이 핵심입니다.

 

2) 개방 폐쇠 원칙 (OCP : Open-Close priciple)

 - 확장에는 열려있어야 하고 변경에는 닫혀있어야 한다는 원칙, 즉 기존 코드를 변경하지 않으면서 기능을 추가할 수 있게 설계해야 한다는 원칙입니다.

ex) "db클래스"에 mysql_save, oracle_save를 넣으면 mongoDB저장기능을 넣고 싶을 때 "db클래스"를 변경해야 해서 OCP 위반입니다. db인터페이스에 save 메서드 두고 mysql, oracle 클래스 만들어서 구현하면 기존 클래스 변경 없이 다른 종류의 저장기능을 추가할 수 있습니다.

 

3) 리스코프 치환 원칙 (LSP : Liskov Subsituation Principle)

- 상위 객체를 하위 객체로 치환 해도 의도한대로 작동해야 하며 문제가 없어야 한다는 원칙입니다.

ex) 필통 클래스를 연필 클래스가 상속 받았을 떄 연필 클래스가 지퍼를 여는 행위를 하는 것은 논리적으로 문제가 되어 LSP 위반입니다.

 

4) 인터페이스 분리 원칙(ISP : Interface Segregation Principle)

- 클라이언트는 사용하지 않는 인터페이스에 강제로 의존해서는 안된다(로버트 C.마틴) : 클라이언트는 사용하지 않는 메서드에 의존하지 않아야 한다는 원칙입니다.

- 범용성 인터페이스를 분리시켜서 인터페이스에 클라이언트가 사용할 메서드만 포함시켜야 한다는 원칙입니다.

ex) Vehicle에 go, fly를 넣으면 car 클래스는 fly를 구현해야 해서 ISP 위반입니다.

Vehicle에 go, Flyalbe에 fly를 넣으면 car 클래스는 fly를 구현하지 않아도 됩니다.

 

5) 의존관계 역전 원칙(DIP: Dependency Inversion Priciple)

- 구현 클래스가 아니라 추상화한 인터페이스에 의존해야 한다는 원칙입니다. 인터페이스에 의존하기 되면 구현체를 바꿔 낄수 있기 때문에 기능 변경이 일어나도 코드 수정을 적게 하여 OCP 원칙을 지켰다고 볼 수 있습니다.

 

Java8 vs Java11 vs Java18

java8부터

람 lambda 표현식으로 익명 함수형 프로그래밍이 가능해졌고

스 stream interface을 통해 반복문을 멀티스레드로 병렬처리해서 좀 더 빠르게 처리할 수 있게 됐고

인 interface에 공통메서드를 default 키워드를 사용해서 구현할 수 있게 됐고

옵 optional wrapper class를 통해서 null 처리를 할 수 있게 되었습니다.

 

java11

lamda에 var 타입 사용 가능

String - isBlank 추가

File - readString, writeString 추가

 java.net 패키지에 HttpClient 추가돼서 비동기 및 동기 요청이 가능해짐

 

java18

spring boot 3 버전부터는 java18을 사용해야됩니다.

 

Lamda Expression (람다 표현식)

개발과 일상 (tistory.com)

익명함수로서 이름과 식별자가 없는 함수를 사용해서 프로그래밍 하는 것을 말합니다.

함수형 인터페이스를 객체로 만들지 않고도 함수형 인터페이스에 선언된 추상 메서드에 대해서 익명함수로 프로그래밍 합니다.

 Funtional Interface(함수형 인터페이스)는 정확하게 하나의 추상 메서드가 정의된 interface 입니다.

함수형 인터페이스는 제네릭 객체에 대해서 true/false 판단이 필요할 때 사용하는 test 메서드가 있는 Predicate 인터페이스, 제네렉 객체에 대해서 특정 작업을 수항하는 accept 메서드가 있는 Consumer 인터페이스 그 밖에 Supplier, Function 인터페이스가 있습니다.

 

Stream 인터페이스

Stream 인터페이스는 배열이나 collections 등의 데이터를 간편하게 처리해주는 기능이 있고 반복문을 멀티스레드로 병렬처리해서 좀 더 빠르게 동작시킬 수 있는 기술입니다.

 

Optional 클래스

Optional 클래스를 사용하면 객체를 제네릭으로 감싸서 객체의 null 처리나 다른 예외처리를 할 수 있는 기술입니다.

 

접근제어자(Access Modifier)

- private : 선언된 변수의 해당 클래스 내부에서만 접근 가능합니다.

- default : 접근 제어자를 별도로 설정하지 않는 것을 말합니다. 선언된 변수의 해당 패키지 내부에서 접근 가능합니다.

- protected : 선언된 변수의 클래스 내부 또는 하위 클래스에서 접근 가능합니다.

- public : 어디에서든 접근 가능합니다.

 

static 변수 (정적 변수)

메모리에 고정적으로 할당되어, 시스템이 종료될 때 해제되는 변수입니다. 그리고 여러 객체가 해당 메모리를 공유하고 객체를 생성하지 않고 바로 사용이 가능합니다. java에서는 Math 클래스가 static으로 되어있습니다.

static 메서드에서는 클래스 내부의 static 변수를 사용할 수 있지만 static 설정이 안 된 일반 변수는 사용할 수 없습니다. static 메서드는 객체 생성 없이 바로 사용이 가능한데 일반 변수는 객체를 생성한 후에 사용 가능하기 때문입니다.

 

generic 제네릭

파라미터 타입이나, 리턴 타입 지정을 외부에서 지정하게 하는 것을 말합니다.

타입을 외부에서 지정한다는 것은 제네릭 클래스의 인스턴스를 생성할 때, 제네릭 메서드를 호출할 때 타입을 지정하는 것을 말합니다.

제네릭을 사용하면 여러 타입을 받을 수 있기 때문에 코드의 중복을 피하려고 사용을 합니다.

?또한 컴파일 시점에 미리 타입 체크가 되기 떄문에 런타임 환경에서는 에러 발생 확률을 줄일 수 있어서 좋습니다.?

 

Call by Value & Call by Reference

☕ 자바는 Call by reference 개념이 없다 ❓ (tistory.com)

자바는 Call by Value만 있습니다.

Call by reference는 참조를 넘겨주는 것을 말합니다.

그런데 java에서는 참조타입인 배열이나 클래스객체를 넘길 때 참조를 넘기는 것이 아닌 해당 주소값을 복사해서 넘기는 것이여서 Call by value입니다.

 주소값을 이용해서 값을 바꿀 수는 있지만 새로운 객체를 할당해서 변수에 넣어주는 경우 참조하고 있는 메모리에 할당되는 것이 아니라 새롭게 할당을 하게 됩니다.

즉 주소값만 전달해주는 것이지 참조를 전달하는 게 아니기 때문에 call by value입니다.

 

 

 

Hash 자료구조, hashCode()와 equals() 재정의, List/Map/Set, String/StringBuilder/StringBuffer, int/Integer (tistory.com)

 

Hash 란?

  • 임의의 값을 Hash함수로 계산하여 고정된 길이의 값이 나오는 것을 말하며 이 해시값은 데이터가 저장될 위치의 주소로 이용합니다.
  • 장점으로는 검색하거나 저장할 때 모두 해시함수를 이용해 나온 값으로 위치를 찾기 때문에 속도가 빠르다는 장점이 있습니다.
  • 단점으로는 내부적으로 메모리를 미리 만들어놓고 사용하는데 메모리가 다 사용되지 않는 경우 공간 효율이 안 좋다고 할 수 있습니다. 그리고 해시 함수에 의존적인데, 해시 충돌이 많이 일어나는 경우 성능이 안 좋아질 수 있습니다.
  • 해시 충돌이란 서로 다른 값인데, 해시함수로 계산했을 때 같은 값이 나와서 저장할 곳이 충돌해버리는 현상을 말합니다.
  • 해시 충돌을 해결하기 위해서는 개방형주소 방법, 체이닝 방법을 통해 해결합니다.
  • 개방형 주소 방법은 해시충돌이 일어났을 때 다른 해시값을 주로하는 위치에 데이터를 저장하는 방법입니다. 미리 만둘어둔 공간을 다 사용하기 때문에 메모리 효율이 좋다는 장점이 있지만 밀도가 높아질 경우 성능이 급격히 안 좋아진다는 특징이 있습니다.
  • 체이닝 방법은 해시충돌이 일어났을 때 충돌이 일어난 공간에 list나 tree 형태로 추가적인 공간에 데이터를 저장하는 방법입니다. 따라서 해시 함수 내부적으로 미리 선언해둔 공간 외에 추가적으로 외부의 공간을 사용해야 합니다. 그리고 구현이 간단하다는 특징이 있습니다.
  • java의 HashMap에서는 개방형주소 방법은 밀도가 높아질 경우 성능이 급격히 안좋아진다는 단점이 있기 때문에 체이닝 기법을 사용합니다.

 

List vs Map vs Set

Java - Collection과 Map의 종류(List, Set, Map) (tistory.com)

List 는 순서를 보장하는 자료구조입니다.

 

ArrayList는 배열 형태로 저장됩니다.

따라서 특정 위치 검색시 index로 검색을 해서 속도가 빠릅니다.

그리고 특정 위치 삽입/삭제는 index를 미뤄내는 작업이 필요해서 속도가 느립니다.

또한 삽입 시에는 기존 배열 크기의 2배 크기로 새롭게 메모리에 할당해서 기존 배열을 복사하면서 새로운 값을 집어넣기 때문에 메모리를 많이 잡아 먹게 된다.

 

LinkedList는 Node가 앞뒤로 연결되어있는 구조로 저장됩니다

따라서 특정 위치 검색시 특정 위치까지 타고 타고 가야  하기 때문에 속도가 느립니다.

그리고 특정 위치 삽입/삭제 시에는 그 위치까지 타고타고 가는게 필요하지만 노드 연결 부분만 새로 해주면 되기 떄문에 

ArrayList에 비해 성능이 좋고 메모리 측면에서도 유리합니다.

 

Vector는 ArrayList처럼 배열로 만들어진 List인데 만들어진 것인데 메서드에 synchronized 키워드를 사용하기 때문에 Thread-Safe합니다.

 

Set은 중복이 허용되지 않고 순서가 없는 자료구조입니다.

HashSet은 Hash 자료구조로 저장되는 set입니다.

LinkedHashSet은 중복이 허용되지 않지만 순서는 있는 자료구조입니다.

TreeSet은 중복이 없고 순서도 없지만 데이터를 정렬하여 저장하는 자료구조입니다.

 

Map은 key,value 형태로 저장이 되고 key는 중복을 허용하지 않는 자료구조입니다.순서가 없습니다.

HashMap은 hash자료구조 형태로 저장되는 map입니다.

LinkedHashMap은 순서가 보장되는 Map입니다.

TreeMap은 데이터가 정렬되어 저장되는 Map입니다.

HashTable은 HashMap과 비슷한데 synchronized 키워드를 메서드에 사용해서 Thead-Safe하다는 특징이 있습니다.

 

 

[java] hashcode()와 equals() 메서드는 언제 사용하고 왜 사용할까? (tistory.com)

== : 객체의 주소값 비교

String.equals() : 값을 비교해서 논리적으로 일치하는지를 판단하려고 사용합니다(boolean형으로 반환). 객체의 경우 각 필드의 값이 일치하는지를 판단합니다. 이렇게 논리적 비교가 불가능한 경우 재정의를 해야 합니다.

 

Object.hashcode() : 객체 교유의 해시코드를 int형으로 반환. equals()를 재정의 했을 때는 hashCode()도 재정의 해야합니다.  equals()를 재정의해서 논리적으로 비교가 가능하다고 판단했는데, hashCode가 재정의 되지 않았으면 HashSet 같은 자료구조에 객체를 저장했을 때 비교가 제대로 되지 않아 중복이 일어날 수 있습니다.

 

왜냐하면 HashSet은 HashCode 메서드로 일차적으로 비교를 하고 해시충돌이 일어났을 때 TreeMap 또는 LinkedList로 저장을 하니까 equals()로도 비교를 하기 때문입니다.

 

[JAVA] ☕ String / StringBuffer / StringBuilder 차이점 & 성능 비교 (tistory.com)

String은 final Char[] 변수에 데이터를 저장하기 때문에 불변형으로 String 연산을 하면 새로운 메모리에 할당이 됩니다. 그래서 스트링 연산이 많은 경우에는 성능이 안 좋아질 수 있습니다.

그래서 연산이 많은 경우에는 StringBuilder, StringBuffer을 사용합니다. 이 두가지는 가변형으로서 스트링 연산이 있을 때  같은 주소에서 메모리만 늘리고 줄이면서 값만 연산합니다. 그리고 StringBuffer의 메서드(append 등등)에 Synchronized 키워드를 사용하기 때문에 Thread-Safe합니다.

 

 

Thread-Safe란?

멀티프로그래밍 환경에서 공유자원에 동시에 접근했을 때 문제가 발생하지 않고 정상적으로 처리되는 것을 말합니다.

synchronized 키워드가 메서드에 지정되어 있는 java api (ex) StringBuffer, Vector, HashTable, ConcurrentHashMap, ArrayBlockingQueue) 사용하면 Thread-safe 하게 개발할 수 있습니다. 또 db lock 처리나 redis같은 기술을 이용해서도 lock처리를 할 수 있습니다.

 

 

java 자료형

자바 자료형 정리(Java Data Type) :: JDM's Blog

코딩의 시작, TCP School

 

기본 자료형의 할당된 메모리 크기

boolean 1byte

char 2byte

byte 1byte

short 2byte

int 4byte

long 8byte

float 4byte

double 8byte

 

 

 

 

int vs Integer

int와 Integer 차이 (Primitive 자료형과 Wrapper 클래스 관계) (tistory.com)

int는 정수형 데이터를 저장하는 기본자료형입니다.

Integer는 기본자료형(primitive type)인 int에 대응 되는 wrapper 클래스입니다.

wrapper클래스는 기본자료형을 참조형으로 사용하기 위한 클래스입니다.

Integer 같은 wrapper 클래스의 특징으로는

  • null값을 지원하기 때문에 값이 없는 걸 표현할 수 있습니다. (int형은 자동으로 0으로 초기화 됩니다.)
  • 제네릭(Generic) 타입에는 클래스만 지정가능하기 때문에 제네릭에 정수형 타입으로 지정하고 싶을 때 사용합니다.
    그래서 컬렉션(collection)에 정수형 데이터를 저장하고 싶을 때 래퍼클래스인 Integer로 설정을 해야합니다.
  • Object로 변환해서 사용하고 싶을 때 래퍼클래스인 경우 변환이 가능합니다.

 

Error, exception

Error : 시스템이 종료되어야 할 수준의 심각한 문제

 - StackOverflowError :  재귀가 너무 깊게 들어가는 경우 발생

 - OutOfMemoryError :  JVM이 할당한 메모리의 부족으로 더 이상 객체를 할당할 수 없을 때 발생

Exception : 개발자가 구현한 로직에서 발생하거나 사용자에 의해 발생하는 문제

 checked Excpetion은 컴파일 시점에 반드시 예외처리를 해야합니다. IOException, ClassNotFoundException이 있습니다. 

uncheked Exception은 런타임 시점에 발생하기 때문에 예외처리를 명시적으로 하지 않아도 됩니다. NullPointerException, IndexOutOfBoundsException, ArithmeticException이 있습니다.

 

JPA

[Spring] Spring Data JPA 이해하기 (feat ORM, JPA) (tistory.com)

ORM (Object Relational Mapping)

- 객체와 관계형 데이터베이스를 맵핑시켜주는 기술입니다. 생산성, 객체와 관계형데이터베이스의 패러다임 불일치 문제 해결, 성능상 이점이 있어서 사용을 합니다. java에서는 ORM을 사용하기 위해 정의한 인터페이스인 JPA를 사용하고 JPA를 사용할 때는 필수적이고 반복적으로 사용되는 코드들을 편리하게 사용할 수 있도록 추상화 시켜놓은 Spring Data JPA를 사용합니다.

 

장점

- ORM은 sql에 종속적이지 않고 객체 중심에 프로그래밍 함으로써 생산성을 높여주고 dbms에 대한 종속성도 적어서 여러 db들에 대해서 프로그래밍 할 때 이점이 있습니다.

- 객체에서 클래스와 관계형 데이터베이스에서 테이블이 데이터를 표현하는 방식이 달라서 추가적인 코드 작성이 필요한데, ORM은 이런 반복적인 코드들을 줄여주는 역할을 해서 생산성을 높여줍니다.

- 한번 접근했던 데이터에 대해서 데이터베이스에 추가 접근 없이 영속성컨텍스트 내의 1차 캐시에서 조회함으로써 성능상 이점이 있습니다.

- 객체와 관계형DB의 패러다임 불일치 문제를 해결합니다. (상속, 연관관계, 객체그래프탐색, 비교)

https://jgrammer.tistory.com/m/76

 

단점

- 프로그램의 복잡성이 증가하면 구현이 어려워질 수 있는 것이 단점입니다.

 

 

JPA (Java Persistence API)

java에서 ORM 을 사용하기 위해 정의한 인터페이스입니다. 주로 JPA의 구현체인 Hibernate를 사용합니다.

개발자가 JPA를 사용하면 JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신을 합니다.

 

Hibernate

java에서 사용되는 ORM 프레임워크

 

Spring Data JPA

JPA를 사용할 때 필수적으로 반복적으로 사용되는 코드들을 편리하게 사용할 수 있게 추상화 시켜놓은 모듈입니다.

 

추상화

 - 공통적인 부분을 뽑아서 묶는 것을 의미합니다.

 - 추상화를 함으로써 한 곳에서 관리 되기 때문에 유지보수에 좋습니다.

 - 그리고 추상화한 인터페이스나 추상 클래스를 사용하여 추상 메서드의 구현을 강제할 수 있습니다.

 - 반면에 계층이 깊어질 수록 이해하기 어렵고 인터페이스 설계가 잘 못 된 경우 불필요한 메서드까지 구현을 해야하고 가지게 되는 것이 단점입니다.

 

추상클래스 vs 인터페이스

 추상 클래스 :  일반 클래스에서 상속을 통해 공통적인 부분을 정의하고 싶을 때 즉 클래스 간의 관계를 구축하는 것에 초점을 두고 사용합니다. 추상메서드가 하나라도 포함되면 추상클래스가 됩니다.  클래스기 때문에 단일 상속을 받아 사용합니다.

 

인터페이스 : 구현체가 같은 동작을 한다고 보장하는 용도로 사용됩니다. 인터페이스끼리 다중 상속을 할 수 있고 클래스에 다중 구현도 할 수 있습니다.

 

 

면접 시리즈2 - Spring & JPA (velog.io)

[면접준비] JPA (tistory.com)

[JPA]영속성 컨텍스트(1차 캐시) (velog.io)

https://ttl-blog.tistory.com/108

영속성컨텍스트 쓰기지연저장소 특징

영속성 컨텍스트에 대해서 설명해주세요

엔티티를 저장되는 환경을 의미합니다. JPA에서 엔티티메니저를 통해 쿼리를 날리면 해당 엔티티가 영속성 컨텍스트에 저장되고 트랜잭션이 끝날 때까지 관리됩니다. 영속성 컨텍스트를 사용하면 1차캐시, 쓰기지연으로 성능상 이점이 있습니다.

 - 1차캐시를 사용하여 같은 내용에 대한 조회 시 디비 접근 대신 사용할 수 있어서 성능을 향상 시킬 수 있습니다.

 - 영속성 컨텍스트에 엔티티에 대해서 작업을 하면 바로 디비에 적용되는게 아니라 쓰기 지연 sql 저장소에 쿼리를 모아놨다가 flush가 호출 되는 시점에 DB에 한번에 적용함으로써 DB 접근을 줄여줘서 성능을 향상 시킬 수 있습니다.

 - 추가적으로 영속성 컨텍스트의 스냅샷을 사용하여 더티체킹 기능을 사용할 수 있습니다.

 

영속성 컨텍스트에서 엔티티의 생명주기를 말씀해주세요.

 - 비영속 상태 : 영속성 컨텍스트와 관계가 없는 상태입니다. 객체를 생성하고 아무것도 하지 않으면 비영속 상태입니다.

Member m = new Member();

 - 영속 상태 : 영속성 컨텍스트에 저장된 상태입니다. JPA에서 쿼리를 날리면 영속성 컨텍스트에 저장됩니다.

memberRepository.save(member);

 - 준영속 상태 : 영속성 컨텍스트에 저장되었다가 분리된 상태입니다. 영속성 컨텍스트에 저장됐다가 해당 트랜잭션이 끝나면 분리가 되면서 준영속 상태가 됩니다.

 - 삭제 상태 : 삭제된 상태

 

변경 감지 (Dirty read)

변경 감지는 스냅샷과 변경 내요을 비교해서 만들 쿼리를 적용시키는 기술입니다.

이 때 스냅샷은 JPA에서 엔티티를 영속성 컨텍스트에 넣을 때 찍어둡니다.

그리고 트랜잭션이 종료됨에 따라 COMMIT() 메서드가 호출되고 COMMIT()에 의해 flush() 메서드가 호출되는데, flush()가 호출됐을 때 변경된 내용을 감지 하여 쓰기 지연 sql 저장소에 쿼리들을 저장하고 flush()가 끝나기 전에 DB에 SQL을 적용시키는 방식으로 동작합니다.

 

영속성 컨텍스트에 엔티티의 스냅샷을 언제 만드나요?

JPA로 데이터를 조회하면 영속성컨텍스트의 1차캐시에 데이터를 저장합니다. 이 때 영속성 컨텍스트에 들어온 시점의 엔티티에 대한 스냅샷을 만들어둡니다. 

 

 flush() 가 뭔가요?

영속성 컨텍스트의 변경사항을 데이터베이스에 동기화 시키는 것입니다.

flush()를 호출하면 영속성컨텍스트에서 스냅샷과 엔티티의 변경사항을 비교하여 sql을 만들어서 쓰기 지연 sql 저장소에 저장합니다. 그리고 commit할 때 쓰기지연 sql 저장소에서 쿼리들을 DB에 적용시킵니다.

flush는 entityManager.flush()로 직접 호출을 할 수도 있고 trasaction.commit()과 JPQL에 의해 자동 호출 될 수도 있습니다.

 

 

N+1

 

 

 

 

LazyInitializationExcpetion

JPA VS Mybatis

 

JPA 롤벡

JPA ManyToOne N+1 문제

OneTonMany 페이징 처리

 


DB

기본키, 외래키

- 기본키 : 테이블에서 각 레코들을 식별하기 위한 컬럼에 설정하는 키입니다. 기본키 컬럼은 NULL일 수 없고 중복된 값을 가질 수 없습니다.

- 외래키 : 테이블 간 참조관계를 만들기 위한 키입니다. 외래키 컬럼은 NULL이거나 참조하고 있는 테이블의 기본키 값만을 가질 수 있습니다.

 

데이터베이스 정규화

[Database] 정규화(Normalization) 쉽게 이해하기 - MangKyu's Diary (tistory.com)

- 정규화 : 데이터베이스 테이블에서 제약조건을 지키면서 중복된 데이터를 없애는 과정을 의미합니다.

- 제 1 정규화 : 하나의 컬럼은 하나의 값만 가지게 테이블을 분해하는 것 입니다.

- 제 2 정규화 : 제 1정규화가 적용된 테이블에서 완전함수종속을 만족하게 테이블을 분해하는 것 입니다. 완전 함수 종속이란 기본키가 복합키일 때 부분 키가 결정자가 되지 않게 하는 것을 의미합니다.

 

데이터베이스 정합성

데이터가 모순 없이 일관되게 유지되는 것을 의미합니다.

 

관계형 데이터 베이스의 무결성(Integrity)에 대해서 설명해주세요

무결성과 정합성이란 무엇인가? (velog.io)

[DB 데이터베이스] 무결성 제약조건 (Integrity Constraint) | Ingyung Blog (iingang.github.io)

무결성은 데이터베이스에 저장된 값과 현실세계의 실제 값이 일치하고 올바른 데이터를 저장하는 성질을 의미합니다.

그리고 이 무결성을 지키기 위해 부정확한 데이터가 데이터베이스에 저장되는 것을 방지하기 위해 데이터베이스에 제약조건을 설정하거나 어플리케이션단에서 처리를 할 수 있습니다. 

무결성 제약조건으로는 개체 무결성, 참조 무결성, 도메인 무결성, 키 무결성, NULL 무결성, 고유 무결성이 있습니다.

 

무결성 제약조건

개체 무결성 Entity integrity

  • 릴레이션의 기본키 컬럼은 Null값이나 중복값을 가질 수 없다는 조건입니다.

참조 무결성 Referential integrity

  • 릴레이션의 외래키 컬럼은 Null값이거나 참조하는 테이블의 기본키 값과 동일해야 한다는 조건입니다. 즉 참조할 수 있는 값만 외래키의 값으로 사용해야 합니다.

도메인 무결성 Domain integrity

  • 속성의 값은 정해진 도메인 속성 값에 포함되어야 합니다. 성별 컬럼이면 남,여만 올 수 있습니다.

키 무결성

  • 각 릴레이션은 최소한 하나의 키를 가져야 한다.

NULL 무결성

  • 속성에 NULL값을 가지지 않도록 not null 로 설정한 경우 null값을 가지면 안된다는 조건입니다. 예를 들어 사람 테이블에서 성별은 NULL을 가질 수 없습니다.

고유 무결성

  • 속성에 고유한 값을 가지도록 unique key로 설정한 경우 각 튜플이 갖는 속성값은 서로 달라야 한다는 조건입니다.

사용자 정의 무결성 ( 어플리케이션 단 처리)

  • 속성값들이 사용자가 정의한 제약조건에 만족해야 한다. 계좌 잔액은 0보다 커야 한다.

관계 무결성

  • 릴레이션에 어느 한 튜플의 삽입 가능 여부 또는, 한 릴레이션과 다른 릴레이션의 튜플들 사이의 관계에 대한 적절성 여부를 지정한 규정. -> 무슨 소리지???? 연관관계의 릴레이션들에 데이터를 넣을 때 연관관계에 알맞게 데이터를 넣아야 한다는 소린가? 예를 들면 

db 정규화, db 별 인덱스종류

 

트랜잭션에 대해서 설명해주세요

1.트랜잭션의 4대 특징, ACID — 어제보다 하나 더 (tistory.com)

어떤 작업을 처리할 때 데이터베이스에 적용되어야 할 작업들을 모아놓은 논리적인 작업 단위를 말합니다.

트랜잭션을 안정적으로 처리하기 위해서는 ACID 4가지 조건을 지켜야 합니다.

Atomic 원자성, Consistency일관성, Isolation 독립성, Durability 지속성 입니다.

Atomic 원자성

  • 원자성은 트랜잭션 내 작업들이 모두 성공하던가 모두 실패해야한다는 성질입니다. 트랜잭션 작업에서 한가지라도 실패하면 트랜잭션 내 작업들이 모두 실패해야 합니다.
  • 예를 들어 송금하는 과정에서 오류가 발생하여 내 계좌에서는 돈이 빠져나갔는데 상대방 계좌에는 돈이 입금 되지 않는다면 문제가 되기 때문에 원자성을 지켜서 송금 자체를 취소시킴으로써 더 큰 문제 발생을 방지할 수 있습니다.

Concistency 일관성

  • 일관성은 트랜잭션 작업이 성공적으로 완료했을 때 데이터베이스의 제약조건들이 작업 실행 전과 마찬가지로 일관성 있게 유지되어야 한다는 성질입니다.
  • 추가 수정 삭제 작업을 했을 때 데이터베이스에서 일관성을 보장해줌으로써 어플리케이션 단에서 잘못된 작업으로 인해 데이터베이스의 제약조건을 지키지 못 해서 무결성을 깨트릴 수 있는 상황을 방지할 수 있습니다.

Isolation 독립성, 격리성

  • 트랜잭션이 작업을 시작하면 다른 트랜잭션의 요청을 막음으로써 데이터가 꼬일 수 있는 것을 방지해주는 성질입니다.
  • 또한 트랜잭션 작업중 다른 트랜잭션에서 값이 변경된다 해도 처음 조회했던 값을 사용하게 하는 것을 말합니다.
  • 데이터베이스에서 isolation level 격리 레벨을 높이면 데이터의 안전성이 높아지고 동시에 처리할 수 있는 작업양은 적어집니다. 쇼핑몰이나 은행권같은 경우는 isolation level을 높여서 데이터의 안전성을 높여서 처리를 합니다. 반면에 iot 시스템은 isolation level을 낮춰서 동시에 처리할 수 있는 작업량을 늘릴 수 있습니다.

Durability 지속성

  • 트랜잭션 작업이 완료되어 데이터베이스에 반영되면 시스템에 오류가 발생하더라도 작업 결과는 지속적으로 유지되어야 한다는 성질입니다.
  • 로그를 통해서 지속성을 보장하는데, 어떻게 하는지는 추가 공부가 필요함.. DBMS는 어떻게 트랜잭션을 관리할까? (naver.com)

 

트랜잭션 격리 수준 Transacion Isolation level에 대해서 설명해주세요.

공부만이 살길이닷。 (zum.com)

Lock으로 이해하는 Transaction의 Isolation Level (suhwan.dev)

db에 접근시 제어하는 수준에 대한 정의입니다.

0단계 Read-Uncommitted (커밋되지 않은 읽기)

  • 커밋되지 않은 트랜잭션의 변경된 데이터를 다른 트랜잭션이 읽는 것을 허용하는 수준을 의미합니다.
  • Dirty Read, Non-Repeatable Read, Phantom Read 문제가 발생할 수 있습니다.

1단계 Read-Committed (커밋된 읽기)

  • 커밋이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회하는 것을 허용하는 수준을 의미합니다.
  • 커밋된 데이터에 의해 데이터가 달라져서 Non-Repeatable Read, Phantom Read가 발생할 수 있습니다.
  • oracle에서는 기본 격리 수준이 Read-Commited 입니다.

2단계 Repeatable Read (반복 가능한 읽기)

  • 커밋이 완료된 트랜잭션 내의 데이터만 읽을 수 있고 트랜잭션 내에서 같은 데이터를 반복 조회했을 때 항상 동일함을 보장하는 수준을 의미합니다. 하지만 범위로 조회했을 때에는 해당 범위에 데이터가 추가될 수는 있습니다.
  • 같은 트랜잭션 내에서 같은 데이터를 조회했을 때 다른 트랜잭션에서 수정 작업을 했어도 동일함을 보장하기 때문에 Non-Repeatable Read 문제는 발생하지 않지만 범위로 조회했을 때 그 범위에 데이터가 추가되어 Phantom Read가 발생할 수 있습니다.
  • Mysql, MariaDB에서는 기본 격리 수준이 Repeatable Read입니다.

3단계 Serializable (직렬화 가능)

  • 트랜잭션이 완료될 때 까지 다른 트랜잭션이 그 영역에 해당되는 데이터에 대한 수정 및 입력이 불가능한 격리수준입니다.
  • 가장 엄격한 격리 수준으로 가장 높은 데이터 정합성을 가지지만 동시성 처리 성능이 가장 안 좋습니다. 단순한 select 쿼리만 사용해도 테이블에 락이 걸립니다.
  • Dirty Read, Non-Repeatable Read, Phantom Read 가 모두 발생하지 않습니다.

트랜잭션 격리 수준에 따라 발생할 수 있는 문제점들을 말해보세요

Dirty Read (잘못된 읽기)

 - 커밋되지 않은 트랜잭션의 변경된 데이터를 읽을 수 있는 문제를 의미합니다. 커밋되지 않은 변경된 데이터를 읽었다가 변경된 트랜잭션에서 rollback을 하면 무효화된 데이터를 읽어서 처리하므로 문제가 발생됩니다.

Non-Repeatable Read (반복 불가능한 읽기)

 - 같은 트랜잭션 내에서 같은 데이터를 반복해서 읽어왔을 때 데이터가 달라지는 문제를 의미합니다.

Phatom Read(유령 읽기)

 - Non-Repeatable Read의 한 종류인데, 같은 트랜잭션 내에서 같은 범위의 데이터를 반복해서 읽어왔을 때 데이터가 없어지거나 새로 생기는 문제를 의미합니다.

 ex) select * from person where age>10;

 

트랜잭션에서 복구하는 방식 학습 해보자...

 

 

[Spring] Transaction 사용 방법 (tistory.com)

Spring - Transaction1 (스프링의 트랜잭션 지원) (tistory.com)

[Spring] Spring의 트랜잭션 관리 (feat: @Transactional) (tistory.com)

Spring DB : 트랜잭션 동기화 (tistory.com)

[Spring] AOP와 @Transactional의 동작 원리 (velog.io)

spring에서 transaction을 어떻게 처리하는지?

PlatformTractionManager을 사용해서 비지니스 로직에서 직접 처리하는 방법이 있고 @Transactional 어노테이션을 설정해서 처리하는 방법이 있습니다.

 PlatformTractionManager은 jdbc, jpa, hibernate, jta 등 다양한 디비 접근 방법에 따른 트랜잭션 메니저를 추상화 해놓은 것입니다.  추상화 한 이유는 각 디비 접근 기술에 따라서 트랜잭션 처리가 달라 구현하기가 어려운데, 결국 논리적으로는 같은 기능이기 때문에 추상화를 함으로써 사용하기 편하게 만든 것입니다. 비지니스 로직단에 직접 getTransaction(),commit(), rollback() 메서드를 사용해서 트랜잭션을 처리합니다.

 @Transactional 어노테이션는 선언적 트랜잭션 처리 방법이라고 불리고 spring에서는 주로 @Transactional 어노테이션을 사용해서 trasacion을 처리합니다. @Transacional을 적용하면 내부적으로 setAutoCommit(false)가 적용되고 메서드 종료 시 commit이 되고 예외 발생 시 rollback이 됩니다.

 

@Transactional을 사용하기 위한 어떤 설정이 필요한가요?

spring에서는 @EnableTransactionManagement 설정이 추가로 필요하지만

spring boot에서는TransactionAutoConfiguration 클래스를 통해서 @EnableTransactionManagement 어노테이이션이 자동 설정됩니다.

 

@Transactional의 역할은 어떤게 있을까요?

 첫번째로 트랜잭션 작업에서 예외가 발생했을 떄 rollback을 해줘서 트랜잭션의 원자성을 지킬 수 있습니다. 트랜잭션의 원자성을 트랜잭션 내 작업들이 모두 성공하거나 모두 실패해야한다는 성질입니다.

두번째로는 @Transactional을 설정하면 격리 수준에 따라서 동시성을 제어할 수 있습니다. 

 

 

@Transactional 동작 원리에 대해 설명해주세요.

@Transactional을 적용하면 Spring AOP 방식으로 동작합니다.

@Transactional을 적용하면 프록시 객체가 만들어지고 대상 target 메서드를 호출했을 때 aop proxy가 가로채서 프록시 객체가 대신 요청을 받습니다. 프록시 객체에서는 target 메서드를 호출하고  target 메서드가 완료됐으면 commit을 하고 에러 발생시 rollback을 하는 방식으로 동작합니다.

  •  프로시 객체는 트랜잭션 메서드가 속한 클래스 혹은 클래스의 상위 인터페이스를 상속하고 타겟 메서드를 오버라이딩 해서 실행시킵니다. 여기서 상위 인터페이스를 상속하는 경우 JdkDynamicProxy 클래스가 사용되고 클래스를 상속하는 경우는 CglibAopProxy 클래스가 사용됩니다. ( Code Generator Librery)  < --  spring aop의 2가지 방법
  •  프록시 객체에서 target 메서드를 호출하기 때문에 target메서드가 private 접근제어자로 설정된 경우 호출을 할 수 없기 때문에 접근 가능한 접근제어자를 설정해줘야 합니다.

 

@Transactional 어노테이션에서 부가적으로 설정할 수 있는 옵션에 대해서 설명해주세요.

1) propagation으로 전파 타입을 설정할 수 있습니다.

@Transactional(propagation=Propagation.REQUIRED)

 - default 전파타입

 - 진행중인 트랜잭션이 없다면 새 트랜잭션을 생성해서 실행하고, 진행 중인 트랜잭션이 있다면 합류해서 하나의 트랜잭션으로 실행합니다.

@Transactional(propagation=Propagation.REQUIRES_NEW)

 - 진행 중인 트랜잭션이 없다면 새 트랜잭션을 생성해서 실행하고, 진행 중인 트랜잭션이 있다면 해당 트랜잭션을 잠시 보류로 만들고 자신이 만든 트랜잭션을 실행합니다.

@Transactional(propagation=Propagation.SUPPORTS)

- 진행 중인 트랜잭션이 없다면 트랜잭션 없이 실행하고, 진행 중인 트랜잭션이 있다면 REQUIRED 처럼 해당 트랜잭션에 합류해서 하나의 트랜잭션으로 실행합니다.

@Transactional(propagation=Propagation.NOT_SUPPORTED) 

 - 진행 중인 트랜잭션이 없다면 트랜잭션 없이 진행하고, 진행 중인 트랜잭션이 있다면 해당 트랜잭션을 잠시 보류로 하고 트랜잭션 없이 실행합니다.

@Transactional(propagation=Propagation.MANDATORY)  의무적인

 - 진행 중인 트랜잭션이 없다면 예외가 발생하고, 진행 중인 트랜잭션이 있다면 합류해서 하나의 트랜잭션으로 실행합니다.

@Transactional(propagation=Propagation.NEVER)

 - 진행 중인 트랜잭션이 없다면 없이 진행하고, 진행 중인 트랜잭션이 있다면 예외를 발생시킵니다.

@Transactional(propagation=Propagation.NESTED) 중첩

 - 진행 중인 트랜잭션이 없다면 새로운 트랜잭션을 만들어 수행하고, 진행 중인 트랜잭션이 있다면 새로운 트랜잭션을 만들고 진행중인 트랜잭션 내에 삽입합니다.

 - 새로 만든 트랜잭션은 부모 트랜잭션의 커밋, 롤백에는 영향을 받지만 부모 트랜잭션은 새로 만든 트랜잭션의 커밋과 롤벡에는 영향을 받지 않습니다.

 

 

2) isonlation으로 격리 수준을 설정할 수 있습니다.

DEFAULT, READ_UNCOMMITED, READ-COMMITED, REPEATABLE_READ, SERIALIZABLE이 있습니다.

@Transacional(isolation = Isolaion.DEFAULT)

 

3) timeout 으로 정해진 시간이 지나면 예외가 발생하고 롤백되도록 설정할 수 있습니다. 

@Transactional(timeout = 10)

 

4) readOnly를 true로 설정하면  조회용 트랜잭션임을 명시해줄 수 있습니다.  또 JPA같은 경우 insert, update, delete 작업을 하면 sqlException이 발생합니다. 플러시를 강제로 하지 않는 이상 플러시가 동작하지 않습니다. 또한  읽기 전용이므로  더티체킹을 위한 스냅샷을 보관하지 않기 때문에 성능도 향상됩니다.

@Transacional(readOnly = true)

 

5) 기본적으로 @Transactional은 error와 RuntimeExcpetion이 발생했을 때만 rollback 하는데,

rollbackFor로 rollback 예외 처리 대상을 설정할 수 있고 noRollbackFor로 예외 처리 제외 대상을 설정할 수 있습니다.

@Transactional(rollbackFor=NoSuchElementException.class)

@Transactional(noRollbackFor={IOException.class,SqlException.class})

 

 


운영체제

추가 정리 필요..

 

[면접총정리] 신입 개발자 인터뷰 대비 총정리 자료 - ⑤ 운영체제 — 🐛 HOON DEVLog (tistory.com)

 

OS (Operating System, 운영체제)

 운영체제는 하드웨어 자원을 관리하고, 응용 프로그램과 하드웨어 사이에서 상호작용을 하는 시스템을 의미합니다.

 

 

데드락 (DeadLock, 교착상태)

두개 이상의 프로세스나 스레드가 자원을 점유한 상태에서 다음 작업에서 서로 상대방의 자원을 사용하려고 무한정 대기하고 있는 상황을 의미합니다.

그리고 데드락은 상호 배제, 점유대기, 비선점, 순환대기가 모두 성립 될때만 발생합니다.

  • 호 배제(Mutual exclusion) : 한번에 한 프로세스(or 쓰레드)만 자원을 사용할 수 있어야 한다는 뜻 입니다.
  • 유 대기(Hold and wait) : 최소한 하나의 자원을 점유하고 있고 다음 작업에서 다른 프로세스에서 사용하고 있는 자원을 사용하기 위해 대기하고 있는 프로세스가 존재해야 한다는 뜻 입니다.
  • 선점(No preemption) : 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 가져올 수 없어야 한다는 뜻 입니다.
  • 환 대기(Circular wait) : 프로세스의 집합에서 순환 형태로 자원을 점유하려고 대기하는 상태여야 한다는 뜻 입니다.

데드락 해결하기 위해서는 기본적으로 데드락의 조건 4가지에서 하나라도 제거하면 막을 수 있습니다.

그러나 

그래서 해결 방법은 크게 예방하는 방법 회피하는 방법, 탐지해서 복구하는 방법이 있습니다.

 

  • 예방(Prevention)
    • 데드락이 발생하지 않도록 4가지 조건에서 하나를 제거함으로써 예방하는 방법을 사용할 수 있습니다.
    • 이 때 상호 배제 조건을 제거하면 경쟁상태가 될 수 있기 때문에 유지해야 합니다.
    • 예방 방식은 ............ 로 인해 자원 낭비가 심합니다.
  • 데드락 발생 가능성을 인정하고 적절하게 피(Avodance)하는 방법
  • 데드락 발생을 허용하나 데드락을 지(Detection)하여 구(Recovery)하는 방법

 

경쟁 상태 (Race Condition)

(10) 경쟁 상태 ( Race Condition ) :: 코르시카's Blog (tistory.com)

여러 개의 프로세스가 공유 자원에 동시에 접근할 때 실행 순서에 따라 결과가 달라질 수 있는 현상입니다.

경쟁상태는 3가지 문제에 직면하게 됩니다. 상호 배제(Mutual exclusion), 교착 상태(Deadlock), 기아 상태(Starvation)

이 문제들을 해결하기 위해 쓰레드를 순차적으로 실행시켜서 동기화를 함으로써 해결할 수 있습니다.

구체적으로는 Semaphore, Mutex 방법으로 해결합니다.

 

 


Network

OSI 7계층

OSI 7계층이란? - OSI 계층별 특징, TCP/IP 4계층 (tistory.com)

OSI 7계층은 네트워크 통신이 일어나는 과정을 7개의 계층으로 국제 표준 기구에서 정의해놓은 것을 말합니다.

1계층 물리 계층부터 ~ 7계층 응용계층으로 구성되어있습니다.

 

용 계층에서 사용자가 브라우저나 응용프로그램을 통해서 서비스를 수행합니다. HTTP, FTP 같은 프로토콜로 데이터를 보냅니다.

현 계층에서는 보내진 데이터에 대해서 암호화, 인코딩 같은 작업을 처리합니다.

션 계층에서는 양 끝단이 통신이 가능하도록 통신세션을 구성합니다.

송 계층에서는 TCP나 UDP 프로토콜로 데이터를 송수신합니다.

트워크 계층에서는 IP 주소를 정하고 라우터로 라우팅을 해서 전송할 경로를 찾고, 포워딩 통해 네트워크 패킷을 전달합니다.

이터 계층에서는 MAC주소를 이용해 스위치로 패킷을 전달합니다.

리 계층에서는 통신 케이블을 통해 데이터를 전기신호로 전달합니다.

 

 

웹 브라우저의 동작 흐름

브라우저에서 사용자가 작업을 수행하면 DNS 서버로 Domain Name을 보내서 해당하는 ip주소를 받아옵니다.

그리고 부라우저는 http 메세지를 만들고 받아온 ip 주소를 이용해서 tcp프로토콜에 의해 3-way handshaking으로 통신할 서버와 연결을합니다. 그리고 ip 주소를 이용해 라우터로 경로를 찾고 mac주소를 이용해 스위치로 패킷을 전송합니다. 그렇게 서버로 데이터가 전달되면 서버에서 http메세지를 분석해서 작업을 처리하고 다시 http 응답 메세지를 반환합니다.

거꾸로 브라우저까지 전달이 되면 브라우저에서 렌더링을 해서 화면을 보여줍니다.

 

HTTP vs HTTPS

우선 HTTP는 웹 환경에서 서버와 클라이언트간에 데이터를 주고 받기 위해 사용되는 프로토콜입니다. TCP/IP 방식으로 통신을 합니다.

HTTPS는 HTTP 프로토콜에서 보안을 강화한 프로토콜입니다. SSL 인증서를 통해서 테이터를 암호화 해서 송수신 함으로써 데이터를 탈취 당하더라도 복호화 할 수 없게 한 방식으로 보안을 강호하였습니다.

 

SSL 인증서  사용 방식

HTTPS, SSL 인증서: 아주 쉽고 간단하면서도, 매우 상세한 정리. (tistory.com)

CA 공인 기관에서 SSL인증서를 발급 받은 다음(내 서버의 공개키가 SSL 인증서 내부에 저장됨) 내 서버에 저장해두고 SSL 방식으로 통신하도록 설정을 함으로써 HTTPS로 동작시킬 수 있습니다.

 

정보 전달 방식 중 GET과 POST의 차이점은 무엇인가요?

GET 방식은 정보 조회를 위한 목적으로 사용하고, 보통 URL에 parameter를 포함시켜 요청하는 방식을 사용합니다.

따라서 파라미터의 길이에 제한이 있고 URL에 다 노출 되기 때문에 보안적으로 취약합니다. HTTP 헤더에 요청 파라미터를 담을 수도 있습니다.

POST 방식은 보안적으로 좀 더 안전하게 처리 위한 목적으로 사용됩니다. HTTP BODY에 요청 파라미터를 담아서 요청합니다. BODY에 담기 때문에 길이의 제한이 없습니다. 보안적인 강화를 위해 암호화를 해서 BODY에 담을 수도 있습니다.

 

HTTP 메서드 종류

GET 조회

POST 추가

PUT 리소스가 없으면 추가하고 있으면 수정

FETCH  일부수정

DELETE 삭제

TRACE : 요청했던 패킷  내용과 응답 받은 요청패킷 내용을 비교하여 변조 유무를 확인하는 데 사용 ( 클라이언트 요청 패킷이 요청이 방화벽, PROXY 서버를 거치면서 변조 될 수 있음)OPTION : 안전한 요청인지 검사할 때 사용을 합니다. 지원 가능한 HTTP 메서드를 응답 받을 수 있고 CORS 정책을 검사하기 위해서 사용합니다.

 

06. 기술면접 - 네트워크 - 쿠키, 세션, 로컬 스토리지, 세션 스토리지 (tistory.com)

HTTP

웹환경에서 서버와 클라이언트간에 데이터를 주고받을 수 있는 프로토콜

 

HTTP 특징

stateless : http 통신이 끝나면 상태를 보존 하지 않습니다.

connectionless (비연결성) : 클라이언트가 요청을 해서 서버로부터 응답을 받아면 연결을 끊고 유지 하지 않습니다. 그래서 매번 요청시마다 연결을 해줘야 합니다. 따라서 클라이언트의 매 요청에 대해서 서버 단에서 인증이 필요한 경우에도 매 요청마다 인증을 하게 됩니다.

이를 해결하기 위해 서버의 session단에 인증정보를 저장하고 cookie로 session id를 담아서 header를 통해 클라이언트에게 발급한 다음 클라이언트가 매 요청마다 session-id를 cookie에 담아서 header를 통해 그래로 요청하도록 하였습니다.

 

cookie

클라이언트 즉 브라우저에 저장되는 데이터입니다. 핑몰의 장바구니 기능에 사용됩니다.

session

서버 측에 저장하는 정보이고 서버에 접속한 정보를 유지하는 기술입니다. 로그인 기능에 사용됩니다.

서버의 메모리에 인증데이터를 저장하기 때문에 서버를 스케일 아웃하는 경우 각 서버들이 세션을 공유할 수 있게 별도 처리가 필요하다는 단점이 있습니다.

JWT를 사용하게 되면 인증데이터를 클라이언트에게 발급하므로 서버 스케일 아웃을 하더라도 별도 처리가 필요 없습니다. 대신에 인증정보가 클라이언트에 존재하게 되므로 SESSION 방식을 사용할 때보다 인증정보를 탈취당할 위험도가 크다는 단점이 있습니다.

 

JWT (JSON Web Token)가 뭔가요?

JSON 객체를 사용해서 안전하게 전송하기 위해 사용되는 개방형 표준입니다. 인증 및 인가, 정보 교류에 사용됩니다.

JWT에서 Header와 Payload가 json 구조로 되어있습니다.

사용자가 로그인을 하면 서버에서 JWT을 발급해줘서 사용자의 매 요청마다 JWT를 포함시켜서 JWT가 유효하고 인증됐는지를 검사하고 요청에 대해서 사용자에게 권한이 있는지 확인합니다.

 

JWT 특징, 장단점

JWT는 인증 정보를 서버에 저장하지 않기 때문에 서버에 대한 부담을 줄일 수 있습니다.

세션 방식과 비교했을 때 세션은 서버에서 인증정보를  관리하기 때문에 서버가 스케일 아웃 됐을 때 세션 정보에 대한 처리가 필요한데 JWT는 인증 정보를 서버에서 저장하지 않기 때문에 부담을 줄일 수 있습니다.

하지만 클라이언트 측에서 인증정보를 저장하는 것이기 때문에 인증정보를 탈취 당할 위험성이 있어서 보안에 취약하다는 단점이 있습니다.

 

JWT 구조는?

헤더(Header), 페이로드(PayLoad), 서명(Signature)가 base64로 인코딩 돼서 표현됩니다. 각각은 .으로 구분되어있습니다.

헤더에는 토큰의 타입과 사용된 알고리즘을 포함합니다.

페이로드에는 추가적인 정보인 클레임이 포함됩니다.

서명에는 헤더와 페이로드를 이용해서 암호화 한 값이 들어있습니다. 토큰을 검증할 때 사용하는 값입니다.

 

서명에서 사용하는 암호화 방식

base64로 각각 인코딩한 헤더와 페이로드를 헤더에서 정의한 알고리즘으로 헤싱한다음 base64로 인코딩하는 방식입니다.

 

 

CORS (Cross Origin Resource Sharing)

다른 출처와 자원을 공유하기 위한 정책입니다. 원래라면 SOP에 의해 막히게 될 요청을 풀어준 정책입니다.

 

SOP(Same Origin Policy)

같은 출처끼리만 자원을 공유하는 정책입니다. 특정 출처에서 받은 자원을 가지고 다른 출처로 요청을 보내지 못합니다.

XSS나 CSRF 공격을 막기 위해 필요합니다.

 

XSS(Cross-Site Scripting)

웹 사이트에 스크립트를 삽입해서 사용자가 실행시키면 다른 사이트로 쿠키, 인증정보가 뺴돌려지는 공격 방법입니다.

클라이언트에 담겨있는 인증정보를 빼돌리는 방법입니다. 쿠키에 httpOnly를 설정해서 자바스크립트로 쿠키를 조회하지 못하게 해서 막을 수 있는 방법이 있습니다.

예를 들어 스크립트가 포함된 게시글을 추가해서 사용자가 그 글을 읽었을 때 스크립트가 실행돼서 인증정보를 가지고 다른 사이트로 요청함.

쿠키에 httpOnly를 설정해서 자바스크립트로 쿠키를 조회할 수 없게 해서 XSS 공격을 막을 수 있습니다.

 

CSRF(Cross-Site Request Forgery, 교차 사이트 요청 위조)

다른 사이트에서 인증된 사용자에게 계정 정보 조회, 패스워드 변경과 같이 헤커가 의도한 행동을 해당 사이트에 요청하도록 유도하는 해킹 방법입니다. 쿠키에 sameSite를 Strict로 요청해서 동일한 사이트에서 온 요청에만 쿠키를 담아서 요청 가능하게 제한 함으로써 CSRF를 막을 수 있는 방법이 있습니다.

 예를 들어 인증된 사용자가 헤커 사이트에 접속했을 때 인증된 정보를 이용해서 해당 사이트로 헤커가 의도한 API 요청을 보냅니다.

 

쿠키, 헤더에 보안처리

SameSite 쿠키에 따른 CSRF 오류 대응 - 라떼군 이야기 (mrlatte.net)

쿠키에 sameSite를 Strict로 설정해서 다른 사이트로 쿠키를 전송하지 못하게 해서 CSRF 교차 사이트 요청 위조를 막을 수 있습니다.

쿠키에 secure를 설정해서  https가 적용된 요청에만 쿠키를 담아서 요청할 수 있게 할 수 있습니다.

쿠키에 httpOnly를 설정해서 자바스크립트로 쿠키를 조회할 수 없게 해서 XSS 공격을 막을 수 있습니다.

 

헤더에 X-XSS-Protection을 1로 설정해서 XSS filter를 동작시킴으로써 XSS 공격을 막을 수 있습니다.

헤더에 X-Frame-Options를 sameOrigin으로 설정해서 같은 사이트의 frame만 호출 가능하게 함으로써 클릭재킹을 막을 수 있습니다.

헤더에 content-type을 설정하고 Content-Type-Options를 nosniff로 설정해서 설정해놓은 mime type 이외 것은 해석하지 않게 할 수 있습니다.


Infra

일반인을 위한 클라우드 용어 해설 IaaS, PaaS, SaaS 차이와 의미 (tistory.com)

이 영상만 보셔도 서버 클라우드 IT 인프라 흐름이 보입니다. 클라우드 서버 서버리스 serverless - YouTube

클라우드 컴퓨팅, IaaS, PaaS, SaaS이란? (wnsgml972.github.io)

클라우드 컴퓨팅 : 클라우드로 서비스를 제공하는 것

클라우드 컴퓨팅 종류 (클라우드를 이용해서 어떤 방식으로 서비스를 제공하는지)

IAAS (Infra as a service)

 

PAAS : 

SAAS : 

 

 


ETC

REST API는 클라이언트와 서버간의 HTTP 프로토콜로 통신을 하는 API인데, 이 때 자원을 URL로 표현하고 상태를 HTTP Method로 정의해서하고 작업을 수행합니다.

Reprentational State Transper API

 

API란 어플로케이션들이 상호작용하는 인터페이스로 데이터를 공유하고 기능을 호출할 수 있게 합니다.

Application Programming Interface

 

 

캐시 (tistory.com)

캐시란?

캐시는 자주 사용되는 데이터를 저장하는 임시 저장공간

 

캐시를 사용하는 이유?

데이터베이스에서 데이터를 조회하는 것보다 캐시에서 데이터를 조회하는 게 빠르기 때문에 어플리케이션 성능을 높이기 위해 사용합니다.

 

어떤 캐시 기술이 적합한지?

캐시는 크게 로컬캐시와 글로벌 캐시로 나눠지는, 각 서버 환경 캐시의 사용 목적에 따라서 적절한 캐시 기술을 사용해야 합니다.

로컬 캐시는 서버 내에서 동작을 하기 때문에 속도가 빠르고 단일 서버 구조인 경우에 적합합니다. 대신에 캐시 용량이 로컬 서버에 의존적이라는 단점이 있습니다. 또한 서버를 재시작하는 경우 데이터가 유지 되지 않는 다는 특징도 있습니다.

글로벌 캐시는 서버 외부에서 동작하기 때문에 로컬 캐시에 비해 속도가 느리고 멀티 서버 환경인 경우에 로컬 캐시 서버처럼 별도 동기화 작업이 필요 없이 때문에 더 적합합니다. 그리고 캐시 용량에 따라서 별도 비용이 발생합니다.

 

ehcache에 대해서 설명해주세요.

ehcache는 spring에서 간단하게 사용할 수 있는 자바 기반의 오픈소스 캐시 라이브러리 입니다.

그리고 서버 내에서 동작하는 로컬 케시입니다.

멀티서버에서는 teracotta를 분산캐시서버로 설정해서 각 캐시의 변경사항을 분산캐시를 통해서 동기화 시키도록 할 수 있습니다. 그렇지만 대규모 멀티 서버 환경인 경우 동기화 작업으로 인해 성능 저하가 생길 수 있어서 redis나 memcached 같은 글로벌 캐시를 사용하는 것이 적절합니다.

 

 redis에 대해서 설명해주세요.

글로벌 캐시이고 key-value 형태로 데이터를 저장하는데, value에 다양한 형태의 데이터를 저장할 수 있습니다.

싱글 쓰레드로 동작하고 publish-subscribe 기능, lock 기능을 지원합니다.

싱글 쓰레드이기 때문에 속도가 오래 걸리는 작업에 의해 병목현상이 발생할 수 있습니다.

서버에서 redis로 구독을 해놓고 redis에서 구독 서버로 발행해주는 기능입니다. 

구독 발행 기능을 통해 lock 기능으로 사용해서 동시성 처리를 할 수 있습니다.

 

 

redis 캐시 전략

레이지 로딩(Lazy Loading)

- 데이터를 조회할 때 캐시에서 먼저 데이터를 조회하고 캐시 미스가 났을 때만 디비에서 데이터를 조회해서  캐시에 갱신하고 조회해오는 전략입니다.

- 요청 받은 데이터에 대해서만 캐시에 저장하기 때문에 자주 사용되지 않는 데이터가 캐시에 저장되지 않는 다는 관점에서 좋은 캐시 전략입니다.

- 캐시미스가 발생했을 때 디비에서 가져오기 때문에 사용자가 정상적으로 데이터를 확인할 수 있는 건 장점이지만 디비에서 다시 조회해와서 캐시에 데이터를 저장하는 동작으로 인해 성능이 안 좋습니다.

- 캐시미스가 났을 때만 갱신을 하기 때문에 캐시에는 최신 데이터가 아닐 수 있기 때문에 사용자가 캐시에서 데이터를 조회했을 때 최신 데이터가 아닐 수 있습니다.

 

Write-Through 전략

라이트 쓰롯 전략은 데이터를 추가하거나 업데이트 할 때 db와 캐시에 모두 업데이트 하는 전략입니다.

데이터를 읽을 때 캐시만 읽으면 됩니다.

장점으로는 조회 데이터가 항상 최신 데이터를 유지합니다.

단점으로는 갱신할 때마다 캐시, 디비에 모두 작업을 하니까 쓰기 작업이 많은 시스템이면 성능상 안 좋습니다.

자주 사용되지 않는 데이터에 대해서도 캐시와 디비에 모두 저장하기 때문에 캐시 리소스가 낭비됩니다.

이 때 캐시 만료시간(Time To LIve) 을 줘서 사용 안 되는 캐시는 삭제 시켜서 보완 할 수 있습니다.


스칼라 서브 쿼리 vs left outer join

스칼라 서브 쿼리는 캐싱 기능이 있어서 입력값이 같은 경우에는 속도가 빠르게 처리가 됩니다. 하지만 데이터 양이 많고 조건도 달라지는 경우에는 index를 추가해서 join을 사용하는 경우에 속도가 더 빨라질 수 있습니다.

 

복합 인덱스 주의 사항

1. order by나 group by가 사용된 쿼리인 경우 재배열 되지 않도록 order by, group by의 컬럼 순서와 같은 순서로 복합 인덱스를 구성해야합니다.

2. 그 다음 카디널리티가 높은 순서 즉 중복된 값이 적은 컬럼 순서로 구성하는게 성능에 더 좋을 수 있습니다.

3. 어디까지나 일반적인 것이고 테이블의 데이터 구조나 양, 조회 방식에 따라서 구성을 다르게 해야 합니다.

 

인덱스 추가

슬로우 쿼리에서 우선 불필요하게 조회되고 있는 컬럼을 제거를 했습니다. 쿼리 실행 계획을 확인해봤을 때 크게 이상 있는 부분이 안 보였고 type이 ref이긴 한데,  데이터 양이 많은 테이블이 문제가 될 거라고 예상해서 스칼라 서브쿼리에서 조회하고 있는 테이블에 조건문을 보고 순서에 맞게 복합 인덱스를 추가했습니다.

그리고 서브 쿼리를 join으로 변경해서 0.5초 미만 걸리도록 개선하였습니다.

 

type

index - index를 처음부터 끝까지 다 읽은 경우라 성능이 안 좋음

all - 모든 데이터를 full scan 한거라 성능이 최고로 안 좋음

 

 

@Acync 어노테이션 사용 시 주의 사항

public이 설정된 메서드에만 사용 가능합니다.

그리고 @Async 어노테이션이 설정된 메서드는 다른 클래스에서 호출해야지만 동작합니다.

@Async를 사용하는 경우 다른 쓰레드에서 동작하는 것이기 때문에 별도로 예외 처리를 해주어야 합니다.

AsyncUncaughtExceptionHandler 

futrue를 리턴 타입으로 둬서  처리해야 됨

 

@Acync 어노테이션을 사용하기 위해 필요한 설정

@EnableAsync 어노테이션을 설정한 클래스에서 Excutor빈을 만들고 이 때 쓰레드 풀을 같이 설정해준 다음 @Async 어노테이션을 사용해야 합니다.

( @Confuguriation 어노테이션과 @Bean 어노테이션을 이용)

 

 


동시성 처리

spring boot 서버에서 redisson 을 사용하면 구독 발행 기능을 사용할 수 있습니다.

먼저 redis로부터 lock을 점유(trylock)하고 작업을 수행합니다. 그 다음 작업이 다 끝나면 redis로 lock 해제(unlock)을 하면 redis에서 구독중인 쓰레드로 발행을 해서 다음 쓰레드가 lock을 점유해와서 작업을 처리하는 식으로 동시성 처리를 하였습니다.

 

동시성 처리에서 db의 낙관적 lock 비관적 lock 

자원 요청에 동시성 문제가 발생할 걸 예상하고 비관적(pessmistic) lock을 사용할 수 있습니다.

 

비관적 lock은 데이터에 lock을 가진 스레드만 접근 가능하게 하는 방법입니다. 동시성을 안전하게 처리할 수 있지만 성능이 안좋고 쓰레드가 서로 자원을 필요로 하는 상황에 빠져서 dead lcok이 걸릴 수 있습니다.

 

낙관적optimistic lockd은 먼저 데이터를 조회한 후 데이터를 갱신하려고 할 때 내가 조회한 데이터가 맞는지 버전을 확인해서 버전이 다르면 다시 조회를 해서 처리하는 방식입니다.

별도의 lock을 걸지 않기 때문에 성능은 좋을 수 있지만 충돌이 일어났을 때 재시도 로직이 필요하고 이로 인해 빈번 충돌인 경우 성능이 비관적 락보다 더 안 좋아질 수 있습니다.

 

동시성 처리에서 db의 낙관적 lock 비관적 lock 대신 redis를 사용하는 이유

디비에서 lock 처리를 하는 경우 성능저하와 데드락이 발생할 수 있습니다. 또한 dbms에 의존도가 높아져서 서비스 간에 디비를 따로 사용하고 있는 경우 각 서버 간의 의존도가 높아질 수 있습니다. 그래서 lock을 처리하면 성능상 이점과 데드락 방지 디비간 의존도를 피하기 위해 redis를 사용합니다.


디자인 패턴

[Spring]스프링 프레임워크 디자인 패턴 : 네이버 블로그 (naver.com)

💠 팩토리 메서드(Factory Method) 패턴 - 완벽 마스터하기 (tistory.com)

 

싱글톤 패턴

하나의 클래스에 하나의 인스턴스만 가지는 패턴입니다.

스프링 컨테이너가 스프링 빈을 생성할 때 싱글톤으로 생성합니다.

 

팩토리 메서드 패턴

객체 생성을 하위 클래스에서 처리하도록 캡슐화 한 패턴입니다. 스프링에서 BeanFactory 인터페이스가 팩토리 메서드 패턴으로 사용됩니다.

 

템플릿 메서드 패턴

공통적인 기능은 상위 추상 클래스에서 구현해놓고 따로 구현이 필요한 기능은 추상메서드로 둬서 하위 클래스에서 구현을 하는 패턴입니다.

스프링에서 WebMvcConfigurer 인터페이스를 구현할 때 템플릿 메서드 패턴으로 사용하고 싶은 메서드에 대해서만 구현을 하게 됩니다. 

ex ) addViewController 함수를 사용해서 특정 url에 대한 redirect url을 설정할 수 있습니다.

 

프록시 패턴

프록시 객체를 만들어서 실제 대생에 요청이 왔을 때 프록시 객체가 요청을 대신 받아서 전처리를 한 후에 대상 객체가 동작하게 하는 패턴입니다. 스프링 aop가 프록시 패턴을 사용해서 동작합니다.

 

mvc 패턴

controller를 통해 요청을 받고 로직을 처리한 후에 model에 담아 결과를 반환하고 view를 통해서 화면을 보여주는 패턴입니다.

 

 

Spring Batch vs Quartz

Spring Batch는 일괄 작업을 처리할 때 작업에 대한 트랜잭션을 관리하고 그 작업이 실패한 경우 재시작 하는 등의 job을 관리하려고 사용하는 프레임 워크입니다.

Quartz는 작업을 일정한 주기마다 실행시킬 수 있는 스케줄링 기능이 있는 기술입니다.

 


 

OAuth (Open standard of Authorization)

 - 특정 플랫폼에서 다른 서비스에 인증정보를 공유하지 않고도 정보에 접근할 수 있는 권한을 제공해주기 위해 사용되는 개방형 표준(프로토콜)을 의미합니다.

OAuth2 인증 방식에 대해 알아보자. (velog.io)

1. 클라이언트 측에서 사이트 주소를 정보를 제공해주는 플랫폼에 등록합니다. 이 때 redirect URL도 등록하고 client id, cleint secret을 발급 받습니다. 그리고 부여받을 권한에 대한 범위도 설정합니다.

2. 사용자(리소스 오너) 측에서 클라이언트 화면 상에서 리소스 서버로 로그인을 요청합니다. 이 때 요청에는 rediredct URL, client id, 제공 받는 권한에 대한 범위 scope값을 포함시킵니다.

3. 리소스 서버 측에서 정보를 확인한 후에 제공할 권한에 대해서 허용을 할건지 사용자에게 확인을 받습니다.

4. 사용자가 정보 제공 권한에 대해서 허용을 합니다.

5. 그러면 리소스 서버가 Authorization code를 응답합니다.

6. redirect URL을 통해 클라이언트의 서버가 응답을 받고 다시 리소스 서버로 Access token을 요청합니다. 이 때 client id, client secret, Authorization code를 요청에 포함 시킵니다.

7. 리소스 서버가 Access Token, Refresh Token을 응답합니다.

8. 그러면  클라이언트에서 Access Token을 가지고 리소스 서버에 정보를 요청합니다.

9. 클라이언트가 리소스 서버로부터 정보를 받아오면 사용자에게 로그인 성공을 응답합니다.

이 때, Access Token을 쿠키에 저장합니다.

10. 이 후에는 사용자가 Access Token을 가지고 클라이언트의 서버에 요청하면 서버에서 Access Token을 가지고 리소스 서버로 요청해서 자원을 받아옵니다.

 

인증 vs 인가

인증 : 사용자를 식별하는 것입니다.  사용자가 로그인을 하면 서버측에서 인증하여 사용자를 식별할 수 있습니다.

인가 : 사용자가 자원에 접근할 수 있도록 허용하는 것 입니다. 사용자가 특정 요청을 하거나 특정 자원에 접근하려고 서버로 요청을 보냈을 때 서버가 접근 권한을 확인하여 허용해줍니다.

 

 

spring security

디자인 패턴

알고리즘

Ehcache

캐전략

비동기 동작 async

멀티스레드 처리에서 DB에 데드락 처리

추가1

추가2

 

 

'programming study > CS -기타 cs' 카테고리의 다른 글

개발 메모  (0) 2024.07.12