1. 도커 네트워크란 무엇이고, 종류로 무엇이 있는지?

🐳도커 네트워크란?

docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능을 제공하는 것

 

docker는 컨테이너화된 애플리케이션을 배포하고 관리하는 데 사용되는 오픈 소스 플랫폼이다. 이러한 컨테이너는 격리된 환경에서 실행되며, 이는 각 컨테이너가 자체 네트워크 인터페이스와 IP  주소를 가질 수 있음을 의미한다. 

컨테이너화된 애플리케이션은 여러 개의 컨테이너로 구성될 수 있는데, 이들 컨테이너가 서로 통신하고 데이터를 주고받아야 할 경우 도커 네트워크를 통해 이러한 통신을 쉽게 설정하고 관리할 수 있도록 도와준다. 컨테이너 간의 통신, 호스트와 컨테이너 간의 통신, 외부 네트워크와의 통신을 가능하게 한다.

 

 

🐳도커 네트워크의 종류

  • bridge 네트워크
    • 기본 네트워크 드라이브, 도커가 자동으로 생성하는 기본 네트워크
    • 동일한 호스트 내에서 네트워크 설정
    • 동일 호스트 내의 컨테이너 간 통신 또는 호스트와 컨테이너 간의 통신에 사용된다.
  • host 네트워크
    • 호스트의 네트워킹을 직접 사용하여 컨테이너 간의 네크워크 격리 제거
    • 호스트에서 제공하는 IP를 직접 할당하여 사용할 수 있다.
    • 컨테이너가 호스트의 네트워크 리소스에 직접 접근할 수 있기 때문에 보안 문제가 발생할 수 있다.
    • 네트워크 격리가 필요하지 않은 경우에 유용하다.
  • none 네트워크
    • 네트워크 연결이 없는 상태로 컨테이너를 실행한다.
    • 완전히 독립적인 환경을 원할 때 사용한다.
  • overlay 네트워크
    • 여러 도커 데몬을 연결하고, Docker Swarm 서비스와 컨테이너 간에 노드 간 통신을 가능하게 한다.
    • Swarm 모드에서 작동하며, 여러 호스트에 걸쳐 있는 컨테이너 간에 통신할 수 있도록 한다.

2. IoC vs DI

🌸Spring이란?

자바 언어로 엔터프라이즈급 개발을 편리하게 만들어주는 오픈소스 경량급 애플리케이션 프레임워크로, 애플리케이션 개발에 필요한 기반을 제공해서 개발자가 비즈니스 로직 구현에만 집중할 수 있도록 하는 것

 

🍔IoC(Inversion of Control) : 제어의 역전

사용할 객체를 직접 사용하지 않고, 객체의 생명주기 관리를 외부(스프링 컨테이너)에 위임하는 것

 

제어의 역전을 통해 의존성 주입, 관점 지향 프로그래밍이 가능해진다. 이에 따라 개발자는 객체의 제어권을 컨테이너로 넘기고 객체의 생명 주기 관리 등의 복잡한 요소들을 신경 쓰지 않고, 비즈니스 로직에만 집중할 수 있게 된다.

 

🍟DI(Dependency Injection) : 의존관계 주입

제어 역전의 방법 중 하나로, 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식

 

롬복을 이용한 생성자 주입이 가장 좋은 의존성 주입 방법이다.

롬복의 @RequiredArgsConstructor 어노테이션은 final이 붙은 필드의 생성자를 자동으로 생성해 준다.

@RestController
@RequiredArgsConstructor
public class DIController {

    privite final MyService myService;
    
	//Controller Codes
}

 

3. Doker vs 가상머신

💻가상머신

  • 가상머신은 하이퍼바이저가 호스트 OS 위에서 여러 게스트 OS를 실행한다.
  • 각 VM은 자체 운영체제를 포함하며, 그 위에 애플리케이션이 실행된다.
  • VM은 하드웨어 수준에서 가상화되며 각각 독립된 운영체제를 가진다.

🐳Docker

  • 호스트 OS의 커널을 공유하며 컨테이너는 사용자 공간에서 독립된 환경을 제공한다.
  • 컨테이너는 OS 레벨에서 가상화되며 독립된 파일 시스템, 네트워크 인터페이스를 가진다.
  • 각 컨테이너는 애플리케이션과 그 종속성만을 포함한다.

4. Docker File vs Docker Image vs Docker Container

💚Docker File

서버 운영 기록을 코드화한 것

💛Docker Image

운영 기록을 실행할 시점

💙Docker Container

이미지에 실행 시점에 수정되어야 할 정보들을 더한 것

이미지를 실행해서 만들어지는 결과물 

'공부 > f-lab' 카테고리의 다른 글

f-lab 14주차  (0) 2024.06.18
f-lab 11주차  (0) 2024.05.28
f-lab 10주차  (0) 2024.05.23
f-lab 9주차  (0) 2024.05.19
f-lab 8주차  (0) 2024.05.07

1. JDBC가 어댑터 패턴을 어떻게 적용하고 있는지?

JDBC에서 데이터베이스 드라이버가 어댑터 패턴을 사용하여 구현되는데, 각 데이터베이스 벤더는 JDBC 표준 인터페이스를 구현한 드라이버를 제공하며 이 드라이버가 어댑터 역할을 한다. 이로 인해 자바 어플리케이션은 다양한 데이터베이스와 상호작용 할 수 있다.

 

  • JDBC 표준 인터페이스 : Connection, Statement, ResultSet 등
  • 데이터베이스 드라이버 : 드라이버는 어댑터 패턴을 사용하여 JDBC 인터페이스 호출을 해당 데이터베이스에 맞는 네이티브 호출로 변환
  • 드라이버 관리 : DriverManager 클래스는 어플리케이션이 데이터베이스에 연결을 요청하면 DriverManager 는 url을 기반으로 적절한 드라이버를 찾고 연결을 설정

이로 인해 JDBC는 데이터베이스 독립성을 유지하면서도 다양한 벤더의 데이터베이스와 호환될 수 있는 유연성을 갖추게 된다.

 

2. 트랜잭션 vs 락

 트랜잭션

 

데이터베이스의 일관성과 무결성 유지

데이터베이스에서 수행되는 일련의 작업 단위

  • 원자성 : 트랜잭션 내의 작업이 모두 성공하거나 모두 실패하도록 보장. 여러 작업 중 하나라도 실패하면 전체 트랜잭션이 취소되고 데이터베이스는 트랜잭션이 시작되기 전 상태로 복구된다.
  • 일관성 : 트랜잭션이 성공적으로 완료된 후 데이터베이스의 상태는 모든 정의된 규칙(무결성 제약 조건)을 만족해야 한다.
  • 격리성 : 동시에 여러 트랜잭션이 실행될 때 각 트랜잭션은 서로의 중간 상태를 확인할 수 없다. 두 트랜잭션이 같은 데이터를 수정하려고 할 때, 하나의 트랜잭션이 완료될 때까지 다른 트랜잭션은 그 데이터를 변경할 수 없다.
  • 지속성 : 트랜잭션이 성공적으로 완료되면 그 결과가 영구적으로 데이터베이스에 반영되어야 한다. 시스템 장애가 발생해도 트랜잭션 결과는 손실되지 않는다.

