2023.08.28.월.TIL

heeh·2023년 8월 28일

TIL

목록 보기
73/82
post-thumbnail

2023.08.28.월.TIL

  • 할 것
    • 15시
      • CI/CD 를 쓰다보면 TEST 코드가 필수! → 팀장님이 강의 해주신다 함
      • 코드 작성 전에 TEST 코드가 필수!!!

기술 문제 10

💡 http, https 차이점에 대해 설명해주세요

http

  • 자세히 HTTP(하이퍼텍스트 전송 프로토콜)는 인터넷에서 데이터를 주고받는 데 사용되는 프로토콜 중 하나입니다. 이 프로토콜은 클라이언트와 서버 간에 데이터를 전송하고 웹 페이지, 이미지, 동영상 등의 리소스를 요청하고 제공하는 데 주로 사용됩니다. HTTP는 하이퍼텍스트 기반으로 설계되었기 때문에 웹 페이지의 텍스트나 링크를 포함한 다양한 형태의 데이터를 처리할 수 있습니다. 클라이언트(웹 브라우저)가 서버에 요청(Request)을 보내면, 서버는 요청된 데이터를 처리하고 클라이언트에게 응답(Response)을 보냅니다. 이러한 요청과 응답은 주로 웹 주소(URL)를 통해 이루어지며, HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하여 요청의 목적을 지정합니다. 하지만 HTTP는 데이터를 평문으로 전송하기 때문에 보안에 취약한 단점이 있습니다. 데이터가 암호화되지 않기 때문에 해커들이 중간에서 데이터를 엿볼 수 있습니다. 따라서 민감한 정보의 전송이나 보안이 필요한 작업에는 HTTPS와 같은 보안 강화된 프로토콜을 사용하는 것이 권장됩니다.
  • 간단히 HTTP(하이퍼텍스트 전송 프로토콜)는 인터넷에서 데이터를 주고받는 규칙으로, 웹 브라우징과 웹 페이지 요청에 사용됩니다. 하지만 데이터를 암호화하지 않아 보안에 취약합니다. 클라이언트가 서버에 데이터를 요청하고 응답을 받는 방식으로 작동합니다.

https

  • 자세히 HTTPS(하이퍼텍스트 전송 프로토콜 보안)는 HTTP 프로토콜의 보안을 강화한 버전으로, 웹 브라우징 및 데이터 전송 과정에서 데이터의 기밀성과 무결성을 보장합니다. 이를 위해 SSL(Secure Sockets Layer) 또는 TLS(Transport Layer Security) 프로토콜을 사용하여 데이터를 암호화하여 전송합니다. 웹사이트의 경우, HTTPS는 사용자와 웹 서버 간의 통신에서 중간에 제3자가 데이터를 엿보거나 조작하는 것을 방지하며, 사용자의 민감한 정보(비밀번호, 개인정보, 결제 정보 등)를 보호합니다. 이를 위해 웹 서버는 SSL/TLS 인증서를 획득하여 웹 브라우저에게 자신의 신원을 인증합니다. 브라우저는 이 인증서를 검증하여 사용자에게 안전한 연결임을 보장하고, 보안 연결이 성립하면 주소창에 자물쇠 아이콘 등으로 표시됩니다. 또한, HTTPS는 검색 엔진 랭킹에서도 중요한 역할을 합니다. 구글과 같은 검색 엔진은 HTTPS를 사용하는 웹사이트를 더 높은 순위로 평가하며, 사용자는 HTTPS 사이트를 더 신뢰하고 방문할 가능성이 높아집니다. 따라서 보안과 신뢰성을 강화하고 사용자와 데이터의 안전을 보장하기 위해 HTTPS를 적극적으로 채택하는 것이 중요합니다.
  • 간단히 HTTPS(하이퍼텍스트 전송 프로토콜 보안)는 HTTP의 보안 강화 버전으로, 데이터를 암호화하여 웹 브라우징 및 데이터 전송을 보호합니다. SSL 또는 TLS 프로토콜을 사용하여 데이터의 기밀성과 무결성을 유지하며, 민감한 정보의 안전한 전송과 웹사이트 보안을 보장합니다. 주소창의 자물쇠 아이콘으로 식별되며 검색 엔진 랭킹에서도 우대됩니다.

