보안 강화: HTTP는 데이터를 평문으로 전송하여 중간에서 엿볼 가능성이 있습니다. 반면 HTTPS는 SSL 또는 TLS 프로토콜을 이용하여 데이터를 암호화하고 보호하여 해킹과 데이터 도난을 방지합니다.
암호화: HTTP는 암호화하지 않고 데이터를 전송하므로 민감한 정보가 쉽게 노출될 수 있습니다. HTTPS는 데이터를 암호화하여 해독하기 어렵게 만들어 보안을 강화합니다.
포트: HTTP는 기본 포트 80을 사용하며, HTTPS는 기본 포트 443을 사용합니다. 이를 통해 서버와 클라이언트가 어떤 프로토콜을 사용할지 식별합니다.
인증서: HTTPS는 SSL/TLS 인증서를 요구합니다. 이 인증서는 웹 서버의 신원을 확인하고 클라이언트에게 안전한 연결임을 보장합니다.
검색 엔진 랭킹: HTTPS를 사용하는 웹사이트는 검색 엔진에서 높은 순위를 받을 가능성이 높습니다. 구글과 같은 검색 엔진은 HTTPS를 선호하며, 사용자에게 더 안전한 사이트임을 알려줍니다.
사용자 신뢰: HTTPS는 주소창에 자물쇠 아이콘과 "안전함" 표시 등을 통해 사용자에게 신뢰성을 전달하며, 데이터의 안전한 전송을 보장합니다.
데이터 무결성: HTTPS는 데이터의 무결성을 보호하여 중간에 데이터가 조작되지 않도록 합니다.
보안 인증: HTTPS는 웹사이트의 신원을 인증하기 위해 SSL/TLS 인증서를 사용하며, 사용자는 웹사이트가 신뢰할 수 있는지 확인할 수 있습니다.
쿠키 보안: HTTPS를 사용하면 쿠키와 같은 민감한 정보도 암호화되어 전송되므로 해커가 이를 탈취하여 악용하는 것을 방지합니다.
보안 헤더: HTTPS는 보안 헤더를 사용하여 웹사이트의 취약점을 최소화하고 보안 상태를 강화합니다.
요약하면, HTTP와 HTTPS의 주요 차이는 데이터의 보안 강화와 신뢰성 측면에서 나타납니다. HTTPS는 데이터 암호화와 웹사이트 보안을 강화하여 사용자와 서버 간의 안전한 통신을 제공합니다.
놀이공원에서 친구에게 메모를 보내려고 해봅시다.
의존성 주입(Dependency Injection, DI)은 소프트웨어 개발에서 사용되는 디자인 패턴으로, 객체 간의 의존 관계를 느슨하게 만들고 코드의 재사용성과 테스트 용이성을 향상시키는데 목적이 있습니다. DI는 객체가 필요로 하는 의존성을 외부에서 주입받는 방식으로 동작합니다. 이를 통해 객체가 직접 의존성을 생성하지 않고 외부에서 주입받기 때문에 결합도를 낮추고 유연한 코드를 작성할 수 있습니다.
제어의 역전(Inversion of Control, IoC)은 소프트웨어 개발에서 사용되는 개념으로, 컴포넌트의 생명주기와 실행 흐름의 제어를 프레임워크나 컨테이너로부터 가져오는 것을 의미합니다. 일반적으로 애플리케이션 코드가 아닌 외부의 제어 플로우가 컴포넌트를 생성하고 관리합니다. 이로써 애플리케이션의 모듈성과 확장성을 향상시킬 수 있습니다. IoC는 의존성 주입(DI)과 함께 사용되어 코드의 유연성을 증가시키는데 기여합니다.
의존성 주입(Dependency Injection, DI)과 제어의 역전(Inversion of Control, IoC)는 소프트웨어 디자인 패턴으로, 소프트웨어 컴포넌트 간의 결합도를 낮추고 유연성과 테스트 용이성을 향상시키는데 사용됩니다.
간단히 말하면, DI와 IoC는 컴포넌트 간의 결합도를 줄이고 유연한 설계를 가능하게 하는 패턴으로, 의존성 주입은 컴포넌트가 서로 독립적으로 작동하게 하며, 제어의 역전은 애플리케이션의 제어 흐름을 외부에서 관리하여 모듈성과 확장성을 높입니다.
캡슐화 (Encapsulation): 캡슐화는 객체의 데이터와 그 데이터를 다루는 메서드를 하나로 묶는 개념입니다. 이렇게 데이터와 관련 메서드를 함께 묶어 캡슐화하면 객체 외부에서 직접 접근하는 것을 제한할 수 있어 정보 은닉을 실현할 수 있습니다. 이는 객체의 내부 동작과 상세 내용을 숨기고 외부에는 필요한 인터페이스만 제공하여 복잡성을 낮추고 유지보수성을 향상시킵니다.
다형성 (Polymorphism): 다형성은 같은 이름의 메서드를 서로 다른 방식으로 구현하도록 하는 개념입니다. 이로써 여러 객체가 동일한 메서드 이름을 사용하면서 각자의 특성에 맞게 동작할 수 있습니다. 다형성은 코드의 재사용성과 확장성을 높이며, 객체 간의 유연한 상호작용을 가능하게 합니다.
상속성 (Inheritance): 상속은 기존의 클래스를 확장하거나 변경하여 새로운 클래스를 만드는 개념입니다. 이를 통해 공통된 속성과 동작을 상위 클래스로부터 하위 클래스로 물려받을 수 있습니다. 상속을 활용하면 코드 중복을 줄이고 기존 클래스의 기능을 재활용하여 새로운 클래스를 만들 수 있습니다.
추상화 (Abstraction): 추상화는 복잡한 현실 세계에서 중요한 개념만을 간추려 모델링하는 개념입니다. 객체지향 프로그래밍에서는 클래스를 통해 객체의 공통된 특성과 동작을 추상화하여 나타냅니다. 이를 통해 복잡한 세부 사항을 감추고 핵심 개념에 집중할 수 있습니다.
이 네 가지 개념은 객체지향 프로그래밍의 핵심 기반을 형성하며, 복잡한 소프트웨어 시스템을 모듈화하고 유연하게 개발하며 관리하는데 도움을 줍니다.
모듈화와 재사용성: 클래스와 객체를 이용하여 소프트웨어를 모듈화하고, 이러한 모듈을 재사용하여 개발할 수 있습니다. 기존의 클래스를 확장하거나 조합하여 새로운 기능을 구축할 수 있어 개발 속도를 높이고 코드 중복을 줄일 수 있습니다.
유지보수의 용이성: 코드를 클래스와 객체로 구성하면 변경이 필요한 부분을 더 정확하게 파악하고 수정할 수 있습니다. 이로써 소프트웨어의 유지보수가 더욱 효율적으로 이루어질 수 있습니다.
유연성과 확장성: 상속과 다형성을 통해 소프트웨어를 유연하게 확장할 수 있습니다. 새로운 기능을 추가하거나 변경할 때 기존 코드의 수정을 최소화하면서도 확장된 기능을 구현할 수 있습니다.
팀 작업의 용이성: 클래스와 객체는 현실 세계의 개념을 코드로 표현하기 때문에 팀 간의 의사소통이 원활해집니다. 각 객체의 역할과 책임이 명확하게 정의되어 협업이 용이해집니다.
코드의 가독성 향상: 객체지향 프로그래밍은 현실 세계의 개념과 유사한 코드를 작성하므로 코드의 가독성이 향상됩니다. 이로써 코드 이해와 수정이 쉬워집니다.
실제 세계와의 연결: 객체지향 프로그래밍은 현실 세계의 개념과 상호작용을 모델링하기에 적합하여 실제 세계와의 관계를 더 직관적으로 이해하고 표현할 수 있습니다.
이러한 장점들을 활용하여 객체지향 프로그래밍을 통해 유연하고 효율적인 소프트웨어를 개발하고 관리할 수 있습니다.
캡슐화는 데이터와 관련 메서드를 묶어 정보를 숨기고 코드의 복잡성을 낮춥니다. 다형성은 동일한 이름의 메서드를 다양한 방식으로 구현하여 객체 간 유연한 상호작용을 가능하게 합니다. 상속성은 기존 클래스를 확장하여 새로운 클래스를 만들어 기능을 재활용 할 수 있습니다. 추상화는 중요한 개념과 특성을 간추려 모델링하여 코드를 더 직관적으로 관리할 수 있게 해줍니다. 이러한 개념들을 조합하여 소프트웨어를 구축하면 코드의 재사용성과 유지 보수성을 높이고, 복잡한 시스템을 효과적으로 개발하고 관리할 수 있습니다.application.propertiesEntityextends AOverride , Overroding프로세스는 프로그램을 실행해주는 주체이며 자신만의 고유 공간과 자원을 할당받아 사용하고 쓰레드는 작업을 처리해주는 주체이며 다른 쓰레드와 공간과 자원을 공유하면서 사용합니다. 프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 쓰레드는 이 프로세스 안에서 작업을 처리하는 주체이며 실행되는 흐름 단위를 말합니다. 프로세스는 최소 하나의 쓰레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 code, heap, stack를 할당 받습니다. 하지만 쓰레드는 자원 중에 stack 만 따로 할당 받고 나머지 영역은 쓰레드끼리 서로 공유합니다.멀티 프로세스 는 하나의 운영체제 안에서 여러 프로세스가 실행되는 것이고 멀티 쓰레드 는 하나의 프로세스가 여러 작업을 여러 쓰레드를 사용해 동시에 처리하는 것입니다.멀티 프로세스 의 장점과 단점멀티 프로세스 장점 자세히 보기 멀티 프로세스는 여러 개의 독립적인 프로세스가 동시에 실행되는 환경을 의미합니다. 멀티 프로세스 환경에서는 각각의 프로세스가 별개의 주소 공간과 자원을 가지며, 독립적으로 실행되기 때문에 여러 가지 장점을 가지고 있습니다.병렬 처리 및 빠른 응답: 멀티 프로세스 환경에서는 여러 개의 프로세스가 동시에 실행되므로 병렬 처리가 가능해집니다. 이로 인해 작업들이 동시에 진행되어 시스템의 응답 속도가 향상될 수 있습니다.
안정성: 하나의 프로세스에 문제가 발생해도 다른 프로세스는 영향을 받지 않습니다. 이로 인해 시스템 전체의 안정성이 높아집니다.
자원 분리: 각 프로세스는 독립적인 주소 공간과 자원을 가지기 때문에 하나의 프로세스에서 발생한 오류가 다른 프로세스에 영향을 미치지 않습니다.
멀티 코어 활용: 현대의 컴퓨터는 멀티 코어 프로세서를 사용하므로 멀티 프로세스를 활용하여 각 코어에서 병렬 작업을 처리할 수 있습니다.
다양한 작업 분리: 각 프로세스는 서로 다른 작업을 수행하거나 독립적인 기능을 담당할 수 있습니다. 이로 인해 모듈화 및 유지 보수가 용이해집니다.
스케일 아웃: 멀티 프로세스 환경을 통해 시스템의 성능을 향상시키면서, 필요에 따라 서버를 추가하여 스케일 아웃할 수 있습니다.
다양한 운영체제 지원: 멀티 프로세스 환경은 다양한 운영체제에서 지원되므로 플랫폼 간의 이식성이 좋습니다.
안전한 리소스 공유: 멀티 프로세스 환경에서는 프로세스 간의 데이터 공유를 효율적으로 제어할 수 있어 보안 및 데이터 무결성을 보장할 수 있습니다.
이러한 장점들로 인해 멀티 프로세스는 대규모 시스템 및 병렬 처리가 필요한 작업에 유용하게 활용됩니다.
멀티 프로세스 단점 자세히 보기 멀티 프로세스 환경은 많은 이점을 제공하지만, 몇 가지 단점도 가지고 있습니다. 아래는 멀티 프로세스의 주요 단점들입니다.자원 소비: 각 프로세스는 독립적인 주소 공간과 자원을 가지므로 프로세스 간의 자원 공유 및 통신에 추가적인 메모리 및 시간 비용이 발생합니다.
통신 비용: 프로세스 간의 통신은 공유 메모리가 아닌 IPC(Inter-Process Communication) 기법을 사용해야 합니다. 이로 인해 데이터 전달 및 동기화를 위한 오버헤드가 발생할 수 있습니다.
생성 및 소멸 비용: 프로세스의 생성 및 종료에는 비용이 많이 들어갑니다. 이로 인해 많은 프로세스를 빈번하게 생성하고 종료하는 경우 성능 저하가 발생할 수 있습니다.
문맥 교환 비용: CPU에서 실행되는 프로세스가 변경될 때마다 문맥 교환(Context Switching)이 발생합니다. 이는 오버헤드를 초래하며, 빈번한 문맥 교환은 시스템 성능을 저하시킬 수 있습니다.
동기화와 데드락: 여러 프로세스가 동시에 실행되므로 공유 자원의 접근을 제어하기 위해 동기화 메커니즘이 필요합니다. 이로 인해 경합 조건(Race Condition)이나 데드락(Deadlock)과 같은 문제가 발생할 수 있습니다.
프로그래밍 복잡성: 멀티 프로세스 환경에서 프로그래밍 및 디버깅은 단일 프로세스 환경보다 복잡합니다. 프로세스 간의 통신 및 동기화를 다루는 코드 작성이 복잡해질 수 있습니다.
시스템 자원 관리: 여러 프로세스가 동시에 실행되므로 시스템 자원을 효율적으로 관리해야 합니다. 이로 인해 프로세스 스케줄링, 메모리 관리 등의 복잡한 작업이 필요합니다.
컨텍스트 스위칭 오버헤드: 프로세스 간의 전환은 컨텍스트 스위칭을 통해 이루어집니다. 이러한 오버헤드로 인해 프로세스의 실행이 느려질 수 있습니다.
이러한 단점들은 멀티 프로세스 환경을 설계하고 구현할 때 고려해야 할 사항입니다. 이를 최적화하거나 대안을 찾는 것이 중요합니다.
멀티 쓰레드 의 장점과 단점멀티 쓰레드 장점 자세히 보기 멀티 쓰레드는 여러 개의 스레드가 동시에 실행되는 환경을 의미합니다. 멀티 쓰레드 환경은 많은 이점을 제공하며, 주요 장점들은 다음과 같습니다:자원 공유 및 효율성: 멀티 쓰레드 환경에서 스레드들은 같은 프로세스 내의 자원을 공유할 수 있습니다. 이로 인해 메모리 및 시스템 자원의 효율적인 공유와 활용이 가능해집니다.
빠른 응답 및 작업 분배: 멀티 쓰레드 환경은 여러 작업을 동시에 처리할 수 있어 응답 시간이 단축됩니다. 작업을 여러 스레드로 분배하면서 빠른 처리가 가능합니다.
쓰레드 간 효율적인 통신: 같은 프로세스 내의 스레드 간 통신은 공유 메모리를 이용하므로 데이터 공유 및 통신이 간단하고 빠릅니다.
스케일 아웃: 멀티 쓰레드를 활용하면 멀티 코어 프로세서를 활용하여 병렬 작업을 처리할 수 있어 성능을 향상시킬 수 있습니다.
멀티태스킹: 멀티 쓰레드 환경에서 여러 작업을 동시에 실행하면서 멀티태스킹을 구현할 수 있습니다.
프로세스 생성 비용 감소: 스레드는 프로세스보다 생성 및 종료 비용이 적으므로 빠르게 작업을 생성하고 관리할 수 있습니다.
프로세스 간 문맥 교환 비용 감소: 스레드 간의 문맥 교환 비용은 프로세스 간 문맥 교환 비용보다 적습니다. 따라서 스레드를 사용하면 더 효율적인 작업 전환이 가능합니다.
프로그래밍 단순화: 스레드 간의 데이터 공유가 간단하며, 프로세스 간 통신보다 덜 복잡합니다. 이로 인해 프로그래밍이 상대적으로 간단해집니다.
GUI 응용프로그래밍: 그래픽 사용자 인터페이스(GUI)를 갖는 응용프로그램에서는 멀티 쓰레드를 활용하여 UI 응답성을 유지하면서 백그라운드 작업을 수행할 수 있습니다.
탐색 및 정렬 알고리즘 최적화: 대용량 데이터를 정렬하거나 탐색하는 작업에서 멀티 쓰레드를 사용하여 병렬 처리를 통해 처리 시간을 단축시킬 수 있습니다.
이러한 장점들로 인해 멀티 쓰레드는 다양한 분야에서 활용되며, 특히 병렬 처리 및 응답 시간 단축 등에서 큰 장점을 가지고 있습니다.
멀티 쓰레드 단점 자세히 보기동기화와 경합 조건: 여러 스레드가 공유 자원에 동시에 접근하면서 데이터 일관성을 유지하기 위해 동기화가 필요합니다. 동기화 처리를 잘못하거나 누락하면 경합 조건과 데이터 손실이 발생할 수 있습니다.
교착 상태(데드락): 여러 스레드가 서로의 자원을 기다리는 상태로 빠질 수 있는 교착 상태가 발생할 수 있습니다. 이러한 상태에서는 스레드가 계속 기다리면서 시스템이 멈출 수 있습니다.
성능 저하: 스레드 간의 문맥 교환(Context Switching)이 발생하면서 오버헤드가 발생할 수 있습니다. 너무 많은 스레드를 생성하거나 관리하면 오히려 성능이 저하될 수 있습니다.
디버깅 어려움: 여러 스레드가 병렬로 실행되기 때문에 스레드 간의 문제를 디버깅하거나 추적하는 것이 어려울 수 있습니다.
코드 복잡성: 스레드 간의 동기화 및 통신 코드를 작성하는 것이 복잡할 수 있습니다. 잘못된 동기화는 버그와 성능 저하를 유발할 수 있습니다.
운영체제 의존성: 스레드 스케줄링 및 관리는 운영체제에 의존적이므로 특정 운영체제에서는 다른 운영체제보다 스레드 처리가 불리할 수 있습니다.
리소스 공유 어려움: 스레드 간의 자원 공유가 어려울 수 있으며, 잘못된 자원 공유는 예상치 못한 결과를 초래할 수 있습니다.
단일 프로세서 환경 제한: 멀티 쓰레드는 병렬 처리를 위해 멀티 코어 프로세서가 필요하므로, 단일 코어 프로세서 환경에서는 성능 향상을 기대하기 어려울 수 있습니다.
자원 낭비: 멀티 쓰레드는 스레드 간의 자원 공유와 동기화 오버헤드로 인해 자원이 낭비될 수 있습니다.
이러한 단점들을 고려하여 멀티 쓰레드 환경을 설계하고 구현할 때 주의가 필요합니다. 스레드 간의 동기화와 자원 관리를 신중하게 처리하면서 장점을 최대한 활용하고 단점을 극복하는 것이 중요합니다.
+ 에서 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}
+ 로 추가@AllArgsConstructor
@NoArgsConstructor@ResponseBody 애노테이션은 스프링 프레임워크에서 사용되는 애노테이션 중 하나로, 컨트롤러의 메서드가 반환하는 값을 HTTP 응답 본문으로 설정하는 역할을 합니다. 이 애노테이션을 사용하면 메서드의 반환값이 뷰(View)를 통하지 않고 직접 HTTP 응답으로 전달됩니다. 주로 RESTful API 개발 시에 사용되며, JSON이나 XML과 같은 형식으로 데이터를 반환할 때 편리하게 사용할 수 있습니다. 즉, @ResponseBody 애노테이션을 사용하면 컨트롤러의 메서드가 반환하는 객체가 자동으로 JSON 또는 XML 형식으로 변환되어 HTTP 응답 본문에 담겨 클라이언트에게 전달됩니다. 예를 들어, 주어진 코드에서 following 메서드의 반환값이 없으므로, 클라이언트에게 아무런 데이터를 전달하지 않을 때에도 @ResponseBody를 사용하는 경우입니다. 이 경우, 메서드의 실행이 완료되면 HTTP 응답의 본문이 비어있게 됩니다. 만약 @ResponseBody를 사용하지 않으면 스프링은 메서드의 반환값을 뷰 이름으로 해석하려고 시도하며, 해당하는 뷰를 찾아 렌더링하려고 시도할 것입니다. REST API에서는 JSON이나 XML과 같은 데이터 형식을 반환하므로 @ResponseBody를 사용하여 데이터를 직접 응답 본문으로 전달하는 것이 일반적입니다.@PostMapping("/{id}")
@ResponseBody
public void following(@AuthenticationPrincipal UserDetailsImpl userDetails, @PathVariable Long id) {
followService.following(userDetails, id);
}@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());