@Transactional 어노테이션

  • 적용 대상 : 메서드 또는 클래스 레벨에 적용
  • 기본 동작 : 트랜잭션을 시작하고 메서드가 정상적으로 완료되면 커밋, 예외가 발생하면 롤백을 한다. 

 

⛔ 락

 

동시에 여러 트랜잭션이 동일한 데이터에 접근하는 경우 데이터의 무결성과 일관성을 유지하기 위해 데이터베이스에서 사용되는 메커니즘

  • 공유 락 : 데이터에 대한 읽기 작업을 허용하지만 해당 데이터를 수정할 수 없도록 한다.
  • 배타 락 : 데이터에 대한 읽기 및 쓰기 작업을 모두 허용하지 않는다.

 

3. Spring AOP에서 프록시 패턴을 어떻게 사용하는지?

Spring AOP (Aspect-Oriented Programming)

애플리케이션의 주요 비즈니스 로직과 부가 기능을 분리하여 모듈화할 수 있는 프로그래밍 패러다임.

로깅, 트랜잭션 관리, 보안 등과 같은 공통 관심사를 핵심 비즈니스 로직과 분리하여 코드의 가독성, 유지보수성, 재사용성 향상.

  • Aspect : 공통 관심사를 모듈화한 것(로깅, 트랜잭션 관리, 보안)
  • Join Point : Aspect 가 적용될 수 있는 지점. 주로 메서드 호출 시점 
  • Pointcut : 특정 Join Point를 선택하는 표현식. Aspect 가 적용될 지점을 정의
  • Advice : Aspect 가 Join Point에서 수행하는 동작. 메서드 호출 전후/예외 발생 시점 등에 실행
  • Weaving : Aspect 를 대상 객체에 적용하는 과정. 주로 런타임 Weaving을 사용  

 Spring AOP에서 프록시 패턴 사용

Spring AOP는 런타임에 프록시 객체를 생성하여  Aspect을 메인 비즈니스 로직에 적용한다.

  • JDK 동적 프록시 : 인터페이스 기반 프록시 생성. 타겟 클래스가 구현한 인터페이스를 통해 프록시 생성
  • CGLIB 프록시 : 인터페이스가 없는 클래스에도 프록시 생성 가능. 클래스 상속을 통해 프록시 생성

서비스 객체가 빈으로 등록이 되면 스프링이 AbstractAutoProxyCreator라는 BeanPostProcessor (어떤 Bean이 등록되면, 그 Bean을 가공할 수 있는 life-cycle interface)로 서비스 빈을 감싸는 프록시 객체(빈)를 만들어 그 프록시 객체를 서비스 대신에 등록해서 사용한다.

 

4. 프록시 서버란 무엇인지?

➡ 클라이언트와 실제 서버 간의 중개자 역할을 하는 서버

     클라이언트의 요청을 받아 실제 서버에 전달하고, 실제 서버의 응답을 받아 클라이언트에 전달한다.

 

 주요 기능

  • 트래픽 제어 및 관리 : 특정 웹사이트에 대한 접근 제한, 특정 유형의 트래픽 필터링
  • 캐싱 : 자주 요청되는 웹 페이지나 파일을 캐싱하여 서버 부하를 줄이고 응답 시간 단축
  • 보안 및 익명성 제공 : 클라이언트의 IP 주소를 숨기고 실제 서버와의 직접적인 접촉을 막음으로써 보안과 익명성 제공
  • 콘텐츠 필터링 :  특정 콘텐츠에 대한 접근 제한, 악성 웹사이트 차단
  • 로드 밸런싱 : 여러 서버에 걸쳐 트래픽을 분산시켜 서버 부하를 균형있게 분배하여 서버 성능 최적화 

📶 종류

  • 포워드 프록시 : 클라이언트가 인터넷에 접속할 때 사용. 클라이언트의 요청을 받아 인터넷으로 전달하고 인터넷의 응답을 클라이언트에 전달한다. 주로 보안 및 익명성을 위해 사용된다.
  • 리버스 프록시 : 인터넷에서 들어오는 요청을 받아 내부 서버로 전달하고 내부 서버의 응답을 받아 클라이언트에 전달. 주로 로드 밸런싱, 보안, 캐싱을 위해 사용된다.
  • 웹 프록시 : 웹 트래픽을 중개. 클라이언트가 퉵 사이트에 접속할 때 익명성을 유지할 수 있다.
  • 오픈 프록시 : 누구나 사용할 수 있는 공개 프록시 서버. 익명성을 제공하지만 보안상 문제가 있을 수 있다.

 

5. 자바에서 싱글톤을 구현하는 방식이 무엇이 있는지?(즉시 로딩, 지연 로딩, syncronized, double-checked locking, lazy holder, enum 키워드 흐름대로)

🔵 즉시로딩

클래스가 로드될 때 인스턴스를 생성

인스턴스가 사용되지 않더라도 항상 메모리에 올라와있다는 단점이 있다.

public class Singleton {
    // 클래스 로드 시 인스턴스 생성
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

 

🔵 지연 로딩

인스턴스가 처음 필요할 때 생성

멀티스레드 환경에서는 인스턴스가 여러 개 생성될 수 있어 문제가 발생할 수 있다.

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    // 인스턴스 필요 시 생성
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 

🔵 synchronized

지연 로딩 방식에서 스레드 안정성을 보장할 수 있지만 메서드 전체에 동기화를 적용하면 블로킹으로 인해 성능이 저하될 수 있다.

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    // synchronized 키워드를 사용
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

 

🔵 Double-Checked Locking

synchronized 키워드 사용의 성능 저하 문제를 해결하기 위한 방법

인스턴스가 이미 생성된 경우는 동기화 블록을 통과하지 않도록 한다.

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        // 인스턴스가 이미 생성된 경우는 동기화 블록 통과하지 않음
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

 

🔵 Lazy Holder

내부 정적 클래스와 클래스 로더의 매커니즘을 이용한 지연 초기화 방식

내부 정적 클래스는 클래스가 로드될 때 인스턴스가 생성되지 않고 외부 클래스가 처음으로 참조될 때 초기화되는 특징

JVM은 클래스 로딩과 초기화를 스레드 안전하게 처리하기 때문에 별도의 동기화가 필요하지 않음

public class Singleton {
    private Singleton() {}

