분류 전체보기

·프로젝트
분명히 Nginx를 종료했는데도 브라우저에서는 여전히 페이지가 열리는 것을 확인할 수 있습니다. 하지만 다른 브라우저로 시도해보면 페이지가 보이지 않습니다.또한 새로고침했을 때는 페이지가 보이지 않습니다. 이런 현상이 발생하는 이유는 브라우저 캐싱 때문입니다.배경지식 : 캐시 & 캐싱캐시(Cache) : 자주 사용하는 데이터를 미리 복사해 놓는 임시 저장소.캐싱(Caching) : 캐시를 사용하는 기술. 캐시를 사용하는 이유는 성능 때문입니다. 캐시는 사용자와 가깝게 위치해 데이터를 사용자에게 빠르게 전달할 수 있습니다. 즉 캐시에 있는 데이터를 사용할 때마다 원본 데이터를 조회할 때 사용되는 리소스가 절약됩니다. 이러한 구조 덕분에 같은 데이터를 반복적으로 사용하는 경우 절약되는 리소스가 대폭 상승해 ..
·프로젝트
개념WEB 서버의 가장 기본적인 기능은 정적 컨텐츠(Static Content)를 제공하는 것입니다. 정적 컨텐츠란 이미 완성된 상태의 컨텐츠를 의미합니다. 즉, 컨텐츠를 생성하기 위해 DB 데이터를 조회하거나 특정 로직을 수행하는 과정 없이, 사용자에게 즉시 전달할 수 있는 형태의 컨텐츠를 말합니다. 대표적으로 이미지, HTML, CSS, JavaScript 파일 등이 정적 컨텐츠에 속합니다.목적WEB 서버가 정적 컨텐츠를 제공하는 가장 큰 이유는 WAS 서버의 부담을 줄여주는 것입니다. WAS 서버는 DB를 조회, 비즈니스 로직 수행, 동적 컨텐츠 생성..등 담당하는 일이 겁나게 많습니다. 여기에 단순 작업인 정적 컨텐츠 제공까지 WAS가 맡게 되면 서버 부하가 증가할 수밖에 없습니다.Nginx 설정..
·프로젝트
Local 환경프로젝트를 먼저 Local 환경에서 구현하려고 합니다.이 과정을 거치면, 이후 클라우드 플랫폼에 배포할 때 발생하는 문제가 클라우드 환경 때문인지, 프로젝트 자체의 문제인지 명확히 구분할 수 있을 것이라 생각합니다.설치 환경사용 기기 : Mac Book pro 14OS : Mac OS Sequoia 15.6.1패키지 관리 프로그램 : Homebrew 5.0.3설치 및 구동설치명령어 : brew install nginx터미널에서 brew 명령어로 nginx를 설치한 화면입니다. 천천히 읽어보면 다음과 같은 정보를 알 수 있습니다.문서 경로 : opt/homebrew/var/www기본 포트 번호 : 8080Nginx가 로드하는 파일 경로 : opt/homebrew/etc/nginx/server..
·프로젝트
Nginx의 탄생 배경Apache 서버Apache 서버는 클라이언트로부터 요청을 수신하면 연결(Connection)을 형성하기 위해 새로운 프로세스를 생성합니다. 이때 프로세스를 미리 준비해 두는 Pre-fork 방식을 통해 서비스 품질을 향상시켰습니다. 또한 연결을 생성하는 과정에는 상당한 자원과 시간이 소요되기 때문에, 한 번 생성된 연결을 일정 시간 유지하여 자원 사용의 효율성을 높였습니다. HTTP 헤더에서 자주 보이는 Keep-Alive: timeout 값은 바로 이 유지 시간을 의미합니다. 이와 같은 단순하고 명확한 구조는 개발 난이도를 낮추면서도 확장성 측면에서 유리한 장점을 제공합니다.Apache 서버의 단점하지만 이런 구조가 장점만 가지고 있는 것은 아니었습니다.Pre-fork로 인한 메..
·프로젝트
기획의도웹 서비스의 구조를 직접 구현하고 운영하며 실제 운영 환경과 유사한 인프라 구성을 경험하고자 이번 프로젝트를 시작합니다.최근 웹 서비스 구조에 대해 공부하면서 서비스가 실제로 동작하는 과정에 대해 관심이 생겼습니다. 특히 서비스 운영 환경에서 Web 서버가 담당하는 기능이 정말 다양하며, 서비스 성능과 안정성에 직접적인 영향을 준다는 점을 알게 되었습니다. 더 나아가 직접 해당 기능들을 사용하고 측정해보고 싶다는 생각이 들어 이번 프로젝트를 진행하기로 했습니다. 그래서 이번 프로젝트의 초점을 WEB 서버의 기능에 맞춰서 진행하려고 합니다.기대효과전체적인 웹 서비스의 흐름을 경험웹 관련 CS 지식 체화 ( 특히 WEB 서버의 기능 관련 )앞으로의 프로젝트 운영 환경의 기본 뼈대 구현전체 구조 프로젝..
·CS
항상 프로젝트를 시작할 때 항상 패키지 구조에 대한 고민을 하게 됩니다. 적어도 저는 그런 것 같습니다. 팀 프로젝트에선 어떤 패키지 구조를 사용할지 논의를 하다 과열되어 시간을 허비한 적도 있습니다. 이처럼 자주 사용되는 개념이라면 적어도 한 번은 공부해 보는 게 좋을 것 같다는 생각에 이번 글을 작성합니다. 정의패키지 구조란 파일들을 논리적으로 구분하고 조직화하는 방식을 말합니다.즉, 파일을 아무 데나 두는 것이 아니라, 어떠한 기준(계층, 도메인, 기능...)에 따라 묶어놓은 구조를 뜻합니다. 장점도서관에 갔다고 상상해 보겠습니다. 1. 가독성만약 책이 여기저기 널브러져 있다면 원하는 책을 찾기 쉽지 않을 것입니다. 하지만 책들이 전부 책장에 꽂혀 있다면? 더 수월하게 책을 찾을 수 있습니다. 더..
·CS
Spring을 공부하면서 핵심 개념인 DI에 대해 좀 더 자세히 알아볼 필요를 느껴 이번 포스트를 작성했습니다.이번 포스트에서는 자세한 구현보다는, 각 방법의 특징을 주로 살펴보려고 합니다. DI의 종류DI의 방법은 Constructor DI, Setter DI, Field DI 이렇게 3가지 입니다. Spring 공식문서에서는 Field DI, Setter DI 보다는 Constructor DI를 권장하고 있습니다. ( Spring 공식 문서 : Constructor vs Setter ) Constructor DI : 생성자 주입특징첫 번째, Spring에 대한 의존도가 낮습니다. 생성자 주입은 DI Container의 도움 없이 생성자를 통해 의존성을 직접 주입할 수 있습니다. 즉 의존성 주입에 Sp..
·CS
개념final 키워드는 변경 불가능, 즉 불변성(immutability)을 나타내는 키워드입니다. final 키워드가 적용된 [ 변수, 메서드, 클래스 ]는 반드시 초기화되어야 하며, 이후에는 값을 변경할 수 없습니다. 따라서 Null을 방지하고, 중간에 실수로 값이 변경하는 일이 불가능하기 때문에 안전성이 증가합니다. 주의점Java에서 final 키워드가 적용된 필드는 선언과 동시에 초기화 하거나, 생성자에서 초기화해야 합니다. 그렇지 않으면 컴파일러가 미리 에러( might not have been initialize )를 발생시킵니다. Spring DI와의 관계오직 생성자 DI(Constructor DI)만이 final 키워드를 사용할 수 있습니다. 그 이유는 주의점에서 말한 것처럼, final은 ..
forrest13
'분류 전체보기' 카테고리의 글 목록