차이점

  • 자세히 HTTP(하이퍼텍스트 전송 프로토콜)와 HTTPS(하이퍼텍스트 전송 프로토콜 보안)은 데이터 통신에 사용되는 두 프로토콜로, 주요한 차이점은 보안과 관련이 있습니다.
    1. 보안 강화: HTTP는 데이터를 평문으로 전송하여 중간에서 엿볼 가능성이 있습니다. 반면 HTTPS는 SSL 또는 TLS 프로토콜을 이용하여 데이터를 암호화하고 보호하여 해킹과 데이터 도난을 방지합니다.

    2. 암호화: HTTP는 암호화하지 않고 데이터를 전송하므로 민감한 정보가 쉽게 노출될 수 있습니다. HTTPS는 데이터를 암호화하여 해독하기 어렵게 만들어 보안을 강화합니다.

    3. 포트: HTTP는 기본 포트 80을 사용하며, HTTPS는 기본 포트 443을 사용합니다. 이를 통해 서버와 클라이언트가 어떤 프로토콜을 사용할지 식별합니다.

    4. 인증서: HTTPS는 SSL/TLS 인증서를 요구합니다. 이 인증서는 웹 서버의 신원을 확인하고 클라이언트에게 안전한 연결임을 보장합니다.

    5. 검색 엔진 랭킹: HTTPS를 사용하는 웹사이트는 검색 엔진에서 높은 순위를 받을 가능성이 높습니다. 구글과 같은 검색 엔진은 HTTPS를 선호하며, 사용자에게 더 안전한 사이트임을 알려줍니다.

    6. 사용자 신뢰: HTTPS는 주소창에 자물쇠 아이콘과 "안전함" 표시 등을 통해 사용자에게 신뢰성을 전달하며, 데이터의 안전한 전송을 보장합니다.

    7. 데이터 무결성: HTTPS는 데이터의 무결성을 보호하여 중간에 데이터가 조작되지 않도록 합니다.

    8. 보안 인증: HTTPS는 웹사이트의 신원을 인증하기 위해 SSL/TLS 인증서를 사용하며, 사용자는 웹사이트가 신뢰할 수 있는지 확인할 수 있습니다.

    9. 쿠키 보안: HTTPS를 사용하면 쿠키와 같은 민감한 정보도 암호화되어 전송되므로 해커가 이를 탈취하여 악용하는 것을 방지합니다.

    10. 보안 헤더: HTTPS는 보안 헤더를 사용하여 웹사이트의 취약점을 최소화하고 보안 상태를 강화합니다.

      요약하면, HTTP와 HTTPS의 주요 차이는 데이터의 보안 강화와 신뢰성 측면에서 나타납니다. HTTPS는 데이터 암호화와 웹사이트 보안을 강화하여 사용자와 서버 간의 안전한 통신을 제공합니다.

  • 간단히 HTTP는 데이터를 평문으로 전송하는 프로토콜이며, HTTPS는 데이터를 암호화하여 안전하게 전송하는 프로토콜입니다. HTTP는 보안이 취약하여 해커가 정보를 엿볼 수 있지만, HTTPS는 데이터를 암호화하여 해킹을 방지하고 사용자 정보를 보호합니다. 주소창의 자물쇠 아이콘으로 HTTPS 사이트를 신뢰할 수 있으며, 검색 엔진에서도 높은 순위를 받을 수 있습니다.

예제

놀이공원에서 친구에게 메모를 보내려고 해봅시다.

  1. HTTP: 당신은 메모를 평범한 종이에 적어 놀이공원에 있는 친구에게 건네주기로 했습니다. 그런데 메모는 평문이라 누군가가 메모를 가로채면 내용을 읽을 수 있습니다.
  2. HTTPS: 이번에는 메모를 암호로 잠긴 서랍 상자에 넣고 열쇠로 잠궜습니다. 상자를 받은 친구만이 열쇠를 가지고 있어서 안전하게 메모를 읽을 수 있습니다. 이때 상자와 열쇠는 웹 브라우징과 유사하게 서버와 브라우저 간의 보안 연결을 나타냅니다.

  • HTTP는 데이터를 암호화하지 않고 평문으로 전송해 보안이 약하며, 해커가 정보를 빼내는 해킹의 위험성이 있습니다. 반면에 HTTPS는 SSL 인증서를 사용하여 웹사이트의 신원을 확인하고 데이터를 암호화하여 보내므로 해킹을 어렵게 하고 사용자 정보를 안전하게 보호합니다. 주소창의 자물쇠 아이콘이 HTTPS 사이트를 나타내며, 검색 엔진에서도 높은 신뢰를 받습니다.
  • 피드백

기술 문제 11

💡 DI, IoC에 대해 설명해주세요.

DI (Dependency Injection)

의존성 주입(Dependency Injection, DI)은 소프트웨어 개발에서 사용되는 디자인 패턴으로, 객체 간의 의존 관계를 느슨하게 만들고 코드의 재사용성과 테스트 용이성을 향상시키는데 목적이 있습니다. DI는 객체가 필요로 하는 의존성을 외부에서 주입받는 방식으로 동작합니다. 이를 통해 객체가 직접 의존성을 생성하지 않고 외부에서 주입받기 때문에 결합도를 낮추고 유연한 코드를 작성할 수 있습니다.

IoC (Inversion Of Control, IoC)

제어의 역전(Inversion of Control, IoC)은 소프트웨어 개발에서 사용되는 개념으로, 컴포넌트의 생명주기와 실행 흐름의 제어를 프레임워크나 컨테이너로부터 가져오는 것을 의미합니다. 일반적으로 애플리케이션 코드가 아닌 외부의 제어 플로우가 컴포넌트를 생성하고 관리합니다. 이로써 애플리케이션의 모듈성과 확장성을 향상시킬 수 있습니다. IoC는 의존성 주입(DI)과 함께 사용되어 코드의 유연성을 증가시키는데 기여합니다.