    // 내부 정적 클래스 : 싱글톤 인스턴스를 가지고 있음
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    //외부에서 호출할 수 있는 메서드 : 싱글톤 인스턴스를 반환
    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

 

🔵 Enum

enum 타입은 고정된 인스턴스를 가지기 때문에 싱글톤 패턴과 매우 잘 맞다.

JVM에서 싱글톤 인스턴스가 스래드 안전하게 초기화되도록 보장 

//enum 클래스 사용
public enum Singleton {
    INSTANCE;

    public void someMethod() {
        // 비즈니스 로직
    }
}

 

6. 콜백이란?

 프로그램 내에서 특정 이벤트가 발생했을 때 호출되는 함수나 메서드  

다른 함수에 인수로 전달되며 특정 조건이 만족되거나 이벤트가 발생하면 호출된다.

다른 코드의 인수로서 넘겨주는 실행 가능한 코드로 콜백을 넘겨받는 코드는 필요 따라 즉시 실행할 수도 있고 나중에 실행할 수도 있다.

자바에서는 주로 인터페이스와 람다식을 사용하여 콜백 구현 

  • 비동기 작업 후에 특정 작업을 수행하기 위해 콜백 사용
  • 한 함수가 다른 함수의 결과에 따라 동작을 달리하기 위해 사용 
  •  

7. 템플릿 메서드 패턴 vs 템플릿 콜백 패턴

템플릿 콜백 패턴은 템플릿 메서드 패턴과 유사하지만 공통 로직이 아닌 하위 클래스에서 구체화된 코드를 호출하는 부분을 자바8 이전에서는 익명 클래스로 구현하고 자바8 이후에서는 람다식으로 구현한다.

'공부 > f-lab' 카테고리의 다른 글

f-lab 17주차  (0) 2024.07.09
f-lab 11주차  (0) 2024.05.28
f-lab 10주차  (0) 2024.05.23
f-lab 9주차  (0) 2024.05.19
f-lab 8주차  (0) 2024.05.07

1. UML이란 무엇일까요?

  • Unified Modeling Language
  • 객체지향 소프트웨어 개발 및 시스템 설계를 위한 표준화된 모델링 언어
  • 소프트웨어 시스템의 구조와 행동을 시각적으로 표현하는 데 사용된다.
  • 구조 다이어그램
    • 클래스
    • 객체
    • 컴포넌트 : 시스템의 물리적 구성 요소와 그 관계
    • 배치 : 시스템의 하드웨어 구성 요소와 소프트웨어 구성 요소의 배치
  • 행위 다이어그램
    • 유스케이스
    • 시퀀스 : 객체 간의 상호작용을 시간 순서에 따라
    • 상태 : 객체의 상태 변화와 상태 간의 전이
    • 활동 : 프로세스 흐름이나 활동
  • 상호작용 다이어그램
    • 시퀀스
    • 커뮤니케이션
    • 협력

 

2. UML은 어떨 때 쓰고, 쓰면 왜 좋을까요?

  • 용도
    • 소프트웨어 개발 과정에서 시스템 구조, 동작 및 상호작용을 시각적으로 모델링하고 문서화하는데 사용된다.
    • 주로 객체지향 방법론에서 널리 사용된다.
  • 장점
    • 표준화된 표현 : 표준화된 표기법을 사용하므로, 다양한 배경을 가진 사람들이 시스템을 이해하고 협력할 수 있다.
    • 시각화 : 복잡한 구조와 동작을 시각적으로 표현하여, 이해하기 쉽고 명확한 문서를 제공한다.
    • 추상화 : 시스템의 복잡성을 추상화하여, 주요 구성 요소와 그들 간의 관계를 강조한다. 이는 시스템 설계를 더 효과적으로 만들 수 있다.
    • 의사소통 향상 : 의사소통을 개선하고, 명확한 요구 사항을 도출할 수 있다.
    • 분석 및 설계 품질 향상 : 요구 사항을 명확히 정의하고, 시스템의 구조적 문제를 조기에 발견하여 해결할 수 있다.

'공부 > f-lab' 카테고리의 다른 글

f-lab 17주차  (0) 2024.07.09
f-lab 14주차  (0) 2024.06.18
f-lab 10주차  (0) 2024.05.23
f-lab 9주차  (0) 2024.05.19
f-lab 8주차  (0) 2024.05.07

1. 컨텍스트 스위칭이란?

https://s7won.tistory.com/11 참고

https://www.youtube.com/watch?v=Xh9Nt7y07FE&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=2 참고

 

2. CPU 스케쥴링이란? / 관련 기법

https://www.youtube.com/watch?v=LgEY4ghpTJI&list=PLcXyemr8ZeoQOtSUjwaer0VMJSMfa-9G-&index=9 참고

  • 프로세스 상태가 러닝에서 다른 상태로 바뛰면 cpu가 비어있지 않게 다음으로 실행할 프로세스를 레디큐에서 선택하는 역할
  • 디스패쳐는 이 선택된 프로세스가 cpu에서 실행될 수 있도록 하는 역할
  • 비선점 스케쥴링
    • 프로세스가 종료되거나 i/o작업으로 넘어가거나 자발적으로 다른 프로세스에게 양보하는 경우
    • 운영체제가 개입하지 않고 프로세스가 자발적으로 하는 것
    • 신사적, 협력적, 느린 응답성
  • 선점 스케쥴링
    • 비선점 상황 + 프로세스 실행이 다 안 끝나도 개입하는 상황
    • 적극적, 강제적, 빠른 응답성, 데이터 일관성 문제 발생 가능
  • 스케쥴링 알고리즘
    • first come first served : 먼저 도착한 순서대로 처리
    • shortest job first : 프로세스의 다음 씨피유 처리 시간이 가장 짧은 프로세스부터 실행
    • shortest remaining time first : 남은 씨핑 처리시간이 가장 짧은 프로세스부터 실행
    • priority : 우선순위가 높은 프로세스부터 실행
    • round robin : 타임 슬라이스로 나눠진 씨피유 타임을 번갈아가면서 실행
    • multilevel queue : 프로세스들을 그룹화해서 그룹마다 큐를 두는 방식

3. 커넥션 풀 크기가 클 때의 단점

https://www.youtube.com/watch?v=zowzVqx3MQ4&t=180s 참고

