[멋사 클라우드 5기] Day 40 - Dockerfile
·
Learning Log
Dockerfile이란Dockerfile은 Docker Image를 빌드하기 위한 명령어들의 집합이다. 텍스트 파일 형식으로 작성하며, 어떤 베이스 이미지 위에서 어떤 패키지를 설치하고, 어떤 코드를 복사하고, 어떻게 실행할지를 순서대로 정의한다.Dockerfile을 작성하고 docker build 명령어를 실행하면, Docker는 이 파일을 위에서부터 한 줄씩 읽어 Image를 만든다.docker build -t my-app:v1.0 .# -t: 태그(이름) 지정# .: 현재 디렉토리의 Dockerfile을 사용Dockerfile 기본 명령어간단한 Python 웹 앱 Dockerfile을 예시로 각 명령어를 살펴보자FROM python:3.11-slimWORKDIR /appCOPY requirement..
[멋사 클라우드 5기] Day 39 - Docker Image & Container
·
Learning Log
Docker란 무엇인가Docker는 컨테이너(Container) 기반의 오픈소스 가상화 플랫폼이다.개발하다 보면 이런 경험을 한 번쯤 하게 된다. 내 컴퓨터에서는 잘 되는 코드가 친구 컴퓨터나 서버에 올리면 오류가 난다. 운영체제, 설치된 라이브러리 버전, 환경변수 등이 서로 다르기 때문이다.Docker는 이 문제를 해결한다. 애플리케이션 코드와 그것이 실행되기 위해 필요한 모든 것(런타임, 라이브러리, 설정 등)을 하나의 컨테이너로 묶는다. 컨테이너는 어디서 실행하든 항상 동일한 환경을 보장한다.VM과 Docker의 차이Docker와 VM(가상머신) 둘 다 격리된 환경을 만들지만, 동작 방식이 다르다.VM은 하드웨어를 가상화한다. 그 위에 독립적인 운영체제(Guest OS)를 올리기 때문에 크기가 크고..
[멋사 클라우드 5기] Day 37 & 38 - Linux (3)
·
Learning Log
Chapter 18. 환경변수 & 셸 설정환경변수환경변수(Environment Variable)는 운영체제가 프로세스에게 전달하는 이름=값 형태의 설정 정보이다. 프로세스는 환경변수를 통해 자신이 실행되는 환경에 대한 정보를 얻는다.환경변수는 리눅스뿐만 아니라 모든 운영체제에 존재하는 개념이며, 애플리케이션 설정을 코드와 분리하는 핵심 메커니즘이다.셸 변수 vs 환경변수이 둘은 자주 혼동되지만 범위가 다르다:셸 변수: 현재 셸 안에서만 유효하다. 자식 프로세스에 전달되지 않는다.환경변수: export로 내보내면 자식 프로세스에도 상속된다.# 셸 변수 (현재 셸에서만 유효)MY_VAR="hello"echo $MY_VAR # hellobash -c 'echo $MY_VAR' # (빈 출력 ..
[멋사 클라우드 5기] Day 35 & 36 - Linux (2)
·
Learning Log
Chapter 10. 텍스트 정렬, 집계 & 비교grep, sed, awkgrep, sed, awk 는 단독으로도 유용하지만, 파이프(|)로 연결하여 데이터 분석 파이프라인을 구성할 때 더 많은 작업을 할 수 있다.# 로그에서 IP별 접속 횟수 상위 10개awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10sort — 텍스트 정렬sort는 입력을 줄 단위로 정렬한다. 기본은 알파벳(사전) 순서이다.# 알파벳순 정렬sort names.txt# 역순 정렬 (-r: reverse)sort -r names.txt# 숫자순 정렬 (-n: numeric) ★sort -n numbers.txt# 숫자 정렬 없이 하면: 1, 10, 100, 2, 20 ..
[멋사 클라우드 5기] Day 33 & 34 - Linux (1)
·
Learning Log
Chapter 01. 리눅스 개요리눅스란 무엇인가리눅스(Linux)는 오픈소스 운영체제(Operating System)이다. 정확히 말하면, 리눅스는 커널(Kernel)의 이름이다. 커널이란 하드웨어와 소프트웨어 사이에서 중재자 역할을 하는 운영체제의 핵심 구성 요소이다. "리눅스"라고 부르는 것은 이 리눅스 커널 위에 다양한 시스템 유틸리티, 라이브러리, 셸(Shell), 패키지 매니저 등을 결합한 리눅스 배포판(Distribution)을 의미한다.운영체제의 구조┌─────────────────────────────────────┐│ 사용자 애플리케이션 │ ← 웹 브라우저, 에디터, Docker 등├────────────────────────────────────..
[멋사 클라우드 5기] Day 31 & 32 - OSI 7 Layers
·
Learning Log
OSI 7 Layers네트워크 문제가 발생했을 때 "인터넷이 안 돼요"라는 말만으로는 원인을 파악할 수 없다. DNS가 안 되는 건지, 방화벽이 막는 건지, 물리 케이블이 빠진 건지.문제의 위치를 특정하려면 네트워크가 어떤 단계로 동작하는지 이해해야 한다.OSI(Open Systems Interconnection) 모델은 네트워크 통신을 7개의 계층으로 분리한 참조 모델이다. 1984년 ISO(International Organization for Standardization)가 제정했다. 실제 인터넷은 TCP/IP 4계층 모델로 동작하지만, OSI 7계층은 문제를 진단하고 설명하는 공통 언어로서 표준이다.Layer 1 — Physical (물리 계층)물리 계층은 0과 1의 비트(bit)를 실제 전기 신..
[멋사 클라우드 5기] Day 29 & 30 - 게시판 구현을 통해 확인한 Spring Data JPA
·
Learning Log
findById vs getReferenceById 차이메서드사용하는 곳대상findByIdgetPost(), getPostWithComments()Post 조회getReferenceByIdregisterPost(), updatePost())User, PostfindById — 즉시 SELECT 실행// PostService.java:29-33@Transactionalpublic PostDto getPost(Long pid) { return postRepository.findById(pid) // ← 이 시점에 SELECT 실행 .map(PostDto::from) .orElseThrow(() -> ..
[멋사 클라우드 5기] Day 28 - JWT 그런데 Redis를 곁들인
·
Learning Log
최근 Spring Security, JWT, Redis를 학습하며 보안에 대해 조금 더 고민해 볼 수 있었다.기술 하나하나만 보면 단순해 보이는데, 이들을 조합해서 쓰면 구조는 복잡해지는 한편훨씬 다양한 문제들을 해결할 수 있게 되는 점이 흥미롭다.그럼에도 불구하고, 보안에 있어 완벽한 기술이란 없다고 한다. 다만, 최선의 트레이드오프를 결정하기 위해서어떤 보안 위협을 최우선으로 방어할 것인지, 그리고 프로젝트의 복잡도와 아키텍처 사이에서어느정도의 타협점을 찾을 것인지 고민하는 것이 중요한 문제라고 느껴졌다.어제 정리한 내용들과 겹치는 부분이 있지만, 헷갈리던 점을 명확히 짚고 넘어가기 위해 다시 정리했다.세션 기반 인증의 구조와 한계세션 기반 인증이란?HTTP는 Stateless(무상태) 프로토콜이다...
[멋사 클라우드 5기] Day 26, 27 - Spring Security & JWT
·
Learning Log
1. 인증과 인가개념 의미 비유인증 (Authentication)"너는 누구인가?"를 확인하는 과정건물 출입 시 신분증을 보여주는 것인가 (Authorization)"너는 이것을 할 수 있는가?"를 확인하는 과정신분증 확인 후 특정 층에 들어갈 권한이 있는지 확인하는 것예를 들어, 사용자가 로그인하면 인증이 완료된 것이고, 로그인한 사용자가 관리자 페이지에 접근하려 할 때 관리자 권한이 있는지 확인하는 것이 인가이다.2. 세션 방식의 한계와 JWT의 등장세션(Session) 방식이란JWT가 등장하기 전, 대부분의 웹 서버는 세션(Session) 방식으로 사용자를 관리했다.세션 방식 동작 흐름:1. 사용자가 로그인 → 서버가 세션 생성 → 서버 메모리에 저장2. 서버가 클라이언트에게 Session ID(세..
[멋사 클라우드 5기] Day 25 - Spring Data JPA (3)
·
Learning Log
Fetch Type연관관계를 설정할 때 반드시 확인해야하는 부분이다.즉시 로딩 (Eager Loading)연관된 엔티티를 즉시 함께 조회 한다. FetchType.EAGER 로 설정한다.@ManyToOne(fetch = FetchType.EAGER) // 기본값private Customer customer;-- Order를 조회할 때 Customer도 JOIN해서 함께 가져옴SELECT o.*, c.*FROM orders oLEFT JOIN customer c ON o.customer_id = c.idWHERE o.id = 1문제: 지금 당장 Customer 정보가 필요 없어도 항상 JOIN 쿼리가 실행된다. 연관된 엔티티가 많을수록 불필요한 데이터를 많이 가져와 성능이 저하된다. 특히 N+1 문제가 발..