DI, IoC

의존성 주입(Dependency Injection, DI)과 제어의 역전(Inversion of Control, IoC)는 소프트웨어 디자인 패턴으로, 소프트웨어 컴포넌트 간의 결합도를 낮추고 유연성과 테스트 용이성을 향상시키는데 사용됩니다.

  1. 의존성 주입 (Dependency Injection, DI): DI는 컴포넌트 간의 의존 관계를 코드 내부에서 관리하는 대신, 외부에서 의존성을 주입하는 방식입니다. 이는 코드의 재사용성과 테스트 가능성을 높이며, 컴포넌트 간의 강한 결합을 피하고 느슨한 결합을 유지합니다.
  2. 제어의 역전 (Inversion of Control, IoC): IoC는 컴포넌트의 생명주기와 실행 흐름의 제어를 프레임워크나 컨테이너로부터 가져오는 것을 의미합니다. 일반적으로 애플리케이션 코드가 아닌 외부의 제어 플로우가 컴포넌트를 생성하고 관리합니다. 이는 애플리케이션의 모듈성과 확장성을 향상시키는데 도움을 줍니다.

간단히 말하면, DI와 IoC는 컴포넌트 간의 결합도를 줄이고 유연한 설계를 가능하게 하는 패턴으로, 의존성 주입은 컴포넌트가 서로 독립적으로 작동하게 하며, 제어의 역전은 애플리케이션의 제어 흐름을 외부에서 관리하여 모듈성과 확장성을 높입니다.

  • 의존성 주입(Dependency Injection) 과 제어의 역전(IoC)은 소프트웨어 개발에서 사용되는 패턴입니다. DI는 컴포넌트 간의 의존 관계를 외부에서 주입하여 코드의 재사용성과 테스트 용이성을 높이고, IoC는 컴포넌트의 생성과 제어를 외부에서 관리하여 유연한 애플리케이션 설계와 확장성을 편리하게 합니다. 이 두 패턴은 코드 관리와 설계를 좀 더 효과적으로 구축하는데 도움을 줍니다.
  • 피드백
    • 의존성을 어떻게 주입하는가? (스프링에서 크게 3가지가 나뉩니다)
      • Setter Injection, Constructor Injection(@RequiredArgsConstructor), Field Injection(@Awired)
    • IoC → 제어의 역전 → 원래는 사람이 컨트롤 하는데 IoC에서는 그 대상이 컨트롤한다
      • 스프링이 컨트롤 권한을 가진다!
        → 스프링이 알아서 잘 적용해주고 응용해주고 사용해준다 = 컨트롤 해준다
      • 의존성을 역전시켜 객체 간에 결합도를 줄이고, 유연한 코드를 작성할 수 있게 됨에 따라 가독성을 높이고 코드 중복을 줄이면서, 유지 보수를 편하게 해줍니다.

기술 문제 12

💡 객체 지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

객체 지향 프로그래밍

  • 자세히 객체지향 프로그래밍(Object-Oriented Programming, OOP)은 다음 네 가지 개념을 중심으로 이루어진 소프트웨어 개발 접근법입니다:
    1. 캡슐화 (Encapsulation): 캡슐화는 객체의 데이터와 그 데이터를 다루는 메서드를 하나로 묶는 개념입니다. 이렇게 데이터와 관련 메서드를 함께 묶어 캡슐화하면 객체 외부에서 직접 접근하는 것을 제한할 수 있어 정보 은닉을 실현할 수 있습니다. 이는 객체의 내부 동작과 상세 내용을 숨기고 외부에는 필요한 인터페이스만 제공하여 복잡성을 낮추고 유지보수성을 향상시킵니다.

    2. 다형성 (Polymorphism): 다형성은 같은 이름의 메서드를 서로 다른 방식으로 구현하도록 하는 개념입니다. 이로써 여러 객체가 동일한 메서드 이름을 사용하면서 각자의 특성에 맞게 동작할 수 있습니다. 다형성은 코드의 재사용성과 확장성을 높이며, 객체 간의 유연한 상호작용을 가능하게 합니다.

    3. 상속성 (Inheritance): 상속은 기존의 클래스를 확장하거나 변경하여 새로운 클래스를 만드는 개념입니다. 이를 통해 공통된 속성과 동작을 상위 클래스로부터 하위 클래스로 물려받을 수 있습니다. 상속을 활용하면 코드 중복을 줄이고 기존 클래스의 기능을 재활용하여 새로운 클래스를 만들 수 있습니다.

    4. 추상화 (Abstraction): 추상화는 복잡한 현실 세계에서 중요한 개념만을 간추려 모델링하는 개념입니다. 객체지향 프로그래밍에서는 클래스를 통해 객체의 공통된 특성과 동작을 추상화하여 나타냅니다. 이를 통해 복잡한 세부 사항을 감추고 핵심 개념에 집중할 수 있습니다.

      이 네 가지 개념은 객체지향 프로그래밍의 핵심 기반을 형성하며, 복잡한 소프트웨어 시스템을 모듈화하고 유연하게 개발하며 관리하는데 도움을 줍니다.

  • 간단히 객체지향 프로그래밍(OOP)은 캡슐화로 데이터와 메서드를 묶어 정보 은닉, 다형성으로 유연한 동작, 상속성으로 기존 클래스 재활용을 지원하며, 추상화로 핵심 개념 간결화를 추구하는 개념입니다. 이 개념들을 활용하면 코드의 재사용성과 관리 용이성을 높여 복잡한 소프트웨어를 효과적으로 개발할 수 있습니다.