  • 메모리 사용 증가 : 많은 커넥션을 필요로 하지 않는 경우 메모리 사용량이 크게 증가
  • 커넥션 유지 비용 증가 : 각  데이터베이스 커넥션은 일정량의 시스템 리소스를 사용하는데 너무 많은 커넥션을 유지하면 CPU와 메모리 사용량이 증가하며, 이는 다른 애플리케이션이나 시스템의 성능 저하를 유발
  • 데이터베이스 과부하 : 너무 많은 커넥션이 동시에 열리면 데이터베이스 서버에 과부하를 줄 수 있다. 이는 데이터베이스 성능 저하와 연결 실패로 이어질 수 있다.

4. 커넥션 풀의 크기를 정의하는 본인만의 공식 정해오기

☝ 공식 가이드
pool size = Tn x (Cm - 1) + 1 

Tn :  쓰레드의 최대 개수
Cm :  동시에 사용하는 커넥션의 최대 개수

 

모니터링 환경 구축(서버 리소스, 서버 스레드 수, DBCP 등)
백엔드 시스템 부하 테스트 : 트래픽을 점점 늘려가면서 테스트 (nGrinder)
request per second (단위 초당 몇개의 요청까지 처리할 수 있는지), avg response time (요청에 대한 평균적인 응답 시간)
두가지를 확인
백엔드 서버, DB 서버의 cpu, 메모리 등 리소스 사용률 확인

max-connections를 먼저 확인하고 사용할 백엔드 서버 수를 고려하여 
maximunpoolsize 결정

 

5. JWT의 장단점

  • 장점
      • 토큰 검증만을 통해 사용자 정보를 확인가능 하여 추가 검증 로직이 필요 없다.
      • 매번 세션이나 데이터베이스 같은 인증 저장소가 필요 없다.
      • 사용자가 늘어나더라도 사용자 인증을 위한 추가 리소스 비용이 없다.
      • 다른 서비스에 공통 스펙으로 사용이 가능하여 확장성이 높다.
  • 단점
      • base64 인코딩 정보를 전달하기에 전달량이 많다.
      • 토큰이 탈취당할 시 만료될 때까지 대처가 불가능하다.
      • Payload부분은 누구든 디코딩하여 확인할 수 있다.

6. 리프레시 토큰이 등장한 이유

토큰은 탈취될 수도 있다는 단점이 있는데 만료시간을 짧게 설정해두면 탈취가 되더라도 그 토큰을 사용하는 데 제한이 있다. 액세스 토큰의 만료 시간을 짧게 설정해두고 서버에서 관리하는 리프레쉬 토큰의 만료 시간을 길게 설정해두고 사용하면 이러한 단점을 해결할 수 있다.

 

7. 왜 세션/쿠키 인증 방식 대신에 JWT토큰을 썼나요?

  • 서버에 상태를 저장할 필요가 없기 때문에 별도의 서버를 더 추가하지 않아도 돼서 확장하기에 좋다.
  • 사용자의 인증 정보가 토큰 자체에 있기 때문에 다른 데이터를 서버에 요청할 필요가 없기 때문에 성능이 향상된다.
  • 자체적인 만료 시간을 가지고 있어 만료에 대한 관리가 편리하다.

8. DispatcherServlet이란?

  • 서블릿 컨테이너의 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러
  • 프론트 컨트롤러 : 서블릿 컨테이너의 제일 앞에서 서버로 들어오는 클라이언트의 모든 요청을 받아서 처리해주는 컨트롤러, 공통의 로직에 대한 처리 가능
  • DispatcherServlet의 흐름
    1. 클라이언트에서 요청이 오면 DispatcherServlet이 요청을 받는다.
    2. HandlerMapping을 통해 요청에 맞는 컨트롤러를 찾아낸다.
    3. 찾아낸 컨트롤러를 Handler Adapter를 통해 해당 컨트롤러의 메서드를 실행시킨다.
    4. 컨트롤러는 요청을 처리한 뒤 해당 요청에 대한 결과와 뷰에 대한 정보를 다시 DispatcherServlet에 전달한다.
    5. 받은 정보로 DispatcherServlet 은 View Resolver를 뷰 파일을 찾는다.

 

9. JSP/서블릿 서버 기준으로 요청이 들어오고 응답이 나가는 과정 설명

  1. 클라이언트 요청: url 요청
  2. 웹 서버: 요청 수신 후 서블릿 컨테이너로 전달
  3. 서블릿 컨테이너: /myapp/hello.jsp 요청을 수신
  4. JSP 컴파일 과정: hello.jsp가 서블릿으로 변환되고 컴파일됨
  5. 요청 매핑: /myapp/hello.jsp 요청을 컴파일된 서블릿에 매핑
  6. 서블릿 초기화: 서블릿이 초기화되지 않은 경우 init() 호출
  7. 요청 처리: 서블릿의 doGet() 또는 doPost() 메서드 호출
  8. 비즈니스 로직: 데이터베이스 조회, 연산 등 수행
  9. 응답 생성: 서블릿이 HTML, JSON 등을 생성
  10. 응답 반환: 클라이언트에 응답 전송( HttpServletResponse 객체 이용)
  11. 클라이언트 수신: 브라우저가 응답을 렌더링하여 사용자에게 표시

'공부 > f-lab' 카테고리의 다른 글

f-lab 14주차  (0) 2024.06.18
f-lab 11주차  (0) 2024.05.28
f-lab 9주차  (0) 2024.05.19
f-lab 8주차  (0) 2024.05.07
f-lab 7주차  (0) 2024.04.30

1. 불변성의 장점

  • 생성 시점 이후 해당 객체의 상태를 변경할 수 없으므로, 실행 중인 쓰레드 간 서로의 간섭에 의해 생길 수 있는 동기화(synchronization) 문제에 대한 걱정을 안 해도 되게끔 해준다. (Thread safe 하다.)
  • side-effect에 대한 걱정이 없기 때문에 설계, 구현, 및 사용하는데 편리하다는 장점이 있다.
  • 프로그램 실행 간 exception이 발생하더라도 사용했던 객체들의 상태값은 변함이 없고, 이런 장점 때문에 캐시 해두고 사용한다면 효율을 극대화할 수 있다.

2. 세션 쿠키와 영구 쿠키

 

3. 쿠키는 서버에 요청을 보낼 때 자동으로 요청 헤더에 따라가는데 그 이유는? (쿠키의 사용 이유)

  • HTTP는 본질적으로 상태가 없는(stateless) 프로토콜로 다른 페이지를 요청했을 때 서버는 이전 요청의 상태를 기억하지 못한다. (각 요청은 독립적이기 때문에)
  • 그래서 쿠키를 요청 헤더에 포함시켜서 브라우저와 서버의 연속적인 상호작용에서 상태를 유지하기 위해 쓰인다. 
  • 상태 유지, 세션 관리, 사용자 식별, 환경 설정 저장, 사용자의 행동 추적과 분석을 가능하게 하기 위해 쿠키를 사용한다. 

4. 서버에서 생성되는 세션ID는 어떤 원리로 클라이언트의 쿠키에 저장이 되는지?

  • 클라이언트가 서버에 요청을 보내면, 서버는 해당 요청을 처리한 후 응답을 준비한다. 이 응답에는 세션 ID를 클라이언트에게 전달하기 위한 HTTP 헤더가 포함된다.
  • 서버는 HTTP 응답 헤더에 Set-Cookie 헤더를 추가하여 세션 ID를 쿠키로 설정한다. 이 헤더는 클라이언트에게 쿠키를 설정하라는 지시를 포함한다.
  • Set-Cookie 헤더는 여러 속성을 포함하고 있다:
      • sessionID=abc123xyz: 쿠키의 이름과 값이다. 여기서 세션 ID는 abc123xyz이다.
      • Path=/: 쿠키가 유효한 URL 경로를 지정한다. 루트 경로 /로 설정되어 있어 해당 도메인의 모든 경로에 대해 쿠키가 전송된다.
      • HttpOnly: 이 속성이 설정되면, 쿠키는 클라이언트 측 스크립트(JavaScript 등)에서 접근할 수 없습니다. 이는 XSS 공격으로부터 쿠키를 보호한다.
      • Secure: 이 속성이 설정되면, 쿠키는 HTTPS 연결을 통해서만 전송된다. 이는 쿠키의 전송 중 도청을 방지한다.
      • SameSite=Strict: 이 속성은 쿠키가 동일한 사이트의 요청에서만 전송되도록 한다. 이는 CSRF 공격을 방지하는 데 도움이 된다.
  • 클라이언트의 브라우저는 서버로부터 HTTP 응답을 받으면, Set-Cookie 헤더를 읽고 쿠키를 저장한다. 브라우저는 지정된 속성에 따라 쿠키를 로컬 저장소에 저장한다.
  • 이후 클라이언트가 동일한 서버에 요청을 보낼 때, 브라우저는 저장된 쿠키를 자동으로 요청 헤더에 포함시켜 전송한다. 이를 통해 서버는 클라이언트를 식별하고 세션 정보를 유지할 수 있다.

5. 데이터베이스 호출을 끝내면 ResultSet , Statement , Connection 순서대로 close를 호출해줘야하는데 이렇게 닫아주지 않으면 어떤 일이 발생할까요?

  • 메모리 누수 : 해당 객체들이 사용하던 메모리가 회수되지 않고 계속 점유된 상태로 남아있게 된다. 이로 인해 메모리 누수가 발생할 수 있으며, 결국 애플리케이션이 사용할 수 있는 메모리가 부족해질 수 있다.
  • 데이터베이스 연결 누수 
    • 데이터베이스 커넥션 풀을 사용하는 경우, 사용한 커넥션을 반환하지 않으면 연결이 점점 고갈된다. 연결이 고갈되면 새로운 연결을 생성할 수 없게 되어 애플리케이션이 데이터베이스와 상호작용할 수 없게 된다.
    • 데이터베이스 서버는 동시에 처리할 수 있는 연결 수에 제한이 있다. 닫히지 않은 연결이 많아지면 이 제한을 초과하게 되어 다른 애플리케이션이나 사용자들이 데이터베이스에 접근할 수 없게 된다.
  • 데이터베이스 락 문제 : ResultSet이나 Statement를 닫지 않으면, 데이터베이스의 특정 자원에 대한 락이 해제되지 않을 수 있다. 이는 다른 트랜잭션이 해당 자원에 접근하지 못하게 하고, 교착 상태(deadlock)나 성능 저하를 초래할 수 있다.

6. 커넥션 과정은 비용이 많이 드는데, 왜 그런가요?

  • 네트워크 연결 설정: 클라이언트와 데이터베이스 서버 간의 네트워크 연결을 설정하는 것은 시간이 많이 소요됩니다. 특히, 데이터베이스 서버가 원격에 있는 경우 네트워크 지연(latency)도 고려해야 합니다.
  • 메모리 할당: 새로운 커넥션을 설정하면 서버는 해당 커넥션을 처리하기 위한 메모리를 할당해야 합니다. 이에는 버퍼, 캐시, 기타 연결 관련 데이터 구조가 포함됩니다.
  • 스레드 생성: 많은 데이터베이스 시스템은 각 연결을 처리하기 위해 새로운 스레드를 생성하거나 기존 스레드 풀에서 스레드를 할당합니다. 스레드 생성과 관리에는 오버헤드가 발생합니다.
  • 쿼리를 요청하는 과정은 TCP 기반으로 동작하기 때문에 커넥션을 열고 닫는 과정이 오래 걸린다.

7. 톰캣에는 스레드 풀이 있습니다. 이 스레드 풀은 왜 존재하는걸까요?

  • 서버에 들어오는 요청마다 각각의 스레드를 만들어 처리하고 처리가 끝나면 스레드를 버리는 식으로 동작한다면 스레드를 생성하는 시간 때문에 요청 처리가 오래 걸린다.(커널이 개입해서 커널 레벨에서 스레드가 생성되기 때문에)
  • 스레드가 계속 생성되면 컨텍스트 스위칭이 자주 발생하고 cpu 오버헤드 증가 
  • 스레드 수가 증가하면서 메모리 부족 
  • 스레드 풀을 사용하면 처리가 끝난 뒤 스레드를 버리지 않고 스레드 풀에 보관했다가 다른 요청이 들어오면 재사용
  • 여러 작업을 동시에 처리해야 할 때 사용 

8. 커넥션 풀과 스레드 풀의 개수는 어떤 상황에서 어떻게 맞추면 좋을지?

  • 커넥션 풀의 개수 고려 사항
    • 동시 사용자 수 : 동시에 접속하는 사용자가 많으면 더 많이 생성한다.
    • 쿼리 실행 시간 : 각 쿼리의 실행 시간이 길다면 더 많은 커넥션이 필요할 수 있다.
    • 데이터베이스 성능 : 데이터베이스 서버가 처리할 수 있는 최대 연결 수를 고려해야 한다.
    • 애플리케이션 논리 : 애플리케이션이 얼마나 자주 데이터베이스에 접근하는지와 트랜잭션 길이에 따라 달라질 수 있다.
    • 일반적으로 커넥션 풀의 크기는 10~30
  • 스레드 풀의 개수 고려 사항
    • CPU 코어의 수 : 스레드 수는 CPU 코어 수와 밀접하게 관련된다. 너무 많은 스레드는 오히려 컨텍스트 스위칭 오버헤드를 증가시켜 성능 저하를 초래할 수 있다.
    • 작업 특성 : /O 바운드 작업(네트워크, 파일 입출력 등)이 많은 경우 더 많은 스레드를 사용할 수 있지만, CPU 바운드 작업이 많은 경우 CPU 코어 수에 맞추는 것이 좋다.
    • 응답 시간 요구사항 : 응답 시간이 중요한 애플리케이션이라면 스레드 수를 늘려 병렬 처리를 최대화할 수 있다.
    • 일반적으로 CPU 코어 수 * 2
  • 모든 요청이 db에 접근하는 것 아니기 때문에 스레드 풀의 개수는 커넥션 풀의 개수보다 많아야 한다.

 

9. JWT. 인증, 인가 관련된 내용 자유롭게 학습하기

'공부 > f-lab' 카테고리의 다른 글

f-lab 11주차  (0) 2024.05.28
f-lab 10주차  (0) 2024.05.23
f-lab 8주차  (0) 2024.05.07
f-lab 7주차  (0) 2024.04.30
f-lab 6주차  (0) 2024.04.24

1. git에서 pull request merge의 3가지 전략

https://ssocoit.tistory.com/273#2._%EC%84%B8_%EA%B0%80%EC%A7%80_%EB%A8%B8%EC%A7%80_%EC%A0%84%EB%9E%B5 참고

https://im-developer.tistory.com/182 참고 