활용

  • 자세히 객체지향 프로그래밍(OOP)을 활용하여 다음과 같은 이점을 얻을 수 있습니다:
    1. 모듈화와 재사용성: 클래스와 객체를 이용하여 소프트웨어를 모듈화하고, 이러한 모듈을 재사용하여 개발할 수 있습니다. 기존의 클래스를 확장하거나 조합하여 새로운 기능을 구축할 수 있어 개발 속도를 높이고 코드 중복을 줄일 수 있습니다.

    2. 유지보수의 용이성: 코드를 클래스와 객체로 구성하면 변경이 필요한 부분을 더 정확하게 파악하고 수정할 수 있습니다. 이로써 소프트웨어의 유지보수가 더욱 효율적으로 이루어질 수 있습니다.

    3. 유연성과 확장성: 상속과 다형성을 통해 소프트웨어를 유연하게 확장할 수 있습니다. 새로운 기능을 추가하거나 변경할 때 기존 코드의 수정을 최소화하면서도 확장된 기능을 구현할 수 있습니다.

    4. 팀 작업의 용이성: 클래스와 객체는 현실 세계의 개념을 코드로 표현하기 때문에 팀 간의 의사소통이 원활해집니다. 각 객체의 역할과 책임이 명확하게 정의되어 협업이 용이해집니다.

    5. 코드의 가독성 향상: 객체지향 프로그래밍은 현실 세계의 개념과 유사한 코드를 작성하므로 코드의 가독성이 향상됩니다. 이로써 코드 이해와 수정이 쉬워집니다.

    6. 실제 세계와의 연결: 객체지향 프로그래밍은 현실 세계의 개념과 상호작용을 모델링하기에 적합하여 실제 세계와의 관계를 더 직관적으로 이해하고 표현할 수 있습니다.

      이러한 장점들을 활용하여 객체지향 프로그래밍을 통해 유연하고 효율적인 소프트웨어를 개발하고 관리할 수 있습니다.

  • 간단히 객체지향 프로그래밍(OOP)을 활용하면 코드를 재사용하고 유지보수하기 쉽게 만들 수 있습니다. 클래스와 객체를 이용하여 모듈화하고, 상속과 다형성을 통해 기능을 추가하거나 변경할 때 기존 코드를 건드리지 않고도 확장할 수 있습니다. 또한 코드의 가독성을 높이고 현실 세계와의 관계를 직관적으로 표현할 수 있어 팀 작업과 의사소통이 원활해지며, 소프트웨어 개발을 더 효율적으로 할 수 있습니다.

  • 객체지향 프로그래밍은 소프트웨어를 개발하는 접근법으로, 캡슐화는 데이터와 관련 메서드를 묶어 정보를 숨기고 코드의 복잡성을 낮춥니다. 다형성은 동일한 이름의 메서드를 다양한 방식으로 구현하여 객체 간 유연한 상호작용을 가능하게 합니다. 상속성은 기존 클래스를 확장하여 새로운 클래스를 만들어 기능을 재활용 할 수 있습니다. 추상화는 중요한 개념과 특성을 간추려 모델링하여 코드를 더 직관적으로 관리할 수 있게 해줍니다. 이러한 개념들을 조합하여 소프트웨어를 구축하면 코드의 재사용성과 유지 보수성을 높이고, 복잡한 시스템을 효과적으로 개발하고 관리할 수 있습니다.
  • 피드백
    • Java와 관련!
    • 캡슐화 = application.properties
    • 추상화 = Entity
    • 상속성 = extends A
    • 다형성 = Override , Overroding
      • 선언 해놓고 다른 클래스에서 불러와서 응용하거나, 다른 새로운 기능으로 작동하게 할 수 있다
      • Repository 도 다형성에 포함될 수 있다!

CS 문제 4