  • Create a merge commit 
    • 기본 머지
    • 하나의 브랜치와 다른 브랜치의 변경 이력 전체를 합친다.
    • 각각의 브랜치에 남은 커밋을 히스토리에 그대로 남긴다.
    • 어떤 브랜치에서 어떻게 만들어져서 머지가 되었는지 상세하게 파악할 수 있다. 
    • 히스토리가 자세하게 남아서 보기 어려울 수 있다는 단점이 있다.
  • Squash and merge
    • 개발용 브랜치에 있던 내용들을 하나로 합쳐서 중앙 브랜치에 하나의 커밋으로 저장하는 전략
    • 기존 변경사항들이 어떻게 변했는가보다 머지가 되었다에 좀 더 집중한 전략
    • 남아있는 정보량이 비교적 적기 때문에, 개발용 브랜치에서 언제 어떤 코드를 바꿨는지에 대한 정보를 잃을 수 있다는 단점이 있다.
  • Rebase and merge
    • 이미 존재하는 Rebase라는 기능을 이용해서 브랜치를 머지하는 것이다.
    • 모든 커밋들이 합쳐지지 않고 각각 main 브랜치에 추가된다.
    • 히스토리의 base를 직접 옮겨서 처리하는 방식이기 때문에 개발용 브랜치에서 변경한 내용을 중앙 브랜치에서 변경한 것처럼 바꿔버릴 수 있다.
    • 어느 시점에 머지가 되었는지 나중에 판단하기 어렵다.

2. 테스크 코드 (필요성, 장단점)

  • 테스트 코드란 작성한 코드가 의도대로 잘 동작하고 예상치 못한 문제가 없는지 확인할 목적으로 작성하는 코드
  • 필요성 : 개발 과정 중 예상치 못한 문제를 미리 발견할 수 있고, 코드 수정이 필요한 상황에서 유연하고 안정적인 대응을 할 수 있다. 이는 서비스의 품질 및 안정성과 직결되어 있다.
  • 장점
    • 코드 및 서비스의 품질을 향상시킨다.
    • 개발자가 더 빠르게 기능의 동작 방식을 이해하는 데 도움이 되는 문서로 작용할 수 있다.
    • 리팩토링 작업을 진행할 경우 이전에 작성한 테스트 코드를 통해 서비스에서 동작하는 기능에 대한 안정적인 확장 및 품질 향상이 가능하다.
  • 단점
    • 테스트 코드 작성은 단순한 작업이 아니므로 개발 시간이 늘어날 수 있다.
    • 서비스의 기능이 변경되거나 확장될 때마다 테스트 코드로 함께 수정해야 하기 때문에 추가적인 유지보수 비용이 발생할 수 있다.
    • 오버 엔지니어링 발생 : 개발 과정에서 소프트웨어의 요구사항보다 더 복잡하고 정교하게 코드를 작성하는 것
    • 테스트 코드 작성 방법을 익히는 데 시간이 소요된다.

3. 동기 vs 비동기 vs 블로킹 vs 논블로킹

https://www.youtube.com/watch?v=oEIoqGd-Sns 참고 

  • 동기
    • 작업을 동시에 수행하거나, 동시에 끝나거나, 끝나는 동시에 시작함을 의미
  • 비동기
    • 시작, 종료가 일치하지 않으며 끝나는 동시에 시작을 하지 않음을 의미 
  • 블로킹
    • 자신의 작업을 진행하다가 다른 주체의 작업이 시작되면 다른 작업이 끝날 때까지 기다렸다가 자신의 작업을 시작하는 것
  • 논블로킹
    • 다른 주체의 작업에 관련없이 자신의 작업을 하는 것 
  • 블로킹 vs 논블로킹은 다른 주체가 작업할 때 자신의 제어권이 있는지(논블로킹) 없는지(블로킹)로 볼 수 있다.
  • 동기와 비동기는 결과를 돌려주었을 때 순서와 결과에 관심이 있는지(동기) 아닌지(비동기)로 판단할 수 있다. 
  • 4가지 조합
    • 동기+블로킹 : 작업을 넘겨주고 그 작업이 끝날 때까지 대기했다가 작업이 완료되고 제어권과 결과가 넘어오면 바로 처리를 한다. 예) 자바에서 입력 요청을 할 때 사용한다. (입력을 받을 때까지 다른 작업을 하지 않고 기다렸다가 입력을 받으면 처리)
    • 동기 + 논블로킹 : 자신의 제어권을 가지고 일을 하다가 중간중간에 다른 작업에 결과가 나왔는지 물어보다가 결과가 나오면 가지고 와서 업무를 처리한다. 예) 해당 데이터를 가져올 때까지 유저에게 정보의 로드율이 얼만큼인지 보여줄 때 사용한다.
    • 비동기 + 블로킹 : 다른 작업을 할 동안 결과에는 관심이 없지만 기다렸다가 결과를 가지고 나중에 처리한다. 
    • 비동기 + 논블로킹 : 다른 작업이 진행될 동안 자신의 작업을 이어서 하다가 다른 작업이 끝나서 결과가 넘어오면 그 결과를 나중에 처리한다.

4. TCP의 3-way handshake란?

  • TCP 프로토콜을 이용해서 통신하는 프로그램은 데이터를 주고받기 전에 먼저 연결을 진행하는 과정을 말한다.
  • SYN : 연결 설정. 시퀀스 번호를 랜덤으로 설정하여 세션을 연결하는 데 사용
  • ACK : 응답 확인. 패킷을 받았다는 것을 의미
  • LISTEN : 포트가 열린 상태로 연결 요청 대기 중
  • SYN_RECV : SYNC 요청을 받고 상대방의 응답을 기다리는 중
  • 동작방식
    • Client → SYN → Server : 클라이언트가 서버에게 접속을 요청하는 SYN 플래그를 보낸다.
    • Server → SYN + ACK Client : 서버는 Listen 상태에서 SYN이 들어온 것을 확인하고 SYN_RECV 상태로 바뀌어 SYN+ACK 플래그를 클라이언트에게 전송한다. 그 후 서버는 다시 ACK 플래그를 받기 위해 대기상태로 변경된다.
    • Client → ACK → Server : SYN+ACK 상태를 확인한 클라이언트는 서버에게 ACK를 보내고 연결 성립이 된다.

5. 함수형 프로그래밍의 특징 및 장점(명령형 프로그래밍과 비교)

  • 프로그램이 상태의 변화 없이 데이터 처리를 수학적 함수 계산으로 취급하고자 하는 패러다임
  • 순수 함수
    • 동일한 입력에는 항상 같은 값을 반환한다.
    • 함수의 출력은 오로지 그 함수에 입력된 값에만 의존한다.
    • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다.
  • 불변성
    • input의 불변성을 유지해야 순수함수의 순수성 유지가 의미가 있다.
  • 참조의 투명성
    • 함수 외부에 의존하는 코드가 없고, 함수 사용자 입장에서는 유효한 매개변수만 전달하면 된다.
    • 동일한 매개변수에 대해서는 항상 동일한 결과가 나온다,
    • 예외를 던지지 않는다.
    • 데이터베이스, 파일 시스템, 네트워크 등의 외부 기기로 인해 동작이 멈추지 않는다.
  • 장점
    • 여러 가지 연산 처리 작업이 동시에 일어나는 프로그램을 만들기 쉽다.
    • 머러티 코어 혹은 여러 연산 프로세스를 사용하는 시스템에서 효율적인 프로그램을 만들기 쉽다.
    • 상태변화에 따른 부작용에서 자유로워지기 때문에 순수하게 기능 구현에 초점을 맞추어 설게할 수 있다.
함수형 프로그래밍 명령형 프로그래밍
상태 변경을 지양하고 불변성 유지 상태 변경 중심
외부 상태에 의존하지 않아 부작용 최소화 함수가 외부 상태에 의존해 부작용을 일으킬 가능성 높음
데이터의 불변성 강조 변수와 객체의 값을 자유롭게 변경 가능
상태 변이가 없고 부작용이 없으므로 병렬성와 동시성 쉽게 처리 상태 변이와 부작용이 많아 병렬성과 동시성 관리 어려움

6. 웹이란?

  • 전 세계 인터넷에 연결된 수많은 기기들이 서로의 정보를 공유하는 공간
  • 하이퍼텍스트로 표현되는 여러 문서들을 컴퓨터를 통해 모니터에 출력
  • 하이퍼텍스트는 HTML로 작성되며 HTTP 프로토콜을 통해 주고받게 된다.

'공부 > f-lab' 카테고리의 다른 글

f-lab 10주차  (0) 2024.05.23
f-lab 9주차  (0) 2024.05.19
f-lab 7주차  (0) 2024.04.30
f-lab 6주차  (0) 2024.04.24
f-lab 5주차  (0) 2024.04.16

1. 동기 / 비동기 / 블로킹 IO / 논블로킹 IO

  • https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EA%B0%9C%EB%85%90-%EC%A0%95%EB%A6%AC 참고
  • 동기 / 비동기 : 요청한 작업에 대해 완료 여부를 신경 써서 작업을 순차적으로 수행할지 아닌지에 대한 관점
  • 블로킹 / 논블로킹 : 현재 작업이 블록되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점
  • 동기( Synchronous ) : 요청한 작업에 대해 완료 여부를 따져 순차적으로 처리한다.
  • 비동기( Asynchronous ) : 요청한 작업에 대해 완료 여부를 따지지 않기 때문에 자신의 다음 작업을 그대로 수행한다.
    • 장점 : 느린 작업이 발생했을 때 기다리지 않고 다른 작업을 처리할 수 있기 때문에 시스템 성능 향상에 도움을 준다.
  • 동기 작업은 요청한 작업에 대해 순서가 지켜지고, 비동기는 지켜지지 않을 수 있다.
  • 콜백함수 : 비동기나 논블로킹에서 작업의 완료 여부나 결과에 대한 후처리를 위해 이용되는 방식
  • 블로킹과 논블로킹은 호출된 함수가 호출한 함수에게 제어권을 바로 주느냐(블로킹) 안주느냐(논블로킹)로 구분된다.
  • 제어권 : 함수의 코드나 프로세스의 실행 흐름을 제어할 수 있는 권리

2. TCP와 UDP의 차이

  • https://inpa.tistory.com/entry/NW-%F0%9F%8C%90-%EC%95%84%EC%A7%81%EB%8F%84-%EB%AA%A8%ED%98%B8%ED%95%9C-TCP-UDP-%EA%B0%9C%EB%85%90-%E2%9D%93-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EC%9E%90 참고
  • 프로토콜 : 클라이언트와 서버가 정보를 교환할 수 있도록 하는 메시지 형식에 대한 규칙
  • TCP - 전송 제어 프로토콜
    • IP 규칙으로만 통신하기에 부족하거나 불안정하던 여러 단점(패킷 순서 보장 없음, 패킷 유실)들을 커버해, 패킷 전송을 제어하여 신뢰성을 보증한다.
    • 패킷 데이터의 전달을 보증하고 보낸 순서대로 받게 해준다.
    • 데이터를 확실하게 보내기 위해서 3 way handshake이라는 방법을 사용한다. 
    • 3 way handshake 
      • 본격적으로 상대 클라이언트와 연결되기 전에 가상 연결을 해서 패킷으로 보내서 확인하는 동작
      • SYN : 연결을 생성할 때 클라이언트가 서버에 시퀀스 번호를 보내는 패킷
      • SYN-ACK : 시퀀스 번호를 받은 서버가 ACK 값을 생성하여 클라이언트에세 응답하는 패킷
      • ACK : ACK 값을 사용하여 응답하는 패킷
      • ACK 값을 받지 못한 데이터는 재전
    • TCP 데이터 안에 전송 제어, 순서, 정보들이 있기 때문에 패킷을 순서대로 제어할 수 있다.
  • UDP - 사용자 데이터그램 프로토콜
    • 비 연결지향적 프로토콜
    • 데이터 전달과 순서를 보증하지 않는다.
    • TCP와 비교해서 기능이 거의 없어 단순하지만 빠르게 패킷을 보내는 목적 