💡 쓰레드와 쓰레드 풀
  • 질문1 : 프로세스와 쓰레드의 차이점은 무엇인가요?
    • 답변 1
      • 프로세스는 프로그램을 실행해주는 주체이며 자신만의 고유 공간과 자원을 할당받아 사용하고 쓰레드는 작업을 처리해주는 주체이며 다른 쓰레드와 공간과 자원을 공유하면서 사용합니다. 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 쓰레드는 이 프로세스 안에서 작업을 처리하는 주체이며 실행되는 흐름 단위를 말합니다. 프로세스는 최소 하나의 쓰레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 code, heap, stack를 할당 받습니다. 하지만 쓰레드는 자원 중에 stack 만 따로 할당 받고 나머지 영역은 쓰레드끼리 서로 공유합니다.
      • 프로그램(Program) : 어떤 작업을 위해 실행할 수 있는 파일
  • 질문2 : 멀티 프로세스와 멀티 쓰레드에서 설명하고 장, 단점을 서술하세요
    • 답변 2
      • 멀티 프로세스 는 하나의 운영체제 안에서 여러 프로세스가 실행되는 것이고 멀티 쓰레드 는 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것입니다.
      • 멀티 프로세스 의 장점과 단점
        • 하나의 프로세스가 죽어도 다른 프로세스에는 영향을 끼치지 않아 안전하지만 각각 독립된 메모리 영역을 갖고 있어 작업량이 많을수록 오버헤드가 발생하고 문맥 교환(Context Switching)으로 인한 성능 저하를 유발하고 프로세스 사이의 통신이 복잡(IPC)합니다.
        • 멀티 프로세스 장점 자세히 보기 멀티 프로세스는 여러 개의 독립적인 프로세스가 동시에 실행되는 환경을 의미합니다. 멀티 프로세스 환경에서는 각각의 프로세스가 별개의 주소 공간과 자원을 가지며, 독립적으로 실행되기 때문에 여러 가지 장점을 가지고 있습니다.
          1. 병렬 처리 및 빠른 응답: 멀티 프로세스 환경에서는 여러 개의 프로세스가 동시에 실행되므로 병렬 처리가 가능해집니다. 이로 인해 작업들이 동시에 진행되어 시스템의 응답 속도가 향상될 수 있습니다.

          2. 안정성: 하나의 프로세스에 문제가 발생해도 다른 프로세스는 영향을 받지 않습니다. 이로 인해 시스템 전체의 안정성이 높아집니다.

          3. 자원 분리: 각 프로세스는 독립적인 주소 공간과 자원을 가지기 때문에 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 미치지 않습니다.

          4. 멀티 코어 활용: 현대의 컴퓨터는 멀티 코어 프로세서를 사용하므로 멀티 프로세스를 활용하여 각 코어에서 병렬 작업을 처리할 수 있습니다.

          5. 다양한 작업 분리: 각 프로세스는 서로 다른 작업을 수행하거나 독립적인 기능을 담당할 수 있습니다. 이로 인해 모듈화 및 유지 보수가 용이해집니다.

          6. 스케일 아웃: 멀티 프로세스 환경을 통해 시스템의 성능을 향상시키면서, 필요에 따라 서버를 추가하여 스케일 아웃할 수 있습니다.

          7. 다양한 운영체제 지원: 멀티 프로세스 환경은 다양한 운영체제에서 지원되므로 플랫폼 간의 이식성이 좋습니다.

          8. 안전한 리소스 공유: 멀티 프로세스 환경에서는 프로세스 간의 데이터 공유를 효율적으로 제어할 수 있어 보안 및 데이터 무결성을 보장할 수 있습니다.

            이러한 장점들로 인해 멀티 프로세스는 대규모 시스템 및 병렬 처리가 필요한 작업에 유용하게 활용됩니다.

        • 멀티 프로세스 단점 자세히 보기 멀티 프로세스 환경은 많은 이점을 제공하지만, 몇 가지 단점도 가지고 있습니다. 아래는 멀티 프로세스의 주요 단점들입니다.
          1. 자원 소비: 각 프로세스는 독립적인 주소 공간과 자원을 가지므로 프로세스 간의 자원 공유 및 통신에 추가적인 메모리 및 시간 비용이 발생합니다.

          2. 통신 비용: 프로세스 간의 통신은 공유 메모리가 아닌 IPC(Inter-Process Communication) 기법을 사용해야 합니다. 이로 인해 데이터 전달 및 동기화를 위한 오버헤드가 발생할 수 있습니다.

          3. 생성 및 소멸 비용: 프로세스의 생성 및 종료에는 비용이 많이 들어갑니다. 이로 인해 많은 프로세스를 빈번하게 생성하고 종료하는 경우 성능 저하가 발생할 수 있습니다.

          4. 문맥 교환 비용: CPU에서 실행되는 프로세스가 변경될 때마다 문맥 교환(Context Switching)이 발생합니다. 이는 오버헤드를 초래하며, 빈번한 문맥 교환은 시스템 성능을 저하시킬 수 있습니다.

          5. 동기화와 데드락: 여러 프로세스가 동시에 실행되므로 공유 자원의 접근을 제어하기 위해 동기화 메커니즘이 필요합니다. 이로 인해 경합 조건(Race Condition)이나 데드락(Deadlock)과 같은 문제가 발생할 수 있습니다.

          6. 프로그래밍 복잡성: 멀티 프로세스 환경에서 프로그래밍 및 디버깅은 단일 프로세스 환경보다 복잡합니다. 프로세스 간의 통신 및 동기화를 다루는 코드 작성이 복잡해질 수 있습니다.

          7. 시스템 자원 관리: 여러 프로세스가 동시에 실행되므로 시스템 자원을 효율적으로 관리해야 합니다. 이로 인해 프로세스 스케줄링, 메모리 관리 등의 복잡한 작업이 필요합니다.

          8. 컨텍스트 스위칭 오버헤드: 프로세스 간의 전환은 컨텍스트 스위칭을 통해 이루어집니다. 이러한 오버헤드로 인해 프로세스의 실행이 느려질 수 있습니다.

            이러한 단점들은 멀티 프로세스 환경을 설계하고 구현할 때 고려해야 할 사항입니다. 이를 최적화하거나 대안을 찾는 것이 중요합니다.

      • 멀티 쓰레드 의 장점과 단점
        • 쓰레드 사이 작업량이 작아 문맥 교환의 속도가 빨라서 시스템 원활하게 처리할 수 있고 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 가능합니다. 하지만 프로그램 디버깅, 에러 추적이 까다롭고 하나의 쓰레드에 문제가 생기면 전체적인 프로세스에 영향을 끼칩니다.
        • 멀티 쓰레드 장점 자세히 보기 멀티 쓰레드는 여러 개의 스레드가 동시에 실행되는 환경을 의미합니다. 멀티 쓰레드 환경은 많은 이점을 제공하며, 주요 장점들은 다음과 같습니다:
          1. 자원 공유 및 효율성: 멀티 쓰레드 환경에서 스레드들은 같은 프로세스 내의 자원을 공유할 수 있습니다. 이로 인해 메모리 및 시스템 자원의 효율적인 공유와 활용이 가능해집니다.

          2. 빠른 응답 및 작업 분배: 멀티 쓰레드 환경은 여러 작업을 동시에 처리할 수 있어 응답 시간이 단축됩니다. 작업을 여러 스레드로 분배하면서 빠른 처리가 가능합니다.

          3. 쓰레드 간 효율적인 통신: 같은 프로세스 내의 스레드 간 통신은 공유 메모리를 이용하므로 데이터 공유 및 통신이 간단하고 빠릅니다.

          4. 스케일 아웃: 멀티 쓰레드를 활용하면 멀티 코어 프로세서를 활용하여 병렬 작업을 처리할 수 있어 성능을 향상시킬 수 있습니다.

          5. 멀티태스킹: 멀티 쓰레드 환경에서 여러 작업을 동시에 실행하면서 멀티태스킹을 구현할 수 있습니다.

          6. 프로세스 생성 비용 감소: 스레드는 프로세스보다 생성 및 종료 비용이 적으므로 빠르게 작업을 생성하고 관리할 수 있습니다.

          7. 프로세스 간 문맥 교환 비용 감소: 스레드 간의 문맥 교환 비용은 프로세스 간 문맥 교환 비용보다 적습니다. 따라서 스레드를 사용하면 더 효율적인 작업 전환이 가능합니다.

          8. 프로그래밍 단순화: 스레드 간의 데이터 공유가 간단하며, 프로세스 간 통신보다 덜 복잡합니다. 이로 인해 프로그래밍이 상대적으로 간단해집니다.

          9. GUI 응용프로그래밍: 그래픽 사용자 인터페이스(GUI)를 갖는 응용프로그램에서는 멀티 쓰레드를 활용하여 UI 응답성을 유지하면서 백그라운드 작업을 수행할 수 있습니다.

          10. 탐색 및 정렬 알고리즘 최적화: 대용량 데이터를 정렬하거나 탐색하는 작업에서 멀티 쓰레드를 사용하여 병렬 처리를 통해 처리 시간을 단축시킬 수 있습니다.

            이러한 장점들로 인해 멀티 쓰레드는 다양한 분야에서 활용되며, 특히 병렬 처리 및 응답 시간 단축 등에서 큰 장점을 가지고 있습니다.

        • 멀티 쓰레드 단점 자세히 보기
          1. 동기화와 경합 조건: 여러 스레드가 공유 자원에 동시에 접근하면서 데이터 일관성을 유지하기 위해 동기화가 필요합니다. 동기화 처리를 잘못하거나 누락하면 경합 조건과 데이터 손실이 발생할 수 있습니다.

          2. 교착 상태(데드락): 여러 스레드가 서로의 자원을 기다리는 상태로 빠질 수 있는 교착 상태가 발생할 수 있습니다. 이러한 상태에서는 스레드가 계속 기다리면서 시스템이 멈출 수 있습니다.

          3. 성능 저하: 스레드 간의 문맥 교환(Context Switching)이 발생하면서 오버헤드가 발생할 수 있습니다. 너무 많은 스레드를 생성하거나 관리하면 오히려 성능이 저하될 수 있습니다.

          4. 디버깅 어려움: 여러 스레드가 병렬로 실행되기 때문에 스레드 간의 문제를 디버깅하거나 추적하는 것이 어려울 수 있습니다.

          5. 코드 복잡성: 스레드 간의 동기화 및 통신 코드를 작성하는 것이 복잡할 수 있습니다. 잘못된 동기화는 버그와 성능 저하를 유발할 수 있습니다.

          6. 운영체제 의존성: 스레드 스케줄링 및 관리는 운영체제에 의존적이므로 특정 운영체제에서는 다른 운영체제보다 스레드 처리가 불리할 수 있습니다.

          7. 리소스 공유 어려움: 스레드 간의 자원 공유가 어려울 수 있으며, 잘못된 자원 공유는 예상치 못한 결과를 초래할 수 있습니다.

          8. 단일 프로세서 환경 제한: 멀티 쓰레드는 병렬 처리를 위해 멀티 코어 프로세서가 필요하므로, 단일 코어 프로세서 환경에서는 성능 향상을 기대하기 어려울 수 있습니다.

          9. 자원 낭비: 멀티 쓰레드는 스레드 간의 자원 공유와 동기화 오버헤드로 인해 자원이 낭비될 수 있습니다.

            이러한 단점들을 고려하여 멀티 쓰레드 환경을 설계하고 구현할 때 주의가 필요합니다. 스레드 간의 동기화와 자원 관리를 신중하게 처리하면서 장점을 최대한 활용하고 단점을 극복하는 것이 중요합니다.

  • 질문3 : 쓰레드 풀의 정의와 사용 이유에 대해서 설명하세요
    • 답변 3
      • 쓰레드 풀의 정의
        • 컴퓨터 프로그래밍에서 쓰레드 풀은 컴퓨터 프로그램에서 실행의 동시성을 달성하기위한 소프트웨어 디자인 패턴입니다. 프로그램이 작업을 동시에 실행할 수 있도록 여러 스레드를 미리 생성해두고 유지 관리하고 여러 Thread를 동시에 만들어 실행(병렬처리)할 수 있습니다. 쓰레드 풀은 작업 처리에 사용되는 쓰레드를 제한된 개수만큼 정해 놓고 작업 큐(Queue)에 들어오는 작업들을 하나씩 쓰레드가 맡아 처리하는 것을 말합니다.
      • 쓰레드 풀을 사용하는 이유
        • 쓰레드 풀은 미리 생성된 스레드를 관리하며 작업을 할당하는데 사용됩니다. 이를 통해 스레드를 계속 만들고 없애는 번거로움(스레드 생성 오버헤드)을 줄이고 자원을 효율적으로 활용하며, 작업 처리 지연을 최소화하여 빠른 응답성을 제공합니다. 동시에 스레드 수를 제한하여 과부하를 방지하고, 자동 스레드 관리로 시스템 안정성을 강화합니다. 또한 멀티 코어 프로세서의 성능을 최대한 활용하여 작업 처리를 향상 시키고, 비동기 작업 처리로 블로킹을 최소화하여 사용자의 경험 향상에 활용될 수 있습니다.
        • 자세히 보기 쓰레드 풀은 미리 생성된 스레드들을 관리하며 작업을 분배하는 기술입니다.
          1. 자원 효율성: 스레드 풀은 미리 스레드를 생성하고 유지함으로써 스레드 생성 및 종료 비용을 절감하고, 자원의 효율적인 사용을 도모합니다.
          2. 응답성 향상: 스레드 풀은 요청이 들어올 때 미리 생성된 스레드를 할당하여 작업을 처리하므로 응답 시간을 줄여 빠른 응답성을 제공합니다.
          3. 작업 제어: 스레드 풀은 스레드의 수를 제한하거나 우선순위를 관리하여 시스템 리소스를 효율적으로 관리하며 과부하를 방지합니다.
          4. 안정성 강화: 스레드 풀은 스레드 생성 및 관리를 자동화하므로 스레드 생성 오류나 메모리 누수와 같은 문제를 줄여 시스템 안정성을 향상시킵니다.
          5. 스케일 아웃 지원: 스레드 풀은 여러 스레드가 동시에 작업을 처리하면서 멀티 코어 환경에서 성능을 향상시킬 수 있어 시스템 확장성을 지원합니다.
          6. 비동기 작업 처리: 스레드 풀을 사용하면 여러 비동기 작업을 동시에 처리하면서 블로킹을 최소화하여 응답성을 높일 수 있습니다.
  • 화요일로!?
  • 레디스는 DB처럼 안보여서 답답하다 → 보는 방법이 있다!
  • 매번 헷갈리는 머지 (Merge)
    • Merge ‘A’ into ‘B’
    • B : 현재 선택한 브랜치 = 머지 받을 브랜치
    • A : 선택해야 할 브랜치 = 머지 넣어야 할 브랜치
    • B를 선택(체크아웃)한 상태로 A를 선택(머지) 넣으면 된다!
  • 포스트맨 합치기
  • DataBase에서 + 에서 redis 추가!
  • 0@localhost : 0, 1, 2 … 같은 이름으로 생성된다!
    • 따로 이름 설정을 못함
  • entity - redishash
    • Blacklist : 로그아웃
    • EmailVerification : 이메일 인증
    • RefreshToken : 로그인(JWT 토큰과 같이 생기는!)
      • JWT 토큰이 만료되면 바로 로그아웃 되지만 RefreshToken(기간 설정 가능)으로 인해 자동 로그인 가능!
    • SmsVerification : 핸드폰 인증
  • application.properties - # Redis
    • Redis가 해킹 당할 수도 있기 때문에 비밀번호를 걸어줘야 할 수도!

    • window cli… 콘솔 같은 곳에서 확인? 작업?

      # Redis
      spring.data.redis.host=localhost
      spring.data.redis.port=6379
      spring.data.redis.password=
      spring.data.redis.database=0
    • SMS 인증 관련(환경 변수)

      # CoolSMS
      coolsms.api.key=${SMS_API_KEY}
      coolsms.api.secret=${SMS_SECRET_KEY}
  • 환경 변수
    • 런타임 설정에 - Edit Configuration - 엔바이러먼트 에서 문서 아이콘 클릭해서 + 로 추가
  • Comment가 Postman에서 실행 안되는 오류 해결하기
    • CommentRequestDto에 어노테이션 추가!!
      @AllArgsConstructor
      @NoArgsConstructor
  • PostRequestDto에 @AllArgsConstructor와 @NoArgsConstructor가 없어도 생성이 되는데 왜 CommentRequestDto는 @AllArgsConstructor와 @NoArgsConstructor가 없으면 생성이 되지 않는가?
    • JAVA Build와 관련?!