3. 람다란? 람다의 장점 

  • https://inpa.tistory.com/entry/%E2%98%95-Lambda-Expression 참고
  • 람다 표현식 = 익명 함수 : 함수형 프로그래밍을 구성하기 위한 함수식, 메서드를 간결한 함수 식으로 표현한 것
  • 메서드 타입/이름, 매개변수 타입, 중괄호, return 문을 생략하고 화살표 기호를 넣음

  • 인터페이스(= 함수형 인터페이스)로 선언한 익명 구현 객체만이 람다식으로 표현이 가능하다.
  • 함수형 인터페이스 : 딱 하나의 추상메서드가 선언된 인터페이스. 인터페이스 선언 시 @FuntionalInterface 어노테이션을 붙여주면 두 개 이상의 메서드가 선언되지 않도록 한다. 
  • 장점
    • 코드의 길이를 줄일 수 있다. 
    • 람다 함수는 일급 객체로 취급되기 때문에 메서드를 변수에 할당하거나 매개변수로 넣거나 리턴값으로 사용할 수 있다.
    • 함수형 프로그랭 지원
    • 함수형 프로그래밍의 특성으로 상태 변경이 없고 스레드에 안전하기 때문에 다중 스레드 환경에서 안전하게 사용할 수 있다.
  • 단점 
    • 문서화를 할 수 없다.
    • 익명 구현 객체 기반이기 때문에 디버깅이 까다롭다.

4. 스트림이란? 스트림의 장점 (함수형 프로그래밍과 엮어서)

  • 스트림 : 데이터의 흐름. 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하여 가공된 결과를 얻을 수 있다.
  • 원본 데이터를 변경하지 않는다 : 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로 스트림을 생성한다.
  • 일회용이다 : 한번 사용이 끝나면 재사용이 불가능하다. 다시 필요한 경우는 재생성해서 사용해야 한다.
  • 내부 반복자 : 반복 문법을 메서드 내부에 숨기고 있기 때문에 간결한 코드의 작성이 가능하다.
  • 장점
    • 배열과 컬렉션을 함수형으로 처리할 수 있다.
    • 스레드를 이용해 하나의 작업을 둘 이상의 작업으로 나눠서 동시에 진행하는 병렬 처리가 가능하다.

5. Optional 클래스가 무엇이고, 왜 탄생했는지?

  • null을 처리하기 위한 새로운 방법으로 등장
  • 값이 있을 수도 있고 없을 수도 있는 객체를 감싸는 래퍼 클래스
  • 명시적으로 해당 값이 null일 수 있음을 표현하고 NullPointerException을 방지할 수 있는 API를 제공한다.
  • 코드의 가독성을 높이고, null 체크를 강제함으로써 더 안전한 코드를 작성할 수 있게 해준다.

6. ThreadLocal이란?

  • 각각의 스레드 별로 필요한 정보를 저장할 수 있다.
  • 스프링의 데이터베이스 접근 기술은 스레드 로컬을 기반으로 동작하고 있다.
  • 서비스 계층에서 트랜잭션을 시작하도록 커넥션을 커넥션 풀로부터 꺼내오고, Dao 계층에서 해당 커넥션활용해 커밋하거나 롤백하는 동작은 스레드 로컬 덕분에 가능한 것이다.

 

※ 다음주 예습 ※

최범균의 JSP 1~4장

'공부 > f-lab' 카테고리의 다른 글

f-lab 9주차  (0) 2024.05.19
f-lab 8주차  (0) 2024.05.07
f-lab 6주차  (0) 2024.04.24
f-lab 5주차  (0) 2024.04.16
f-lab 4주차  (0) 2024.04.09

1. Checked Exception은 왜 생겨났고, 현재는 왜 안쓰는가?

  • 쇼규모 프로그램에서는 개발자의 생산성과 코드품질을 향상시킬 수 있으나, 일반적인 대규모 소프트웨어에서는 그렇지 않다.
  • 낮은 수준에서 발생하는 특정유형의 CheckedException 의 경우 (File I/O, Network, Database …) 일반적인 응용프로그램에서는 알 필요 없거나 알고싶지 않아한다. 만약 Exception을 캐치한다고 하더라도 적절하게 대응하기 힘든경우가 대부분이라 RuntimeException으로 rethrow처리하는 경우가 많다.
  • 코드의 확장성에 이슈가 생길수 있다. 단일 CheckedException 사용은 훌륭하게 동작하는것으로 보이나 4~5개의 서로다른 CheckedExcpetion을 사용하는 하위 API를 호출하는 경우 Exception 체인이 기하급수적으로 증가할 수 있다.
  • 반드시 예외 처리를 하는 코드를 작성해야 한다. 예외를 던지는 것은 모든 하위 메서드, 호출 트리에 누적되기 때문에 수많은 메서드를 조정해야 할 수도 있다.

2. Java 8 기준으로 GC는 어떻게 실행이 되는가? (heap young/old generation 동작 관점)

  • parellel GC
  • 멀티 스레드로 GC를 수행하기 때문에 stop-the-world 시간을 줄일 수 있다.
  • minor GC(young)에서 멀티 스레드를 사용한다.(후에는 major GC(old)에서도 멀티 스레드 사용)
  • https://www.youtube.com/watch?v=FMUpVA0Vvjw 참고

3. Java BigDecimal은 부동 소수점의 오류를 어떻게 해결하는가?

  • BigDecimal은 십진법을 사용하여 숫자를 저장한다.
  • 실수 타입인 double이나 float를 사용하지 않고 정수를 사용하여 소수를 다룬다. 
    • intVal : 정수부 값
    • precision : 정수부+소수부 길이
    • scale : 소수부 길이
    • stringCache : 숫자를 String으로 변환한 값
    • intCompact : 소수점을 제외한 전체 수(10.25 → 1025)

4. System.out.println 클래스를 절대 쓰지 말라고 하는데 이유가 무엇인가?

  • 이 클래스는 블로킹 I/O인데 동기화가 동작된다는 이유때문에 멀티스레드에서 락이 발생한다.
  • 출력이 완료될 때까지 실행이 멈추고 대기해야 하기 때문에 성능을 저하시킨다. 
  • 동기화 블록 안에서 블로킹 I/O 까지 일어난다면 대기가 계속 길어질 수 있다.

5. 메인 vs 엔티티

  • 도메인 : 특정한 문제 영역이나 분야
    • 사용자가 이용하는 앱의 기능, 회사의 비즈니스 로직을 정의하고 있는 영역
    • 유스케이스에서 한 액터가 수행하는 기능
    • 음식을 만드는 '행위'
  • 엔티티 : 도메인에서 식별 가능한 개별적인 객체나 개념 
    • 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 가진다.
    • 주문, 회원, 상품과 같이 도메인의 고유한 개념을 표현한다.
    • 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다.
    • 음식 제작의 '데이터' 

※ 다음 주 예습 ※

1. HashMap

2. 스레드

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4

 

👩‍💻 ‍완전히 정복하는 프로세스 vs 스레드 개념

한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아

inpa.tistory.com

3. I/O

4. Serializable, NIO

'공부 > f-lab' 카테고리의 다른 글

f-lab 8주차  (0) 2024.05.07
f-lab 7주차  (0) 2024.04.30
f-lab 5주차  (0) 2024.04.16
f-lab 4주차  (0) 2024.04.09
f-lab 3주차  (0) 2024.04.02

+ Recent posts