Follow

@ResponseBody

  • @Controller가 붙어 있어서 View(HTML)로 보여주기(반환) 때문에 @ResponseBody를 붙여서 JSON으로 보여줄 수 있음
  • 설명 @ResponseBody 애노테이션은 스프링 프레임워크에서 사용되는 애노테이션 중 하나로, 컨트롤러의 메서드가 반환하는 값을 HTTP 응답 본문으로 설정하는 역할을 합니다. 이 애노테이션을 사용하면 메서드의 반환값이 뷰(View)를 통하지 않고 직접 HTTP 응답으로 전달됩니다. 주로 RESTful API 개발 시에 사용되며, JSON이나 XML과 같은 형식으로 데이터를 반환할 때 편리하게 사용할 수 있습니다. 즉, @ResponseBody 애노테이션을 사용하면 컨트롤러의 메서드가 반환하는 객체가 자동으로 JSON 또는 XML 형식으로 변환되어 HTTP 응답 본문에 담겨 클라이언트에게 전달됩니다. 예를 들어, 주어진 코드에서 following 메서드의 반환값이 없으므로, 클라이언트에게 아무런 데이터를 전달하지 않을 때에도 @ResponseBody를 사용하는 경우입니다. 이 경우, 메서드의 실행이 완료되면 HTTP 응답의 본문이 비어있게 됩니다. 만약 @ResponseBody를 사용하지 않으면 스프링은 메서드의 반환값을 뷰 이름으로 해석하려고 시도하며, 해당하는 뷰를 찾아 렌더링하려고 시도할 것입니다. REST API에서는 JSON이나 XML과 같은 데이터 형식을 반환하므로 @ResponseBody를 사용하여 데이터를 직접 응답 본문으로 전달하는 것이 일반적입니다.
  • @RequestBody는 파라미터 안에서 받아주고 @ResponseBody는 메서드 위에!
    • @ResponseBody
      @PostMapping("/{id}")
          @ResponseBody
          public void following(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable Long id) {
              followService.following(userDetails, id);
          }
    • @RequestBody
      @PostMapping("/{postId}/comment")
          public ResponseEntity<ApiResponseDto> createComment(@PathVariable Long postId, @AuthenticationPrincipal UserDetailsImpl userDetails, @RequestBody CommentRequestDto commentRequestDto) {
              commentService.createComment(postId, userDetails.getUser(), commentRequestDto);
              return ResponseEntity.ok().body(new ApiResponseDto("댓글 생성 성공", HttpStatus.OK.value()));
          }
  • 팔로우 서비스
    • 팔로우레포지토리 디비 저장 빌더 패턴으로 바꾸기
      // followRepository DB 저장
              followRepository.save(new Follow(followingUsers, followerUser));
      // followRepository DB 저장
              followRepository.save(Follow.builder()
                      .user(followerUser)
                      .followingUser(followingUsers)
                      .followingDateTime(LocalDateTime.now())
                      .build());
profile
공부하자개발하자으쌰으쌰

0개의 댓글