개발 도구 설치 & 설정VScode 설치 후 폴더 생성 및 새 파일 단축키 등록 & 확장기능 설치(한국어 패치, Github Theme, Live Server)웹사이트의 기본 동작 원리네이버 등의 사이트에서 F12 개발자도구를 이용해 웹사이트의 구조 및 HTML/CSS
Git은 분산 버전 관리 시스템(DVCS)중 하나로 마치 평행세계처럼 여러가지 기능을 시도하고 백업할 수 있음.또한 여러 개발자들이 동시에 같은 프로젝트에 작업이 가능하다.버전 관리 시스템(VCS)는중앙집중식 버전 관리 시스템과 분산 버전 관리 시스템으로 나뉜다.VCS
Project라는 이름의 새 폴더를 만드세요.Project 폴더 안에서 Git 저장소를 초기화하세요.(이미 저장소가 있다면 건너뛰세요.)todo.txt라는 새 파일을 만드세요.ideas.txt라는 또 다른 새 파일을 만드세요.두 개의 빈 파일(todo.txt, idea
기본 세팅1\. AnimalSounds라는 새 폴더를 만드세요.폴더 내부에서 새로운 Git 저장소를 만드세요.(현재 있는 위치에 .git 폴더가 없는지 먼저 확인)sounds.txt라는 새로운 파일을 생성하세요.(아직 내용은 넣지 마세요)파일을 추가하고 첫 번째 커밋을
Git에서 'Merge' 는 여러 브랜치에 분산된 코드 변경 사항을 한 브랜치로 합치는 과정이다.Fast-Forward Merge : main의 다른 커밋 사항이 없을때 병합하려는 브랜치의 커밋으로 HEAD(커밋 포인트)가 이동한다.3-Way Merge : 두 브랜치를
git reset 명령어는 현재 HEAD를 특정 커밋으로 이동시키는데 사용됩니다. 이는 주로 이전의 상태로 "되돌리고" 싶을 때 사용되는 명령어입니다.detached head 와 다른점은 지정된 커밋이후의 커밋을 삭제한다.단순히 그 커밋들이 현재 브랜치에서 보이지 않
Collaborator의 권한1\. 코드 푸시: Collaborator는 소유자와 동일하게 repository에 직접적으로 코드를 푸시할 수 있습니다. 이는 Collaborator가 repository의 소스 코드를 본인의 로컬 시스템에 클론한 후, 코드 수정이나 추가
Git Rebase vs. Git MergeGit MergeGit Merge는 두 브랜치의 작업 내역을 하나의 새 커밋으로 합치는 방법입니다.작동 방식:현재 브랜치와 대상 브랜치의 공통 조상(commit)을 찾아 그 이후의 모든 커밋을 하나의 새로운 커밋으로 병합합니다
깔끔한 코드의 중요성들여쓰기태그와 속성 작성법 : HTML 태그와 속성 이름은 일반적으로 소문자로 작성태그 닫기코드 블록 구분하기 : ex. 헤더 섹션 , 메인 콘텐츠 , 푸터 섹션 (주석으로 달기)주석 활용하기코드 설명코드 임시 비활성화버전 히스토리나 작업자 정보디버
Fast-Forward: main에 변경사항이 없으면 단순히 커밋 포인터만 이동3-Way Merge: 두 브랜치 모두 변경된 경우 병합 커밋 생성충돌 시 <<<<<<<, =======, >>>>>>>로 표시됨충돌 해결 후 git a
push, issue, PR, wiki 등 전반적인 권한 보유프로젝트 소개, 설치법, 기여 가이드 등 포함문법 사이트: markdown-it.github.io중앙 집중형 vs Feature 브랜치 기반 방식리뷰 → 승인 → 병합 → 브랜치 삭제팀장: 저장소 생성, PR
HTML 요소에 스타일(색상, 글꼴, 레이아웃 등) 을 입히는 언어HTML은 구조, CSS는 디자인프레젠테이션 분리: 유지보수 용이일관성 유지: 사이트 전반 스타일 일괄 적용 가능반응형 웹 디자인: 화면 크기에 따라 자동 조정인라인 스타일: <h1 style=""
px: 고정된 픽셀 단위. 정확한 크기 지정에 사용됨.em: 부모 요소 기준rem: 루트 요소(html) 기준 (일관성과 유지보수에 유리)%: 부모 요소에 비례한 크기vw / vh: 뷰포트 기준 (반응형에 유리)cm, mm, in: 인쇄용 단위반응형 웹에 유리함접근성
<h1> ~ <h6>: 제목 태그, h1이 가장 중요함 (로고나 대제목)<header>: 사이트 상단의 로고, 메뉴, 탐색용 요소 포함<footer>: 작성자, 저작권, 관련 링크 등 문서 하단 정보 포함<section>: 독립적인 콘텐츠 영
🧾 요약: 포지셔닝은 요소의 위치를 문서 흐름에서 벗어나 직접 지정할 수 있게 해주며, 스크롤에 따라 고정하거나 겹치기 위한 핵심 도구입니다.z-index는 요소의 쌓임 순서를 지정함값이 클수록 위에 쌓임반드시 position이 설정된 요소에만 적용됨🧾 요약: z-
화면 크기(모바일, 태블릿, 데스크탑 등)에 따라 스타일을 동적으로 변경하는 기법핵심: 미디어 쿼리 + 뷰포트 단위(vw, vh)max-width, min-width: 너비 기준max-height, min-height: 높이 기준orientation: 가로/세로 방향r
px: 고정 크기em / rem: 부모 또는 root 기준 상대 단위%, vw, vh: 상대적 뷰포트 기반 단위rem은 유지보수, 반응형에 유리font-size, color, text-alignfont-family, font-weight, text-transform,
📘 0526 학습 정리 ✅ 예제 1: Google 클론 페이지 🧾 HTML (index.html) 🎨 CSS (styles.css) ✅ 예제 2: Instagram 클론 페이지 🧾 HTML (index.html) 🎨 CSS (main.css) 중 주요 스타일
자바스크립트는 웹 페이지를 동적이고 인터랙티브하게 만드는 프로그래밍 언어브라우저뿐 아니라 서버(Node.js), 모바일/데스크톱 앱에서도 사용됨HTML 안의 <script> 태그외부 .js 파일 연결 (<script src="파일.js">)개발자 도구 Con
조건을 위에서부터 검사하여 처음 true인 블록이 실행됨✅ 총정리자바스크립트 연산자는 계산, 비교, 논리 판단을 담당하는 핵심 도구조건문과 삼항 연산자를 이용하면 상황에 따라 동적으로 흐름을 제어할 수 있음
case의 값과 일치하면 해당 코드 실행break가 없으면 다음 case까지 연달아 실행됨 (fall-through)default는 선택사항이지만 없을 경우 아무 것도 실행되지 않을 수 있음🧾 요약: switch는 값이 명확할 때 if보다 간결하게 조건 분기를 표현할
🔹 break반복문 또는 switch문을 즉시 종료중첩 반복문에서는 label:을 활용해 바깥 반복문까지 종료 가능🔹 continue반복문 내에서 조건에 따라 현재 반복만 건너뛰고 다음 반복으로 넘어감🧾 요약: break는 루프 종료, continue는 다음 반복
1~10 사이의 랜덤 정수 두 개 생성사용자에게 덧셈 문제를 출제정답이면 "정답입니다!", 오답이면 "틀렸습니다!" 출력사용자가 0을 입력할 때까지 반복 출제Math.random() + Math.floor()로 랜덤 숫자 생성prompt()로 사용자 입력 받기 (문자열
덧셈(+) 뿐 아니라 뺄셈(-), 곱셈(\*) 문제를 무작위로 출제문제 종류는 매 반복마다 Math.random()으로 1~3 중 하나 선택뺄셈의 경우 두 수가 같지 않도록 랜덤 재생성 로직 처리 포함🧾 요약: calculateVer로 연산 종류를 구분하여 다양한 연
여러 값을 하나의 변수에 저장할 수 있는 자료구조인덱스는 0부터 시작생성 방법:🧾 배열은 순서 있는 데이터 집합을 관리할 때 사용됨접근: arr\[0], arr\[1]수정: arr\[1] = '바꿈값';🧾 배열의 요소는 인덱스로 읽고 쓸 수 있음▶️ 추가/삭제pus
프로그램 기능 요약회원 정보는 객체 내부 배열(userList)에 저장됨사용자 입력을 통해 회원가입 또는 로그인 선택 가능로그인 성공 시 프로그램 종료이름, 아이디, 비밀번호 순으로 사용자 정보 입력이미 존재하는 아이디는 가입 불가 (중복 검사 수행)새 유저 정보는 객
함수 정의: 특정 코드를 반복해서 실행하고 싶을 때 함수로 정의함수 호출: 정의된 함수를 실행시키는 행위매개변수 (parameter): 함수 내부에서 사용할 외부 입력 값인수 (argument): 함수를 호출할 때 전달하는 실제 값함수 내부의 계산 결과를 함수 외부로
전역 스코프: 코드 어디서든 접근 가능한 변수 (let x = 10)블록 스코프: {} 블록 내에서만 유효한 변수 (let, const 사용)지역 스코프: 함수 내에서 선언된 변수📌 전역 변수는 가급적 지양해야 함변수 이름 충돌 위험수명이 너무 길어 메모리 관리 어려
배열은 여러 데이터를 순서대로 저장하는 자료구조배열 생성 방법리터럴 표기: let arr = \[1, 2, 3];생성자 함수: let arr = new Array(1, 2, 3);요소 접근: 배열\[인덱스]수정: 배열\[1] = '수정값'push(), pop(): 끝에
사용자 정보를 배열에 객체 형태로 저장회원가입 시 중복 ID 체크: some() 메서드 활용로그인 시 입력한 ID와 비밀번호 비교prompt()를 사용해 사용자 입력을 받음이름, ID, 비밀번호 입력기존 ID 중복 여부 검사중복 없을 경우 배열에 추가ID 입력 → 존재
전역 스코프: 어디서나 접근 가능한 변수지역 스코프: 함수 내부 변수, 외부에서는 접근 불가블록 스코프: {} 안에서만 유효 (let, const)⚠️ 전역 변수는 충돌, 디버깅 문제의 원인이므로 최소화함수 선언문: function fn() {} → 호이스팅 O함수 표
배열이나 객체의 값을 개별 변수에 쉽게 할당하는 문법배열에서 일부 요소만 추출: const \[x, , z] = arr;객체 프로퍼티 이름 변경: const { name: userName } = user;나머지 연산자: const \[a, b, ...rest] = ar
getElementById, querySelector, querySelectorAll로 DOM 요소를 선택textContent, innerHTML로 텍스트 또는 HTML 삽입/수정style 속성으로 인라인 스타일 직접 조작classList 사용하여 클래스 추가/제거/토
onclick, ondblclick, onmouseover, onmouseout 등 HTML 속성에 직접 함수 연결 가능addEventListener를 사용해 여러 이벤트를 등록하고, 나중에 제거도 가능버블링: 이벤트가 하위 요소 → 상위 요소로 전파됨e.stopPro
동기(Synchronous): 코드가 순차적으로 실행됨비동기(Asynchronous): 코드 실행 순서를 따르지 않고 예약되어 나중에 실행됨일정 시간 후에 특정 작업을 실행하도록 예약하는 함수clearTimeout(id)으로 예약 취소 가능버튼 클릭으로 예약, 취소,
클릭 시 메뉴 토글 (classList.toggle('show'))외부 클릭 감지로 메뉴 닫기 (contains, document.addEventListener)CSS로 .dropdown-menu의 위치와 스타일 지정hover만으로 펼치는 드롭다운: .dropdown-
배열, 객체의 값을 변수에 빠르게 할당배열 병합, 복사 / 객체 병합도 ... 문법으로 처리배열 순회, 필터링, 매핑, 누적 계산을 함수형 스타일로 처리조건 만족 객체 필터, 이름만 추출, 거래 합계 등 실습getElementById / querySelector로 요소
일정 시간 후 또는 주기로 함수 실행clearTimeout / clearInterval로 취소 가능3초 뒤 메시지 숨기기, 3초마다 색 변경스톱워치: 10ms 단위 시간 측정 → 일시정지, 초기화클릭으로 메뉴 토글, 탭 활성화classList 활용 및 data-tab
자바스크립트 함수는 일급 객체로 다룰 수 있음변수에 저장 가능함수의 인자로 전달 가능함수에서 반환 가능함수 안에 함수를 정의하고 반환하면, 호출 구조가 깊어짐외부 함수의 지역 변수를 기억하는 내부 함수특정 데이터를 보호하며 유지할 수 있음클로저를 이용해 상태가 독립적인
IntersectionObserver를 이용해 마지막 콘텐츠가 뷰포트에 나타날 때 자동 콘텐츠 추가비동기적으로 콘텐츠를 동적으로 로딩 (ex: SNS 피드 등)감시 대상이 교체되도록 observer.observe($마지막요소) 반복 호출로딩 스피너로 사용자 피드백 제공
자바스크립트로 서버와 통신하는 대표적인 객체open(method, url), send()로 요청 전송load 이벤트로 응답 수신 후 처리서버에서 받은 문자열(JSON)을 JS 객체로 변환: JSON.parse()반대로 서버로 보낼 때 객체 → JSON: JSON.str
resolve, reject 콜백으로 프로미스 결과 반환.then()을 통해 순차적으로 작업을 이어갈 수 있음콜백 지옥 없이 비동기 흐름을 명확하게 구성 가능기존 XMLHttpRequest를 Promise로 감싸 비동기 로직을 단순화.then()을 통해 중첩 요청을 순
버튼 클릭으로 body 클래스 전환 (light-mode ↔ dark-mode)텍스트 변경: "다크 모드로 변경" ↔ "라이트 모드로 변경"localStorage를 통해 테마 상태를 브라우저에 영구 저장새로고침 시 저장된 테마를 로드하여 초기화상태(state) 객체를
함수는 변수에 저장되고 인자로 전달 가능 (일급 객체)클로저는 외부 함수의 변수를 기억하는 함수디바운스: 입력 종료 후 일정 시간 뒤 실행스로틀: 일정 주기마다 실행 제한IntersectionObserver를 사용해 마지막 요소 감지요소가 보이면 콘텐츠 추가 or 애니
변수 선언 시 자료형을 반드시 명시해야 함byte (1byte): -128 ~ 127short (2byte): -32768 ~ 32767int (4byte): 약 -21억 ~ 21억long (8byte): 접미사 L 필요변수는 선언된 블록 범위 내에서만 유효블록이 끝나
새로운 배열을 생성해서 기존 배열 복사 후 마지막 인덱스에 요소 삽입push 메서드 활용 예시로 배열에 여러 요소 추가맨 마지막 요소 삭제 (pop)원하는 위치 요소 삭제특정 인덱스에 새 데이터를 삽입선형 탐색: 하나씩 순차적으로 비교배열의 배열 형태순회 방법 (for
자바는 함수 개념 없이 메서드만 존재 (클래스 내부에서만 정의 가능)메서드는 객체의 기능을 정의하며 클래스 내부, 메서드 외부에 선언main() 메서드는 자바 프로그램의 시작점파라미터 개수가 정해지지 않은 경우 int... numbers 형식 사용내부적으로 배열로 처리
Vehicle 클래스는 자동차를 모델링한 설계도.필드: 회사명, 모델명, 속도, 연료량, 시동상태, 소유자(Owner 객체).생성자: 회사명과 모델명을 초기화.메서드:powerOn(), powerOff(): 시동 켜기/끄기accelerate(): 속도 증가info():
기능: 회원 정보를 관리하는 CRUD 기반 콘솔 애플리케이션정보 항목: 이메일, 비밀번호, 이름, 회원식별번호(id), 성별, 나이, 가입일기능 요약:회원 등록, 조회(전체/개별), 수정, 삭제, 복구회원 1명의 정보를 담당필드: 이메일, 비밀번호, 이름, UUID로
기본 자료형: int, double, boolean, char참조 자료형: String, 배열, 클래스 등묵시적 형 변환: 작은 타입 → 큰 타입명시적 형 변환: 큰 타입 → 작은 타입 (캐스팅 필요)선언과 초기화: int\[] arr = new int\[5];순회 방
객체 간 참조 관계 학습메서드를 통한 상태 변화: 시동, 가속==는 주소 비교, .equals()는 내용 비교커스텀 클래스 StringList 작성메서드 구성: push, pop, insert, remove, include, indexOf 등동일 클래스명을 구분하기 위
자바에서 멤버(클래스, 필드, 메서드 등)의 접근 가능 범위를 설정할 수 있는 키워드.어디서든 접근 가능대부분의 클래스, 메서드는 public으로 선언같은 패키지 내에서만 접근 가능다른 패키지에서는 접근 불가선언된 클래스 내부에서만 접근 가능외부에서 직접 접근할 수 없
상속이란?부모 클래스의 필드와 메서드를 자식 클래스가 물려받아 사용하는 것.코드 재사용성 향상과 유지보수 효율 증가.IS-A 관계: 전사(Warrior)는 플레이어(Player)다.공통 멤버는 Player에 정의각 클래스마다 추가 능력치 (rage, mana, conc
자식 객체를 부모 타입으로 참조하는 것.자동 형변환이 일어나며, 부모가 물려준 멤버(메서드)만 사용 가능.자식의 고유 기능을 사용하려면 다운캐스팅 필요.⚠️ 다운캐스팅은 instanceof로 타입 체크 후 사용해야 안전하다.Employee 클래스 (공통 기능)Devel
final은 변경을 막는 키워드이며 변수, 메서드, 클래스에 사용됨.final 변수: 초기화 후 값 변경 불가.final 메서드: 오버라이딩 불가능.final 클래스: 상속 불가능.static final: 상수를 만들 때 사용 (ex. public static fina
기본적으로 Object.equals()는 참조값(주소) 비교실질적인 값 비교를 위해 오버라이딩 필요보통 필드값이 동일하면 같은 객체로 간주하도록 구현객체 정보를 문자열로 표현할 때 사용예시: Pen{serial=100, color='노랑', price=1000}leng
public: 어디서든 접근 가능protected: 같은 패키지 or 상속 관계에서만 접근 가능default(생략): 같은 패키지에서만 접근 가능private: 해당 클래스 내에서만 접근 가능필드를 private으로 숨기고, getter/setter로 접근 제어잘못된
특징순서가 있는 데이터 구조.중복된 값을 허용.주요 구현 클래스ArrayList, LinkedList주요 메서드add(): 요소 추가add(index, value): 중간 삽입get(index): 요소 참조set(index, value): 요소 수정remove(inde
File 클래스를 사용하여 디렉토리 생성, 파일 존재 확인 등을 수행할 수 있음1바이트 단위 입출력, 이미지, 영상 등 바이너리 파일 처리에 적합주요 클래스: FileInputStream, FileOutputStream2바이트 단위 입출력, 텍스트 파일 처리에 적합주요
스트림 요소를 변형할 때 사용예: Apple 객체 리스트에서 색상만 추출조건을 매칭하는 요소만 필터링예: 채신 요리만 추출중복 요소 제거 (equals, hashCode 필요)limit(n): 앞에서 n개 추출skip(n): 앞에서 n개 건너뛰기정렬 기준 설정 가능 (
Servlet 클래스를 상속하여 HTTP 요청과 응답을 제어할 수 있다.서비스 로직은 service() 메서드 안에서 처리한다.댄서 객체 Dancer수준(enum) DanceLevel장르(enum) Genre저장소 클래스 DancerRepository/chap02/da
JSP 페이지의 동작 방식 설정.예시:JSP 안에 자바 코드를 삽입.반복문, 조건문 등 가능.변수 출력용.request.getParameter("name") 등으로 폼 데이터 받기.request.getParameterValues("genres")로 다중 값 처리.폼 데
순서 O, 중복 O대표 클래스: ArrayList, LinkedList주요 메서드: add(), get(), set(), remove(), size(), contains() 등순서 X, 중복 X대표 클래스: HashSet주요 메서드: add(), remove(), co
클라이언트 요청 → 서블릿에서 파라미터 추출 → 로직 처리 → 응답 반환request.getParameter, response.getWriter() 핵심 사용<%@ page %>: 페이지 속성 정의<% ... %>: 자바 코드 삽입<%= ... %>:
JSON 기반 POST 요청으로 회원 등록UUID로 유저 고유 식별자 생성@RequestBody 사용GET /api/v3-2/members 로 전체 회원 조회피드백 등록 시 POST 요청으로 객체 전달Math.random() 으로 id 부여 (간단 처리)GET /api
URL: /api/v5-3/members기능: 회원 생성 (POST), 전체 회원 조회 (GET)데이터 저장: 메모리 Map (account를 key로 저장)역할: 회원 가입 시 필요한 데이터 받는 전용 객체검증 어노테이션 사용:@Email, @NotBlank, @Pa
의존 객체를 외부에서 주입받아 사용하는 방식으로 객체 간의 결합도를 낮추고 유연한 구조를 설계할 수 있음.객체 생성 시점에 필요한 의존 객체를 생성자 파라미터로 주입받는 방식테스트, 유지보수에 용이Restaurant: 레스토랑 인터페이스 (order 메서드)Chef:
@Controller: 클라이언트의 요청을 받아 처리하고 응답을 반환하는 역할.@Service: 비즈니스 로직을 처리.@Repository: DB와 직접 연결되어 데이터 CRUD 처리.@Component: 스프링이 관리하는 일반 컴포넌트로, 위 3가지 어노테이션의 상위
객체 간의 결합도를 낮추기 위해 인터페이스를 활용.다형성을 활용해 다양한 구현체를 교체하기 쉽게 만듦.직접 객체 생성 없이 외부에서 객체를 주입받아 사용하는 설계.유지보수, 테스트, 확장성이 좋아짐.생성자 주입필드 주입setter 주입스프링 설정 클래스임을 명시.해당
@ControllerAdvice: 예외를 전역적으로 처리하는 클래스에 작성.@ExceptionHandler: 특정 예외 클래스에 대한 예외 처리 메서드 정의.입력값 검증 예외는 MethodArgumentNotValidException으로 처리.RuntimeExcepti
사용자가 업로드한 파일을 MultipartFile로 받아 처리UUID를 활용해 파일명 중복 방지업로드된 파일은 설정한 루트 디렉토리에 저장여러 개의 파일을 리스트 형태로 받아 반복 저장WebMvcConfigurer의 addResourceHandlers()를 오버라이드하
Book 클래스는 DB의 books 테이블과 매핑됨.주요 필드: id, title, author, isbn, available, createdAtResultSet을 생성자에서 받아 DB 결과를 객체로 변환 가능.Lombok의 어노테이션 사용: @Getter, @Sett
JdbcTemplate을 사용한 데이터베이스 CRUD 처리주요 메서드:save(Book book): 도서 저장updateTitleAndAuthor(Book book): 도서 제목, 저자 수정deleteById(Long id): 도서 삭제findAll(): 도서 전체 목
saveTest(), updateTest(), deleteTest(), findAllTest(), findOneTest(), countTest() 각각의 CRUD 동작을 검증Pet 엔티티와 매퍼를 통해 MyBatis 기반 CRUD 기능 구현매핑 XML 설정으로 SQL과
@RestControllerAdvice 와 @ExceptionHandler 를 활용한 공통 예외 처리사용자 정의 예외 클래스 생성 (CustomException, ResourceNotFoundException 등)MultipartFile 활용업로드된 파일을 저장할 디렉
@Mapper 인터페이스 + XML Mapper 분리 구조MyBatis 설정 파일에서 경로 지정INNER JOIN, OUTER JOIN, 다중 조인Oracle 외부조인: (+)\\MyBatis를 통한 Mapper 구조 설계 능력 향상XML Mapper를 통한 SQL 분
@SpringBootTest: Spring Container 전체를 로딩 (단위 테스트 목적 X)@DataJpaTest: Repository 테스트에 최적화된 어노테이션@Repository 관련 빈만 로드자동으로 롤백내장 DB만 사용 가능(H2 등)저장: save()
객체지향에서는 DB의 관계를 클래스 간의 관계로 표현함.1\\:N (부서:사원) 관계를 객체에서도 부서가 사원 리스트를 가짐으로써 표현 가능Department (부서)@OneToMany(mappedBy = "department")로 사원 리스트 관리CascadeType
changeDepartment: Employee에서 부서를 바꾸는 편의 메서드로, 반대편 관계인 Department.employees에도 추가.addEmployee: Department에서 사원을 추가할 때 Employee의 setDepartment(this)까지 같이
JPAQueryFactory는 QueryDSL의 해석과 구성의 해당 것으로, 다양한 SQL 조회를 Java 패턴으로 구성가능EntityManager를 가지고 QueryDSL에서 실수할 수 있는 것과 같이 Bean으로 등록@ManyToOne을 통해 Group과 가장 관련
QueryDSL을 이용해 구현과 조회를 만들는 학습여러 구문 (Group by, Having, Join, DTO mapping, case)를 입체 학습아이돌(Idol), 그룹(Group), 앨범(Album)과 관련 데이터 추가여러 그룹에 따라 아이돌을 할당하고, 앨범과
JPAQueryFactory: QueryDSL의 쿼리 생성을 담당하는 핵심 객체Q도메인클래스: QueryDSL이 도메인 클래스에 대해 생성한 쿼리 타입 클래스 (예: QIdol)fetch(): 리스트 반환fetchOne(): 단일 객체 반환 (결과가 2개 이상이면 예외
@ManyToOne으로 Group과 연관지연 로딩(LAZY) 설정@OneToMany(mappedBy = "group")orphanRemoval = true 설정 가능편의 메서드 addIdol, removeIdol 제공idol.idolName.eq("김채원")idol.a
QueryDSL을 활용해 복잡한 SQL을 Java 코드로 타입 안정성과 가독성을 유지하며 작성할 수 있음JPAExpressions를 통해 서브쿼리를 작성 가능BooleanBuilder를 활용한 동적 쿼리 구성 가능OrderSpecifier를 사용하여 동적 정렬 처리 가
트랜잭션은 더 이상 쪼갤 수 없는 논리적 작업 단위예: 계좌이체 (A 계좌 차감 + B 계좌 증가 = 하나의 트랜잭션)All or Nothing 원칙: 둘 다 성공해야 최종 반영, 하나라도 실패 시 전체 롤백COMMIT: 트랜잭션 결과를 DB에 "영구 저장"ROLLBA
회원가입 프로세스의 기본 골격을 구현했습니다. Spring MVC의 핵심 컴포넌트인 Controller, Service, DTO(Data Transfer Object)를 사용하여 역할을 분리하고 기능을 구현했습니다.AuthController: 클라이언트의 HTTP 요청
Stateless(무상태) 인증을 위해 JWT(JSON Web Token)를 도입했습니다. JWT는 인증에 필요한 정보들을 암호화된 JSON 형태로 담고 있어, 서버는 토큰 검증만으로 사용자를 인증할 수 있습니다.JWT의 구조:Header: 토큰의 타입(JWT)과 사용
사용자 경험(UX)을 향상시키기 위해, 폼 필드 입력 시 실시간으로 유효성을 검사하는 기능을 추가했습니다. 사용자는 폼을 제출하기 전에 입력 값의 유효 여부를 즉시 피드백 받을 수 있습니다.사용자명: 길이(15자 이내) 및 형식(영문/숫자)을 실시간으로 검사합니다.이메
QueryDSL은 복잡한 SQL 쿼리를 타입에 안전한(Type-Safe) Java 코드로 작성하게 해주는 프레임워크입니다. 이를 통해 컴파일 시점에 오류를 잡고, 가독성 높은 코드를 유지할 수 있습니다.JPAExpressions 유틸리티 클래스를 사용하여 SELECT,
회원가입/로그인 API 설계: Controller-Service-DTO 패턴을 기반으로 API의 기본 골격을 구현했습니다. 이를 통해 각 계층의 역할을 명확히 분리했습니다.비밀번호 암호화: 사용자의 비밀번호를 안전하게 보호하기 위해 Spring Security의 Pas
데이터 모델링(Data Modeling)이란 현실 세계의 업무 프로세스와 데이터의 관계를 정보 구조(개념, 논리, 물리)로 단순화하고 명확하게 표현하는 과정입니다. 즉, 복잡한 현실을 추상화하여 데이터베이스로 옮기기 위한 설계도를 만드는 작업입니다.엔터티란 업무에서 관
여행 관리 기능의 기반을 마련하기 위해 Trip 엔터티와 TripStatus 열거형(Enum)을 추가했습니다.Trip 엔터티:주요 필드: 여행 제목, 설명, 기간(시작/종료일), 예산, 목적지 등 여행의 핵심 정보를 관리합니다.관계 매핑: User 엔터티와 다대일(N:
사용자가 새로운 여행 계획을 생성할 수 있는 백엔드 API(POST /api/trips)를 구현했습니다.TripRequest (DTO):클라이언트로부터 여행 생성에 필요한 데이터(제목, 설명, 기간, 예산 등)를 받기 위한 DTO를 정의했습니다.@NotBlank, @N
여행에 대한 상세한 기록을 남길 수 있도록 여행일지(Travel Log) 관련 엔터티와 Repository를 설계하고 구현했습니다.핵심 엔터티 설계:TravelLog: 여행일지의 본문, 날짜, 별점, 지출 등 핵심 정보를 담는 메인 엔터티. Trip 엔터티와 1:N 관
데이터 모델링은 현실 세계의 업무를 추상화하여 데이터베이스 구조로 설계하는 과정으로, 개념적, 논리적, 물리적 3단계로 진행됩니다.엔터티 (Entity): 관리해야 할 데이터의 대상(테이블). 식별자에 의해 유일하게 구분되며, 2개 이상의 인스턴스(행)와 속성(컬럼)을
사용자가 새로운 여행 계획을 생성할 수 있는 백엔드 API(POST /api/trips)를 구현했습니다.TripRequest (DTO): 클라이언트로부터 여행 생성에 필요한 데이터를 받기 위한 DTO로, @Valid를 통해 데이터 유효성을 검증합니다.TripServic
여행에 대한 상세 기록을 위해 여행일지(Travel Log) 관련 엔터티를 설계하고, 사진을 첨부할 수 있는 파일 업로드 기능을 구현했습니다.엔터티 설계:TravelLog: 여행일지 메인 엔터티.TravelPhoto: 업로드된 사진의 메타데이터 관리.Tag, TagCa
사용자가 특정 여행의 상세 정보와 관련 여행일지 목록을 한눈에 볼 수 있는 여행 상세보기 페이지를 구현했습니다.API 엔드포인트: GET /api/trips/{tripId} 경로로 특정 여행 정보를 조회하는 API를 구현했습니다.TripService (getTrip 메
사용자가 작성한 여행일지를 모아보고, 조건에 따라 필터링 및 검색할 수 있는 여행일지 목록 페이지를 구현했습니다.API 엔드포인트: GET /api/travel-logs (파라미터로 tripId, location, logDate 등 전달)서비스 로직 (getTravel
데이터 모델링(Data Modeling)이란 현실 세계에 존재하는 다양한 업무 프로세스와 데이터의 관계를, 사람이 이해하기 쉬운 형태로 추상화하여 정보 시스템으로 구축하기 위한 설계도(Blueprint)를 만드는 과정입니다.추상화 (Abstraction): 현실 세계의
SQL은 원하는 데이터를 효율적으로 조회, 조작, 정의, 제어하기 위한 언어입니다. SELECT 문은 데이터 조회의 핵심입니다.SQL 문법 순서와 실제 실행 순서는 다릅니다. 이 순서를 이해해야 복잡한 쿼리를 정확하게 작성할 수 있습니다.FROM → WHERE → GR
SQL 문법의 작성 순서와 DBMS의 내부적인 처리 순서는 다릅니다. 이 논리적 순서를 이해하는 것이 복잡한 쿼리 해석의 핵심입니다. ⑤ SELECT ② WHERE ④ HAVING FROM: 대상 테이블을 정의하고 JOIN을 처리하여 작업할 데이터 집합을 확정합
데이터베이스의 설계도를 만드는 과정으로, 시스템의 안정성과 확장성을 결정하는 가장 중요한 단계입니다.관계 차수 (Cardinality): 참여하는 인스턴스의 수1:1: 사원 - 좌석1:N: 부서 - 사원 (가장 일반적)M:N: 학생 - 과목 → 관계형 DB에서 직접 표
Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 이름에서 알 수 있듯이, 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로 설계되었습니다.핵심 목표: 비즈니스 로직(Mo
React 애플리케이션은 컴포넌트(Component)라는 독립적이고 재사용 가능한 UI 조각들로 만들어집니다. 그리고 이 컴포넌트의 UI 구조는 JSX라는 특별한 문법을 사용해 정의합니다.개념: JavaScript를 확장한 문법으로, HTML과 매우 유사하게 생겼지만
관련 있는 여러 상태값들을 개별적인 useState로 선언하는 대신, 하나의 객체로 묶어 관리하면 코드를 더 간결하고 체계적으로 만들 수 있습니다. 특히 폼(Form)의 여러 입력 필드를 관리할 때 유용합니다.객체 상태를 업데이트할 때는 반드시 이전 상태를 복사한 후,
React에서 목록 데이터는 불변성(Immutability)을 유지하며 관리하는 것이 매우 중요합니다. 즉, 기존 상태 배열을 직접 수정하는 대신, 항상 새로운 배열을 생성하여 상태를 업데이트해야 합니다.JavaScript의 map() 메서드를 사용하여 배열 데이터를
Side Effect (부수 효과)란 React 컴포넌트의 주된 역할인 UI 렌더링 외에, 외부 세계와 상호작용하는 모든 작업을 의미합니다.주요 Side Effects 예시:HTTP 요청 (데이터 fetching)타이머 설정 (setTimeout, setInterval
React Router는 싱글 페이지 애플리케이션(SPA)에서 사용자가 URL을 통해 여러 페이지를 이동하는 것처럼 느끼게 해주는 라이브러리입니다. 실제로는 페이지를 새로고침하지 않고, URL에 맞는 컴포넌트만 동적으로 렌더링합니다.최신 React Router(v6.4
컴포넌트(Component): UI를 구성하는 재사용 가능한 독립적인 블록. 함수형 컴포넌트가 주로 사용됩니다.JSX (JavaScript XML): JavaScript 내에서 HTML과 유사한 문법으로 UI를 선언적으로 작성할 수 있게 해주는 확장 문법입니다.Prop
Side Effect (부수 효과): 컴포넌트의 주된 역할인 UI 렌더링 외의 모든 작업 (e.g., HTTP 요청, 타이머 설정, DOM 직접 조작).useEffect Hook: 함수형 컴포넌트에서 Side Effects를 처리하기 위해 사용하며, 컴포넌트가 렌더링된
애플리케이션의 핵심 데이터와 비즈니스 로직을 처리하는 서버 API를 구축했습니다. 클라이언트(React)는 이 API를 통해 데이터를 요청하고 조작합니다.RESTful API 설계: 이벤트(Event)라는 자원(Resource)을 중심으로, HTTP 메서드(GET, P
loader가 데이터 읽기(Read)를 담당했다면, action 함수는 데이터 생성(Create), 수정(Update), 삭제(Delete) 작업을 처리하는 React Router의 강력한 기능입니다. 이를 통해 컴포넌트의 역할과 데이터 조작 로직을 명확하게 분리할 수
안전하고 신뢰성 있는 회원가입 절차를 위해, 사용자의 이메일 소유권을 확인하는 인증 시스템의 서버 API를 구축했습니다.엔티티 및 Repository 설계:EventUser 엔티티 외에, 이메일 인증 과정을 추적하기 위한 별도의 엔티티EmailVerification를
이메일 인증을 마친 사용자의 회원가입을 최종 완료하고, 이후 서비스 접근을 위한 로그인 및 인증 유지 시스템을 구축했습니다.비밀번호 암호화 및 회원가입 완료:사용자로부터 받은 비밀번호를 절대 평문으로 저장하지 않습니다. Spring Security의 PasswordEn
기존에는 모든 사용자에게 동일한 이벤트 목록을 보여주었지만, 이제는 로그인한 사용자 본인이 작성한 게시물만 볼 수 있도록 API의 데이터 조회 로직을 수정했습니다.Repository 쿼리 수정:서비스 계층(Service Layer)은 클라이언트로부터 전달받은 사용자 I
클라이언트(React)와 서버(Spring) 간의 명확하고 효율적인 통신을 위해 RESTful 원칙에 따라 API를 설계하고, 데이터 전송을 표준화했습니다.자원(Resource) 중심의 API 설계:이벤트(Event), 사용자(User) 등 관리할 대상을 자원으로 정의
상태를 유지하지 않는(Stateless) 서버를 위해, JWT(JSON Web Token)를 이용한 인증 및 인가 시스템을 구축했습니다.비밀번호 암호화: Spring Security의 PasswordEncoder를 사용하여 사용자의 비밀번호를 단방향 해시(Hash)하여
문제점 (Prop Drilling): React의 기본 데이터 흐름은 Props를 통해 부모에서 자식으로 이어집es. 하지만 앱의 특정 상태(e.g., 로그인 정보, 테마, 장바구니 데이터)가 최상위 컴포넌트에 있는데, 이 상태가 아주 깊숙이 있는 하위 컴포넌트에서 필
React는 부모 컴포넌트가 리렌더링되면 기본적으로 모든 자식 컴포넌트도 리렌더링합니다. 하지만 자식 컴포넌트가 받는 props가 변경되지 않았다면, 이 리렌더링은 불필요한 연산 낭비입니다. 이를 방지하기 위한 여러 최적화 기법이 있습니다.memo는 고차 컴포넌트(HO
소셜 로그인(Social Login)이란 사용자가 기존에 사용하던 소셜 미디어 계정(카카오, 구글, 네이버 등)을 통해 우리 서비스에 간편하게 로그인하는 기능입니다. 이 과정의 표준적인 인증 프로토콜이 바로 OAuth 2.0입니다.OAuth 2.0은 사용자의 비밀번호를
단순히 소셜 로그인을 성공시키는 것을 넘어, 성공/실패 시의 후처리, 토큰 발급, 사용자 정보 동기화 등 실제 서비스에 필요한 상세 로직을 구현했습니다.CustomOAuth2UserService:역할: OAuth 2.0 Provider(카카오 등)로부터 사용자 정보를
사용자들이 스터디룸을 생성하고, 참여하며, 관리할 수 있는 핵심 비즈니스 로직과 데이터 모델을 설계하고 RESTful API를 구축했습니다.StudyRoom 엔티티: 스터디룸의 핵심 정보(제목, 설명, 최대 인원)를 관리합니다. User 엔티티와 호스트(Host) 관계
문제점 (Prop Drilling): 앱의 깊숙한 곳에 있는 컴포넌트에 상태를 전달하기 위해, 중간에 있는 수많은 컴포넌트를 거쳐 Props를 계속해서 전달해야 하는 문제. 코드의 가독성과 유지보수성을 크게 저하시킵니다.해결책 (Context API): React에 내
사용자들이 스터디룸을 생성하고 참여하는 핵심 비즈니스 로직과 데이터 모델을 설계하고, 이를 제어하는 RESTful API를 구축했습니다.StudyRoom 엔티티: 스터디룸의 핵심 정보(제목, 설명 등)를 관리하며, 생성자인 User와 호스트(Host) 관계를 맺습니다.
HTTP의 단방향, 비연결성 한계를 극복하고 서버와 클라이언트 간의 지속적인 양방향 통신을 구현하기 위해 WebSocket 기술을 도입했습니다.WebSocket:개념: 하나의 TCP 연결 위에서 클라이언트와 서버가 실시간으로 데이터를 주고받을 수 있게 해주는 통신 프로
단순히 메시지를 주고받는 것을 넘어, 사용자의 연결(connect), 구독(subscribe), 연결 해제(disconnect)와 같은 WebSocket의 생명주기 이벤트를 감지하고, 이를 활용하여 시스템 전체에 의미 있는 정보를 전달하는 기능을 구현했습니다.WebSo
WebSocket이 양방향 통신에 적합하다면, SSE(Server-Sent Events)는 서버에서 클라이언트로의 단방향 데이터 스트리밍에 특화된 기술입니다. 이를 활용하여 사용자에게 실시간 알림을 보내는 기능을 구현했습니다.SSE (Server-Sent Events)
단순히 텍스트를 생성하는 것을 넘어, AI가 구조화된(Structured) 데이터를 반환하고, 정해진 규칙(Guardrails) 내에서 동작하도록 백엔드 로직을 개선했습니다.구조화된 JSON 응답 파싱:문제점: LLM은 기본적으로 자유로운 텍스트를 생성하므로, 이 결과
단발적인 AI 요청 처리를 넘어, 사용자와 AI 간의 대화 기록을 데이터베이스에 저장하고, 안정적인 API 운영을 위한 레이트 리미터(Rate Limiter)와 API 문서화(Swagger)를 도입했습니다.대화 히스토리 영속성:AIConversation 엔티티: 사용자
서버와 클라이언트가 지속적인 연결을 통해 실시간으로 데이터를 주고받는 양방향(Bidirectional) 통신 채널을 구축하기 위해 WebSocket 기술을 도입했습니다.WebSocket: HTTP와 달리 하나의 TCP 연결 위에서 양방향 데이터 전송을 지원하는 독립적인
Spring AI 프로젝트를 도입하여, 애플리케이션에 AI 모델의 강력한 기능을 손쉽게 통합하고, 이를 통해 코드 리뷰, Q&A 등 지능적인 기능을 제공했습니다.Spring AI 추상화:Spring AI는 OpenAI, Gemini 등 특정 AI 공급업체에 대한 종속성
React 애플리케이션에서 무한 렌더링은 주로 useEffect의 의존성 배열과 상태(State) 업데이트 로직이 잘못 맞물릴 때 발생합니다.불안정한 의존성 (Unstable Dependencies):useEffect의 의존성 배열에 객체나 함수가 포함될 경우, 이들은
Spring Data JPA는 JPA(Java Persistence API)를 더 쉽고 효율적으로 사용할 수 있도록 도와주는 Spring 프레임워크의 모듈입니다. 복잡한 데이터 접근 계층(DAO) 구현을 자동화하여 개발 생산성을 획기적으로 높여줍니다.Repository
클라우드 컴퓨팅(Cloud Computing)이란 인터넷(클라우드)을 통해 서버, 스토리지, 데이터베이스, 소프트웨어 등 IT 리소스를 필요할 때마다 빌려 쓰고(On-demand), 사용한 만큼만 비용을 지불하는(Pay-as-you-go) 서비스입니다.AWS (Amaz
문제점: EC2 인스턴스에서 실행되는 애플리케이션이 다른 AWS 서비스(e.g., S3, DynamoDB)에 접근해야 할 때, IAM 사용자의 액세스 키(Access Key)를 코드나 설정 파일에 하드코딩하는 것은 심각한 보안 위협입니다.해결책 (IAM Role): I
AMI는 EC2 인스턴스를 시작하는 데 필요한 모든 정보를 담고 있는 "서버 템플릿" 또는 "이미지"입니다. AMI 하나만 있으면 동일한 구성의 EC2 인스턴스를 몇 분 만에 수십, 수백 개 복제할 수 있습니다.루트 볼륨 템플릿: 운영체제(OS), 애플리케이션, 라이브
클라우드 컴퓨팅: IT 리소스(서버, 스토리지 등)를 인터넷을 통해 빌려 쓰고(On-demand), 사용한 만큼만 비용을 지불하는(Pay-as-you-go) 서비스 모델입니다.글로벌 인프라:리전 (Region): AWS 서비스가 위치한 지리적 영역 (e.g., 서울).
오늘의 목표는 실제 운영 환경과 유사하게, 애플리케이션을 실행하는 서버(EC2)와 데이터를 저장하는 서버(RDS)를 물리적으로 분리하고, 이 둘을 안전하게 연결하는 것입니다.왜 분리하는가?관리 효율성: RDS는 AWS가 관리해주는 서비스이므로, 우리는 DB 설치, 백업
VPC는 AWS 클라우드 내에서 논리적으로 격리된 나만의 가상 네트워크 공간을 만드는 서비스입니다. VPC를 통해 IP 주소 범위, 서브넷, 라우팅 테이블, 네트워크 게이트웨이 등을 완벽하게 제어할 수 있습니다.CIDR (Classless Inter-Domain Rou
S3는 인터넷을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있는 객체 스토리지(Object Storage) 서비스입니다. 파일 시스템(EBS, EFS)과 달리, 파일을 "객체(Object)" 단위로 관리하며, 각 객체는 데이터, 메타데이터, 고유 키(
DNS (Domain Name System)는 google.com과 같이 사람이 읽기 쉬운 도메인 이름을, 컴퓨터가 이해하는 IP 주소(172.217.175.110)로 변환해주는 시스템입니다. AWS에서는 Route 53이라는 관리형 DNS 서비스를 통해 이 작업을 수
VPC는 AWS 클라우드 내에서 논리적으로 완벽히 격리된 나만의 가상 네트워크 공간을 만드는 서비스입니다. 실제 데이터 센터의 네트워크 환경을 클라우드에서 직접 설계하고 제어할 수 있는 기반이 됩니다.CIDR (사이더): VPC가 사용할 전체 IP 주소 범위를 10.0
EC2는 AWS에서 제공하는 크기 조정이 가능한 가상 서버로, 클라우드 인프라의 핵심 컴퓨팅 리소스입니다.주요 구성 요소 복습:AMI (Amazon Machine Image): OS와 애플리케이션이 설치된 서버 템플릿.인스턴스 유형: CPU, 메모리 등 가상 서버의 하
고가용성 (High Availability): 시스템의 일부에 장애가 발생해도, 전체 서비스는 중단 없이 계속 운영되는 능력. (장애 극복)확장성 (Scalability): 트래픽 변화에 유연하게 대응하는 능력.수직 확장 (Scale-up): 서버의 사양(CPU, RA
오늘의 복습은 백엔드(Spring API)와 프론트엔드(React App)를 AWS에 배포하고, 구매한 도메인과 HTTPS를 적용하는 전체 흐름을 종합적으로 이해하는 것입니다.핵심 원칙: 백엔드와 프론트엔드는 독립적으로 배포되고 확장될 수 있도록 아키텍처를 분리합니다.
AWS의 모든 작업은 IAM에서 시작됩니다. 루트 사용자는 최초 생성 시에만 사용하고, 평소 모든 작업은 필요한 최소한의 권한만 가진 IAM 사용자를 통해 수행하는 것이 철칙입니다.EC2 인스턴스가 다른 AWS 서비스(S3, RDS 등)에 접근해야 할 때는, 액세스 키
구축된 인프라 위에서 애플리케이션이 장애와 트래픽 변동에 자동으로 대응하도록 만드는 핵심 서비스 조합입니다.ELB (Elastic Load Balancing):역할: 들어오는 트래픽을 여러 EC2 인스턴스에 자동으로 분산하고, 헬스 체크를 통해 장애가 발생한 인스턴스를
도커는 애플리케이션을 "컨테이너(Container)"라는 표준화된 단위로 패키징하여, 어떤 환경에서든 빠르고 안정적으로 실행할 수 있게 해주는 플랫폼입니다.핵심 해결 문제: "제 컴퓨터에서는 잘 되는데, 서버에서는 왜 안되죠?" 라는 고질적인 문제를 해결합니다. 애플리
엔티티(Entity)란 데이터베이스의 테이블과 직접적으로 매핑되는 Java 객체입니다. JPA는 이 엔티티 객체의 변화를 감지하여, 데이터베이스에 자동으로 SQL을 실행해주는 역할을 합니다.@Entity:이 클래스가 JPA가 관리하는 엔티티임을 선언합니다.JPA는 이
Spring 애플리케이션은 일반적으로 계층형 아키텍처를 따릅니다. 이는 각 부분이 특정 책임만 갖도록 코드를 구성하여, 시스템의 유지보수성과 확장성을 높이는 설계 방식입니다.주요 계층:Controller (Presentation Layer): HTTP 요청을 받고, 응
도커라이징(Dockerizing)이란 우리의 애플리케이션(e.g., Spring Boot)을 도커 컨테이너에서 실행할 수 있도록 도커 이미지로 만드는 전체 과정을 의미합니다.애플리케이션 빌드: 먼저, Spring Boot 프로젝트를 빌드하여 실행 가능한 JAR 파일을
Docker Hub는 Docker, Inc.에서 제공하는 클라우드 기반의 Docker 이미지 레지스트리(Registry)입니다. 간단히 말해, "Docker 이미지를 위한 GitHub"라고 생각할 수 있습니다.핵심 역할:저장(Store): Dockerfile로 빌드한
쿠버네티스는 컨테이너화된 애플리케이션을 대규모로 자동으로 배포, 스케일링, 관리하기 위한 오픈소스 컨테이너 오케스트레이션(Container Orchestration) 플랫폼입니다.문제점: 도커만으로는 수십, 수백 개의 컨테이너를 관리하기 어렵습니다. 컨테이너 하나가 죽
문제점: 애플리케이션 설정(DB 주소, API 엔드포인트 등)이나 민감한 정보(비밀번호, API 키)를 Docker 이미지에 직접 포함시키는 것은 매우 나쁜 관행입니다. 설정이 변경될 때마다 이미지를 다시 빌드해야 하고, 보안에 매우 취약하기 때문입니다.해결책: 쿠버네
문제점: 소스 코드를 수동으로 빌드, 테스트, 배포하는 작업은 반복적이고, 실수가 잦으며(Human Error), 배포까지 시간이 오래 걸립니다. 개발자가 코드 변경 후 피드백을 받기까지의 사이클이 깁니다.해결책: Jenkins는 이러한 빌드, 테스트, 배포 과정을 자
장애와 트래픽 변동에 자동으로 대응하여 안정적인 서비스를 제공하기 위한 핵심 서비스 조합입니다.ELB (Elastic Load Balancing):역할: 들어오는 트래픽을 여러 EC2 인스턴스에 자동으로 분산하고, 헬스 체크(Health Check)를 통해 장애가 발생
문제점: EKS 클러스터에 애플리케이션을 배포하는 과정은 코드 변경 -> 수동 빌드 -> Docker 이미지 생성 -> Docker Hub/ECR 푸시 -> EKS 접속 -> kubectl 명령어 실행 등 복잡하고 수동적인 단계를 거칩니다. 이는 시간이 오래 걸리고,
React는 페이스북(현 메타)에서 개발한, 사용자 인터페이스(UI)를 만들기 위한 JavaScript 라이브R입니다.핵심 철학:컴포넌트 기반 (Component-Based): UI를 독립적이고 재사용 가능한 조각들(컴포넌트)로 나누어 관리합니다. 레고 블록을 조립하듯
React의 이벤트 처리는 HTML과 유사하지만, 몇 가지 차이점이 있습니다. 이를 통해 사용자의 행동(클릭, 입력 등)에 반응하여 컴포넌트의 상태(State)를 변경하고 UI를 동적으로 만들 수 있습니다.주요 특징:카멜 케이스 (camelCase): onclick 대
Side Effect (부수 효과)란 React 컴포넌트의 주된 역할인 UI 렌더링 외에, 외부 세계와 상호작용하는 모든 작업을 의미합니다.주요 Side Effects 예시:HTTP 요청 (데이터 fetching)타이머 설정 (setTimeout, setInterval
Java는 객체 지향 프로그래밍(OOP) 언어로, "한 번 작성하면, 어디서든 실행된다(Write Once, Run Anywhere)"는 슬로건으로 유명합니다.JVM (Java Virtual Machine): Java 코드는 컴파일되면 특정 운영체제(OS)에 종속적인
OOP는 현실 세계의 사물이나 개념을 "객체(Object)"로 모델링하고, 이 객체들 간의 상호작용을 통해 프로그램을 설계하는 방식입니다.부품에 해당하는 객체들을 먼저 만들고, 이것들을 조립하여 전체 프로그램을 완성하는 상향식(Bottom-up) 개발 방식입니다. 이를
생성자는 new 키워드를 통해 객체가 생성될 때, 해당 객체를 초기화하기 위해 호출되는 특별한 종류의 메서드입니다.주요 규칙:생성자의 이름은 클래스의 이름과 반드시 동일해야 합니다.생성자는 반환 타입(return type)을 가지지 않습니다.클래스에 생성자를 하나도 정
추상 클래스란 미완성된 설계도로, 하나 이상의 추상 메서드(abstract method)를 포함하는 클래스입니다.추상 메서드: 선언부만 있고 구현부({})가 없는 메서드를 의미합니다.특징:abstract 키워드를 사용하여 선언합니다.미완성된 설계도이므로, 스스로 객체(
제네릭이란 클래스나 메서드를 작성할 때, 다룰 데이터의 타입(Type)을 미리 지정하지 않고, 실제 사용할 때 지정할 수 있도록 하는 기능입니다. List<String>에서 <String> 부분이 바로 제네릭입니다.왜 사용하는가? (제네릭의 장점)타입 안정성
프로세스 (Process): 운영체제(OS)로부터 자원(메모리, CPU)을 할당받아 실행 중인 프로그램의 단위. 각 프로세스는 독립적인 메모리 공간을 가집니다. (e.g., Chrome 브라우저, IntelliJ IDEA)스레드 (Thread): 프로세스 내에서 작업을
Java 네트워킹은 서로 다른 컴퓨터(프로세스) 간에 데이터를 교환할 수 있도록 지원하는 기능입니다. 모든 네트워크 통신은 소켓(Socket)을 기반으로 합니다.IP 주소: 네트워크상에서 컴퓨터를 식별하는 고유한 주소. (e.g., 127.0.0.1 - 로컬 컴퓨터)포
Spring Boot는 기존의 Spring 프레임워크를 더 쉽고, 더 빠르게 사용할 수 있도록 만들어주는 프로젝트입니다. Spring Boot는 새로운 프레임워크가 아니라, Spring을 사용하기 위한 "발판(Booster)" 또는 "도구 모음"에 가깝습니다.Sprin
Spring Boot 웹 개발은 Spring MVC 프레임워크를 기반으로 동작합니다. 여기서 컨트롤러(Controller)는 클라이언트의 HTTP 요청을 가장 먼저 받아 처리하는 관문 역할을 합니다.@Controller:이 어노테이션이 붙은 클래스를 Spring이 컨트
IoC(제어의 역전)는 Spring 프레임워크의 가장 근본적인 설계 원리입니다.전통적인 방식: 개발자가 직접 객체를 생성하고, 의존성을 연결하며 프로그램의 흐름을 제어합니다.IoC 방식: 객체의 생성과 생명주기 관리, 의존성 연결 등 모든 제어권이 개발자로부터 프레임워
Spring Data JPA는 JPA(Java Persistence API)를 더 쉽고 효율적으로 사용할 수 있도록 도와주는 Spring 프레임워크의 모듈입니다. 복잡한 데이터 접근 계층(DAO) 구현을 자동화하여 개발 생산성을 획기적으로 높여줍니다.역할: 데이터베이스
컨테이너화(Containerization)란 애플리케이션과 그 실행에 필요한 모든 환경(JDK, 라이브러리, 설정 파일 등)을 "컨테이너"라는 격리된 표준 단위로 패키징하는 기술입니다. Docker는 이를 위한 가장 대표적인 플랫폼입니다.핵심 장점: "제 컴퓨터에서는
문제점: Docker만으로는 수십, 수백 개의 컨테이너를 운영 환경에서 안정적으로 관리하기 어렵습니다.컨테이너 하나가 죽으면 누가 다시 살릴 것인가? (장애 복구)트래픽이 몰리면 어떻게 컨테이너 수를 늘릴 것인가? (스케일링)서비스 중단 없이 애플리케이션을 어떻게 업데
오늘의 복습은 백엔드(Spring API)와 프론트엔드(React App)를 AWS 클라우드 환경에 배포하고, 이를 도메인과 HTTPS로 안정적으로 서비스하며, 배포 과정을 자동화하는 전체 흐름을 종합적으로 이해하는 것입니다.핵심 원칙:분리 (Decoupling): 백
Spring 웹 애플리케이션에서 클라이언트의 요청이 컨트롤러(Controller)의 핸들러 메서드에 도달하기까지는 여러 단계를 거칩니다. 필터(Filter), 인터셉터(Interceptor), Argument Resolver는 이 과정의 각기 다른 지점에서 공통적인 부
애플리케이션 실행 중 발생하는 예외를 처리하여, 사용자에게는 친절한 에러 메시지를 보여주고, 시스템은 비정상적으로 종료되지 않도록 관리하는 것은 매우 중요합니다. Spring은 예외를 효율적으로 처리하기 위한 여러 방법을 제공합니다.개념: 특정 컨트롤러 내에서 발생한
스케줄링이란 애플리케이션 내에서 특정 작업을 미리 정해진 시간에 또는 주기적으로 자동으로 실행하도록 만드는 기능입니다.주요 사용 사례:매일 자정에 통계 데이터 배치(Batch) 작업 실행1시간마다 외부 API를 호출하여 데이터 동기화매주 월요일 아침에 리포트 이메일 발
Lombok은 Java 개발 시 반복적으로 작성해야 하는 보일러플레이트 코드(Boilerplate Code)를 어노테이션 하나로 자동 생성해주는 매우 유용한 라이브러리입니다.문제점: Java의 클래스(특히 DTO나 Entity)를 작성할 때, Getter, Setter
프로파일은 애플리케이션을 실행하는 환경(Environment)(e.g., 개발, 테스트, 운영)에 따라 서로 다른 설정을 적용할 수 있게 해주는 Spring의 강력한 기능입니다.문제점: 개발 환경에서는 로컬 DB를 사용하고, 운영 환경에서는 실제 운영 DB를 사용해야
Java 애플리케이션(Spring Boot 포함)은 JVM(Java Virtual Machine) 위에서 동작하며, JVM은 OS로부터 할당받은 메모리를 자신만의 규칙에 따라 여러 영역으로 나누어 관리합니다. 이 구조를 이해하는 것은 메모리 누수(Memory Leak)
어제 학습한 것처럼, Major GC(Full GC)는 "Stop-the-World"를 유발하여 애플리-케이션의 응답성에 큰 영향을 줍니다. JVM 튜닝의 가장 기본적인 목표는 애플리-케이션의 특성에 맞게 힙(Heap) 메모리 크기를 조절하여, Full GC의 발생 빈
이전에 학습한 Spring의 @Cacheable은 기본적으로 애플리케이션 내부 메모리(e.g., ConcurrentHashMap)에 데이터를 저장하는 로컬 캐시 방식입니다.문제점 (분산 환경에서의 데이터 불일치):로드 밸런서 뒤에서 여러 대의 서버(WAS 1, WAS
이전에 학습한 @Async는 간단한 비동기 처리를 가능하게 하지만, 몇 가지 한계점을 가집니다.@Async의 한계:애플리케이션 종속성: 비동기 작업이 애플리케이션 서버(WAS)의 내부 스레드 풀에서 동작하므로, 작업량이 많아지면 WAS 자체의 성능에 영향을 줄 수 있습
데이터베이스 마이그레이션(Database Migration)이란 개발 과정에서 발생하는 데이터베이스 스키마(테이블 구조, 제약조건 등)의 변경 사항을 체계적으로 관리하고 추적하는 프로세스입니다.문제점:JPA의 ddl-auto 한계: create나 update 옵션은 개
문제점: 개발 과정에서 데이터베이스 스키마(테이블 구조, 컬럼 추가/변경 등)는 계속해서 변경됩니다. 여러 개발자가 협업하거나, 개발/테스트/운영 등 여러 환경에 애플리케이션을 배포할 때, 모든 데이터베이스의 스키마 버전을 일관되게 유지하고 변경 이력을 추적하는 것은
Spring Security는 Spring 기반의 애플리케이션에서 보안(인증과 인가)을 쉽고 강력하게 구현할 수 있도록 지원하는 프레임워크입니다.보안과 관련된 거의 모든 표준적인 기능(폼 로그인, 소셜 로그인, JWT, CORS, CSRF 방어 등)을 제공하며, 서블릿
전통적인 세션(Session) 기반 인증은 서버가 각 사용자의 로그인 상태를 메모리에 저장해야 하므로, 서버를 수평적으로 확장(Scale-out)할 때 세션 불일치 문제가 발생할 수 있습니다. JWT는 이러한 문제를 해결하는 Stateless(무상태) 인증 방식입니다.
개발이 완료된 Spring Boot 애플리케이션을 클라우드 서버(AWS EC2)에 배포하여, 인터넷을 통해 누구나 접근할 수 있도록 만드는 과정입니다.EC2 인스턴스 준비:AWS에서 EC2 인스턴스(가상 서버)를 생성합니다.Java(JDK), Git 등 애플리케이션 실
소프트웨어 테스트는 검증하려는 범위와 목적에 따라 여러 종류로 나뉩니다. 테스트 피라미드는 안정적이고 효율적인 테스트 전략을 수립하기 위한 모델입니다.Test Pyramid단위 테스트 (Unit Test) - 피라미드의 가장 넓은 기반:범위: 클래스나 메서드와 같은 가
컨트롤러(Controller)는 웹 계층의 일부로, HTTP 요청을 받고 응답을 보내는 역할을 합니다. 따라서 컨트롤러 테스트는 단순히 메서드를 호출하는 것을 넘어, 실제 HTTP 요청과 응답을 시뮬레이션하는 방식으로 이루어져야 합니다.문제점: @SpringBootTe
데이터베이스 연동 코드를 테스트하는 방법은 크게 두 가지로 나뉩니다.@DataJpaTest (인메모리 DB 사용):개념: 실제 DB가 아닌, H2와 같은 인메모리(In-memory) 데이터베이스를 사용하여 Repository 계층을 테스트하는 방식입니다.장점: 설정이
Spring Boot의 "독립 실행 가능성(Standalone)" 특징을 활용하는 가장 간단하고 기본적인 배포 방식입니다.빌드: 로컬 개발 환경이나 빌드 서버에서 ./gradlew build 명령어를 실행하여, 모든 의존성이 포함된 실행 가능한 JAR 파일(Fat JA
JPA는 연관된 엔티티를 조회할 때, 실제 엔티티 객체 대신 프록시(Proxy) 객체를 사용하여 성능을 최적화합니다.프록시 객체:실제 엔티티 클래스를 상속받아 만들어진 가짜(껍데기) 객체입니다.내부에는 실제 엔티티의 ID 값만 가지고 있으며, 나머지 필드는 비어있습니다
Spring Security의 인증(Authentication) 과정은 여러 컴포넌트가 유기적으로 협력하여 이루어집니다. 이 구조를 이해하면 커스텀 인증 로직을 구현하는 데 큰 도움이 됩니다.AuthenticationFilter:사용자의 로그인 요청(e.g., /log
JavaScript는 웹 페이지를 동적이고 인터랙티브하게 만들기 위해 탄생한 프로그래밍 언어입니다.과거에는 브라우저에서만 사용되었지만, Node.js의 등장으로 이제는 서버(백엔드), 데스크톱 앱, 모바일 앱 등 거의 모든 영역에서 사용되는 범용 언어가 되었습니다.웹에
객체는 관련된 데이터와 기능(메서드)을 한 곳에 모아놓은 key: value 쌍의 집합입니다. JavaScript의 거의 모든 것은 객체로 이루어져 있으며, 가장 중요한 데이터 구조입니다.객체 리터럴 (Object Literal): 가장 일반적인 생성 방식.속성 접근:
객체는 관련된 데이터와 기능(메서드)을 한 곳에 모아놓은 key: value 쌍의 집합입니다. JavaScript의 거의 모든 것은 객체로 이루어져 있으며, 가장 중요한 데이터 구조입니다.객체 리터럴 (Object Literal): 가장 일반적인 생성 방식.속성 접근:
DOM은 웹 브라우저가 HTML 문서를 해석하여, JavaScript가 문서의 구조, 스타일, 내용과 상호작용할 수 있도록 객체(Object) 형태로 모델링한 것입니다. 즉, DOM은 JavaScript와 HTML 사이의 인터페이스(API) 역할을 합니다.JavaScr
AJAX는 페이지 전체를 새로고침하지 않고도, 백그라운드에서 서버와 데이터를 주고받아 웹 페이지의 일부만 동적으로 업데이트하는 기술을 의미합니다.핵심 아이디어: 사용자의 인터랙션에 반응하여 필요한 데이터만 서버에 요청하고, 그 결과를 받아 현재 페이지에 즉시 반영함으로
HTML은 웹 페이지의 구조와 콘텐츠를 정의하는 마크업 언어입니다. 프로그래밍 언어처럼 로직을 가지는 것이 아니라, 텍스트, 이미지, 링크 등의 콘텐츠가 어떤 의미를 가지는지(제목, 단락, 목록 등)를 태그(Tag)를 통해 표시(Mark up)합니다.모든 HTML 문서
현대적인 웹 페이지는 세 가지 핵심 기술의 조합으로 만들어집니다. 이들의 역할을 명확히 분리하는 것이 유지보수하기 좋은 코드를 작성하는 첫걸음입니다.HTML (HyperText Markup Language)은 태그(Tag)를 사용하여 문서의 구조를 만듭니다.시맨틱 웹
IoC(제어의 역전)는 Spring 프레임워크의 가장 근본적인 설계 철학입니다.전통적인 방식: 개발자가 직접 객체를 생성(new MyService())하고, 의존성을 연결하며 프로그램의 흐름을 제어합니다. (제어권이 개발자에게 있음)IoC 방식: 객체의 생성, 생명주기
Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로, 웹 계층의 역할을 명확하게 분리하여 유연하고 확장성 있는 웹 애플리케
우리가 웹 브라우저에 주소(www.google.com)를 입력하고 엔터를 치면, 웹 페이지가 눈앞에 나타나기까지 보이지 않는 곳에서 여러 통신이 일어납니다. 이 과정을 이해하는 것이 웹 관리의 첫걸음입니다.클라이언트-서버 모델 (Client-Server Model):클
웹 호스팅이란 내가 만든 웹사이트(HTML, CSS, 이미지 등의 파일)를 인터넷에 항상 연결되어 있는 서버 컴퓨터의 공간 일부를 빌려 저장하고, 전 세계 사용자들이 접속할 수 있도록 해주는 서비스를 의미합니다.왜 필요한가?: 내 개인 컴퓨터로도 웹 서버를 만들 수는
웹 서버 소프트웨어는 하드웨어 컴퓨터(서버)에 설치되어, 클라이언트(웹 브라우저)로부터 HTTP 요청을 받아 정적 콘텐츠(HTML, CSS, 이미지 등)를 제공하거나, 동적 요청을 WAS로 전달하는 핵심 프로그램입니다.현재 전 세계 웹 서버 시장은 Apache와 Ngi
웹 성능 최적화란 웹사이트의 로딩 속도를 높이고, 사용자의 상호작용에 더 빠르게 반응하도록 만드는 모든 작업을 의미합니다. 빠른 웹사이트는 사용자 경험(UX)을 향상시키고, 이탈률을 낮추며, 검색 엔진 순위에도 긍정적인 영향을 미칩니다.최적화의 첫 단계는 현재 성능을
웹 로그란 웹 서버가 작동하면서 발생하는 모든 활동(누가, 언제, 어디서, 무엇을 요청했는지 등)을 시간 순서대로 기록한 파일입니다. 이 로그 파일을 분석하면 웹사이트의 현황을 파악하고, 문제점을 진단하며, 비즈니스 전략을 수립하는 데 필요한 귀중한 데이터를 얻을 수
리눅스: 웹 서버, 클라우드 서버(AWS EC2 등)에서 가장 널리 사용되는 오픈소스 운영체제(OS)입니다. 안정성이 높고, 유연하며, 무료라는 장점 덕분에 서버 시장을 지배하고 있습니다.CLI (Command Line Interface): 그래픽 사용자 인터페이스(G
리눅스 서버에 웹 서버 소프트웨어를 설치하는 것은 패키지 매니저(Package Manager)를 통해 매우 간단하게 수행할 수 있습니다. 패키지 매니저는 소프트웨어의 설치, 업데이트, 삭제를 자동화해주는 도구입니다.주요 리눅스 배포판별 패키지 매니저:CentOS / R
가상 호스트란 하나의 물리적인 서버(하나의 IP 주소)에서 여러 개의 다른 도메인 이름을 가진 웹사이트를 운영할 수 있게 해주는 기술입니다.예시: example.com과 another-site.org라는 두 개의 다른 웹사이트를 서버 한 대로 동시에 서비스하는 것.동작
동적인 웹 애플리케이션은 대부분의 데이터를 데이터베이스에 저장하고 관리합니다. MariaDB는 널리 사용되는 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)으로, MySQL과 거의 완벽하게 호환됩니다.설치: yum 패키지 매니저를 사용하여 MariaDB 서버를 설
백업은 서버 운영 중 발생할 수 있는 데이터 손실(하드웨어 장애, 해킹, 사용자 실수 등)에 대비하여, 데이터와 설정 파일의 복사본을 별도의 저장 공간에 보관하는 가장 기본적인 재해 복구(Disaster Recovery) 활동입니다."백업이 없는 서버 관리는 존재하지
클라이언트-서버 모델: 웹은 클라이언트(브라우저)가 서버에 HTTP 요청(Request)을 보내고, 서버가 HTTP 응답(Response)을 주는 방식으로 동작합니다.DNS: mydomain.com과 같은 도메인 이름을 서버의 실제 IP 주소로 변환해주는 "인터넷 전화
클라우드 네이티브는 단순히 애플리케이션을 클라우드(AWS 등)에서 "실행"하는 것을 넘어, 클라우드 환경의 장점을 최대한 활용하도록 애플리케이션을 "설계하고, 만들고, 운영하는 방식(철학)"을 의미합니다.핵심 목표: 변화에 빠르고 유연하게 대응하며, 안정적이고 확장성
도커(Docker)는 애플리케이션과 그 실행에 필요한 모든 환경(코드, 런타임, 라이브러리, 설정 파일 등)을 "컨테이너(Container)"라는 격리된 표준 단위로 패키징하는 기술입니다.핵심 역할: "빌드하고, 배송하고, 어디서든 실행한다(Build, Ship, an
MSA는 하나의 거대한 애플리케이션(모놀리식)을 기능별로 잘게 쪼개어, 독립적으로 배포하고 확장할 수 있는 작은 서비스들의 집합으로 만드는 아키텍처 스타일입니다.핵심 목표:Agility (민첩성): 변경된 서비스만 독립적으로 빠르게 배포하여, 시장 변화에 신속하게 대응
원칙: 마이크로서비스 아키텍처의 핵심 원칙 중 하나는 "서비스당 하나의 데이터베이스(Database per Service)"입니다.각 마이크로서비스는 자신만의 독립적인 데이터베이스를 소유하고 관리합니다.다른 서비스는 해당 서비스의 데이터베이스에 직접 접근할 수 없으며,
모놀리식 환경: 로그 파일이 하나의 서버에만 존재하므로, 문제가 발생하면 해당 서버에 접속하여 로그 파일을 직접 확인하면 됩니다.MSA의 문제점: 수십, 수백 개의 서비스 인스턴스가 각자 로그 파일을 생성합니다. 특정 요청 처리 중 발생한 오류를 찾기 위해, 어떤 서비
CI/CD (지속적 통합/배포)는 마이크로서비스 아키텍처를 성공적으로 운영하기 위한 필수적인 전제조건입니다. 수십 개의 서비스를 수동으로 배포하고 관리하는 것은 불가능하기 때문입니다.마이크로서비스 환경에서의 CI/CD 파이프라인:서비스별 독립 파이프라인: 각 마이크로서
Java는 객체 지향 프로그래밍(OOP) 언어로, "한 번 작성하면, 어디서든 실행된다(Write Once, Run Anywhere)"는 슬로건으로 유명합니다.JVM (Java Virtual Machine): Java 코드는 컴파일되면 특정 운영체제(OS)에 종속적인
OOP는 현실 세계의 사물이나 개념을 "객체(Object)"로 모델링하고, 이 객체들 간의 상호작용을 통해 프로그램을 설계하는 방식입니다.부품에 해당하는 객체들을 먼저 만들고, 이것들을 조립하여 전체 프로그램을 완성하는 상향식(Bottom-up) 개발 방식입니다. 이를
추상 클래스란 미완성된 설계도로, 하나 이상의 추상 메서드(abstract method)를 포함하는 클래스입니다.추상 메서드: 선언부만 있고 구현부({})가 없는 메서드를 의미합니다.특징:abstract 키워드를 사용하여 선언합니다.미완성된 설계도이므로, 스스로 객체(
제네릭이란 클래스나 메서드를 작성할 때, 다룰 데이터의 타입(Type)을 미리 지정하지 않고, 실제 사용할 때 지정할 수 있도록 하는 기능입니다. List<String>에서 <String> 부분이 바로 제네릭입니다.왜 사용하는가? (제네릭의 장점)타입 안정성
프로세스 (Process): 운영체제(OS)로부터 자원(메모리, CPU)을 할당받아 실행 중인 프로그램의 단위. 각 프로세스는 독립적인 메모리 공간을 가집니다. (e.g., Chrome 브라우저, IntelliJ IDEA)스레드 (Thread): 프로세스 내에서 작업을
Java 네트워킹은 서로 다른 컴퓨터(프로세스) 간에 데이터를 교환할 수 있도록 지원하는 기능입니다. 모든 네트워크 통신은 소켓(Socket)을 기반으로 합니다.IP 주소: 네트워크상에서 컴퓨터를 식별하는 고유한 주소. (e.g., 127.0.0.1 - 로컬 컴퓨터)포
데이터 모델링(Data Modeling)이란 현실 세계에 존재하는 다양한 업무 프로세스와 데이터의 관계를, 사람이 이해하기 쉬운 형태로 추상화하여 정보 시스템으로 구축하기 위한 설계도(Blueprint)를 만드는 과정입니다.핵심 목표: 복잡한 현실 세계를 단순화하고 명
엔터티란 업무에서 관리해야 할, 의미 있는 정보를 담고 있는 명사형 대상입니다. 데이터베이스의 테이블(Table)로 변환되는 실체 또는 개념입니다.예시: 학생, 과목, 주문, 상품 등. 단순히 "사물"뿐만 아니라, 주문, 수강신청과 같이 눈에 보이지 않는 "개념"도 엔
속성이란 엔터티(Entity)가 가지는 세부적인 정보 항목으로, 엔터티를 설명하는 최소의 데이터 단위입니다.하나의 엔터티는 2개 이상의 속성을 가지며, 각 속성은 고유한 이름과 값을 가집니다. 데이터베이스에서는 컬럼(Column)으로 변환됩니다.예시: 학생 엔터티는 학
관계란 두 개 이상의 엔터티(Entity) 간에 존재하는 논리적인 연관성 또는 상호작용을 의미합니다.관계는 ERD(Entity-Relationship Diagram)에서 엔터티들을 선으로 연결하여 표현하며, 이 관계를 통해 데이터 모델의 구조와 업무 규칙을 파악할 수
식별자란 하나의 엔터티(Entity) 내에서 각각의 인스턴스(행)를 유일하게 구분할 수 있는 속성(Attribute) 또는 속성들의 집합입니다.데이터베이스에서는 기본 키(Primary Key, PK) 제약조건으로 생성되어, 데이터의 무결성을 보장하는 핵심적인 역할을 합
데이터 모델링: 현실 세계의 업무 프로세스를 추상화하여, 데이터베이스의 구조를 체계적으로 설계하는 과정. "데이터베이스의 설계도"를 만드는 작업.모델링의 3단계:개념적 모델링: 업무의 핵심 데이터와 관계를 추상적으로 정의. (ERD 작성)논리적 모델링: 특정 DBMS에
SQL은 데이터베이스와 상호작용하기 위한 표준 언어로, 기능에 따라 크게 세 가지(또는 네 가지)로 분류됩니다.DELETE vs TRUNCATE vs DROP:DELETE: 데이터만 행 단위로 삭제. ROLLBACK 가능. (DML)TRUNCATE: 테이블 구조는 남기
JOIN은 두 개 이상의 테이블을 공통된 컬럼을 기준으로 논리적으로 연결하여, 하나의 결과 집합으로 만드는 관계형 데이터베이스의 핵심적인 연산입니다.서브쿼리는 다른 SQL 문(SELECT, INSERT, UPDATE, DELETE) 내부에 포함된 SELECT 문으로,
윈도우 함수는 GROUP BY처럼 행들을 그룹화하여 집계하는 것은 유사하지만, GROUP BY와 달리 기존 행들을 하나로 합치지 않고, 각 행에 대해 원본 행의 관계를 유지하며 계산 결과를 반환하는 강력한 함수입니다.핵심 개념: 행들의 "창(Window)"을 정의하고,
SQL은 기능에 따라 DDL, DML, DCL, TCL로 분류됩니다. 이들의 역할과 트랜잭션 관계를 이해하는 것이 기본입니다.SELECT 문의 논리적 실행 순서 (매우 중요):FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
운영체제란 컴퓨터의 하드웨어(Hardware)와 사용자(또는 애플리케이션 소프트웨어) 사이의 중재자 역할을 하는 시스템 소프트웨어입니다. 한정된 컴퓨터 자원을 효율적으로 관리하고, 사용자에게 편리한 작업 환경을 제공하는 것이 주 목적입니다.운영체제에서 작업을 처리하는
OSI 7계층 모델은 통신을 이해하기 위한 참조 모델이고, 현재 인터넷에서 실제로 사용되는 프로토콜의 집합은 TCP/IP 모델(또는 TCP/IP 4계층)입니다.전송 계층은 송신자와 수신자를 연결하는 종단 간(End-to-end) 데이터 전송을 담당합니다.IP는 패킷(P
프로그래밍 언어는 컴퓨터에 명령을 내리기 위한 약속된 형식의 언어입니다. 언어의 발전 과정과 실행 방식에 따라 여러 기준으로 분류할 수 있습니다.저급 언어 (Low-level Language):기계어: 0과 1로 이루어져 컴퓨터가 직접 이해할 수 있는 유일한 언어.어셈
연산자는 프로그램에서 데이터를 가공하고, 비교하며, 논리적인 판단을 내리는 데 사용되는 기호입니다. 연산의 우선순위를 이해하는 것이 중요합니다.\++나 --가 변수의 앞에 붙느냐 뒤에 붙느냐에 따라 연산 순서가 달라집니다.제어문은 프로그램의 실행 흐름을 조건이나 반복에
포인터란 다른 변수의 메모리 주소(Address)를 값으로 가지는 특별한 종류의 변수입니다.포인터를 사용하면 메모리에 직접 접근하여 데이터를 조작할 수 있어, 저수준의 정교한 프로그래밍이 가능합니다.OOP는 현실 세계의 사물이나 개념을 "객체(Object)"로 모델링하
데이터베이스란 여러 사람이나 시스템이 공유하고 사용할 목적으로, 통합하여 관리되는 데이터의 집합입니다.DBMS (Database Management System): 데이터베이스를 효율적으로 생성, 관리, 사용할 수 있도록 해주는 소프트웨어 시스템입니다. (e.g., O
DML은 데이터베이스 테이블의 데이터를 조작(추가, 수정, 삭제, 조회)하는 데 사용되는 SQL 명령어 그룹입니다. DML로 수행된 작업은 트랜잭션(Transaction)으로 관리되며, COMMIT을 통해 영구 저장하거나 ROLLBACK을 통해 취소할 수 있습니다.테이
JOIN은 두 개 이상의 테이블을 공통된 컬럼을 기준으로 논리적으로 연결하여, 하나의 결과 집합으로 만드는 관계형 데이터베이스의 핵심적인 연산입니다. 정규화를 통해 분리된 테이블들을 다시 합쳐서 의미 있는 데이터를 조회할 때 사용됩니다.개념: 두 테이블을 연결할 때,
소프트웨어 생명 주기란 소프트웨어를 개발하기 위해 요구분석부터 유지보수까지의 전 과정을 단계별로 나눈 것입니다. 소프트웨어 개발 방법론은 이 생명 주기를 어떤 방식으로 진행할지에 대한 모델을 제시합니다.개념: 각 단계를 순차적으로, 위에서 아래로 물이 떨어지듯 진행하는
소프트웨어 테스트란 개발된 소프트웨어에 잠재된 결함(Defect, Fault, Bug)을 찾아내고, 요구사항을 만족하는지 품질을 검증하기 위한 모든 활동입니다.완벽한 테스팅은 불가능: 모든 입력과 상황을 테스트하는 것은 불가능하므로, 리스크 분석과 우선순위에 따라 테스
정보보안이란 정보의 수집, 가공, 저장, 검색, 송수신 중에 정보가 훼손, 변조, 유출되는 것을 방지하기 위한 관리적, 기술적 방법과 수단을 의미합니다. 정보보안이 추구하는 핵심적인 목표는 다음과 같습니다. (암기 필수)암호화는 기밀성을 보장하기 위한 가장 기본적인 기
네트워크 보안은 외부의 불법적인 침입으로부터 내부 네트워크와 시스템을 보호하는 것을 목표로 합니다. 이를 위해 여러 보안 장비들이 계층적으로 사용됩니다.서비스 거부 공격(Denial of Service, DoS)은 시스템의 자원을 고갈시키거나 정상적인 동작을 방해하여,
소프트웨어의 품질을 보증하기 위해, 개발된 애플리케이션이 요구사항에 맞게 동작하는지, 성능이나 보안에 문제는 없는지를 검증하는 활동입니다.시큐어 코딩(Secure Coding)이란 소프트웨어 개발 단계에서부터 보안 취약점이 발생하지 않도록, 보안을 고려하여 코드를 작성
개인정보보호법은 개인정보의 수집, 유출, 오용, 남용으로부터 사생활의 비밀 등을 보호함으로써 국민의 권리와 이익을 증진하고자 제정된 법률입니다. IT 시스템을 구축하고 운영하는 모든 기업과 기관은 이 법을 반드시 준수해야 합니다.개인정보란 살아있는 개인에 관한 정보로서
컴퓨터 시스템과 네트워크의 기본적인 동작 원리를 다룹니다.운영체제 (OS):핵심 역할: 컴퓨터의 자원(프로세스, 메모리, I/O 장치, 파일)을 효율적으로 관리하는 시스템 소프트웨어.프로세스 vs 스레드: 프로세스는 실행 중인 프로그램(독립된 메모리), 스레드는 프로세
지금까지 학습한 Java, 객체 지향, 데이터베이스, Spring의 핵심 원리(IoC/DI, AOP) 등의 이론을 바탕으로, 이제 실제 동작하는 웹 애플리케이션을 만들어보는 첫 단계입니다.Spring Boot는 복잡한 초기 설정을 자동화하여, 개발자가 빠르게 비즈니스
Spring Boot 애플리케이션이 데이터베이스와 통신하기 위해서는 몇 가지 핵심 라이브러리(의존성)가 필요합니다. 이들은 build.gradle 파일에 추가합니다.Spring Data JPA (spring-boot-starter-data-jpa):JPA(Java Pe
Spring 애플리케이션은 일반적으로 계층형 아키텍처를 따릅니다. 이는 각 부분이 특정 책임만 갖도록 코드를 구성하여, 시스템의 유지보수성과 확장성을 높이는 설계 방식입니다.주요 계층:Controller (Presentation Layer):책임: HTTP 요청을 받고
클라이언트로부터 받은 데이터(DTO)가 비즈니스 규칙에 맞는지 검증하는 것은 시스템의 안정성과 데이터 무결성을 위해 필수적입니다. Spring Boot는 Bean Validation 표준을 통해 이를 선언적으로 처리할 수 있게 돕습니다.애플리케이션 전역에서 발생하는 예
Spring Security는 Spring 기반 애플리케이션의 인증(Authentication)과 인가(Authorization)를 담당하는 강력한 프레임워크입니다. 서블릿 필터(Filter) 체인을 기반으로 동작하여, 요청이 컨트롤러에 도달하기 전에 다양한 보안 검사
Swagger는 OpenAPI Specification(OAS) 표준을 기반으로, REST API의 명세를 자동으로 생성하고, 시각적인 UI로 문서화하며, 해당 UI에서 직접 API를 테스트해볼 수 있는 강력한 도구입니다.문제점: API를 개발한 후, API 명세서를
CI/CD는 "지속적인 통합(Continuous Integration)"과 "지속적인 배포(Continuous Deployment/Delivery)"를 의미하며, 애플리케이션 개발부터 배포까지의 전체 과정을 자동화하여, 빠르고 안정적으로 서비스를 제공하는 것을 목표로
리버스 프록시는 클라이언트의 요청을 대신 받아서 내부망에 있는 실제 서버(WAS)로 전달하고, 그 응답을 다시 클라이언트에게 전달하는 중개 서버입니다.클라이언트는 자신이 실제 WAS가 아닌 리버스 프록시 서버와 통신하고 있음을 알지 못합니다.왜 필요한가?:보안: 실제
HTTP (HyperText Transfer Protocol)는 웹에서 데이터를 주고받는 기본 프로토콜이지만, 모든 데이터를 평문(Plain Text)으로 전송하여 중간에 누군가 엿보거나(도청), 데이터를 변조할 위험이 있습니다.HTTPS (HTTP Secure):HT
이번 프로젝트는 현대적인 웹 애플리케이션의 표준적인 아키텍처를 따라, 각 기술 요소가 명확한 책임을 가지고 유기적으로 동작하도록 구축되었습니다.클라이언트 사용자가 웹 브라우저에서 https://my-app.com에 접속합니다.DNS DNS 서버가 도메인을 서버
전통적인 웹 개발(Vanilla JavaScript, jQuery)에서는 데이터가 변경될 때마다, 개발자가 직접 어떤 DOM 요소를 찾아 어떻게 변경할지를 코드로 작성해야 했습니다. 이는 UI가 복잡해질수록 코드를 관리하기 매우 어렵게 만듭니다.React는 이러한 문제
Props가 부모로부터 받은 "외부 데이터"라면, State(상태)는 컴포넌트가 내부적으로 소유하고 관리하는 "내부 데이터"입니다. 사용자의 인터랙션 등으로 인해 변경될 수 있는 모든 값은 State로 관리해야 합니다.React의 핵심 원리: State가 변경되면, R
React의 기본 데이터 흐름은 하향식(Top-Down)입니다 (부모 → 자식, via Props). 하지만 자식 컴포넌트에서 발생한 데이터를 부모 컴포넌트로 전달해야 할 때가 많습니다. (e.g., 자식의 폼에서 입력한 데이터를 부모의 목록 상태에 추가)핵심 원리:
React에서 컴포넌트에 스타일을 적용하는 방법은 여러 가지가 있으며, 각 방식의 장단점을 이해하고 상황에 맞게 사용하는 것이 중요합니다.동적 클래스 적용: 상태에 따라 클래스 이름을 조건부로 부여하는 것은 매우 일반적인 패턴입니다.Side Effect (부수 효과)란
useState, useEffect 외에도, 특정 상황에서 유용하게 사용되는 여러 내장 Hook들이 있습니다.useRef는 두 가지 주요 목적을 위해 사용되는 Hook입니다.DOM 요소에 대한 직접적인 접근: ref 속성을 통해 특정 JSX 엘리먼트를 직접 참조할 수
React로 애플리케이션을 만드는 것은 단순히 코드를 작성하는 것을 넘어, UI를 어떻게 컴포넌트 단위로 분해하고, 데이터가 어떻게 흐를지를 설계하는 과정입니다."Todo List" 애플리케이션을 만든다고 가정해봅시다.UI를 컴포넌트 계층 구조로 나누기:App (전체를
IoC(제어의 역전)는 Spring 프레임워크의 가장 근본적인 설계 철학입니다.전통적인 방식: 개발자가 직접 객체를 생성(new MyService())하고, 의존성을 연결하며 프로그램의 흐름을 제어합니다. (제어권이 개발자에게 있음)IoC 방식: 객체의 생성, 생명주기
Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로, 웹 계층의 역할을 명확하게 분리하여 유연하고 확장성 있는 웹 애플리케
NestJS는 효율적이고, 안정적이며, 확장성 높은 서버 사이드 애플리케이션을 구축하기 위한 Node.js 프레임워크입니다.내부적으로는 Express.js (또는 Fastify) 위에서 동작하며, TypeScript를 완벽하게 지원합니다.핵심 철학:Angular에서 영
NestJS CLI는 반복적인 모듈, 컨트롤러, 서비스 파일 생성을 자동화하여 개발 생산성을 크게 향상시킵니다.리소스(Resource) 한번에 생성하기:위 명령어를 실행하면, movies라는 기능에 필요한 파일들이 자동으로 생성되고, 루트 모듈(app.module.ts
클라이언트로부터 받은 데이터(e.g., DTO)가 우리가 기대하는 형식과 규칙에 맞는지 검증하는 것은, 애플리케이션의 안정성과 데이터 무결성을 위해 필수적인 과정입니다. NestJS는 파이프(Pipe)라는 메커니즘을 통해 이를 효율적으로 처리합니다.개념: @Inject
클라이언트가 NestJS 서버로 HTTP 요청을 보내면, 이 요청은 컨트롤러의 라우트 핸들러에 도달하기 전과 후에 여러 단계를 거치게 됩니다.NestJS는 이 과정을 세밀하게 제어할 수 있도록 5가지 주요 구성 요소를 제공합니다.실행 순서:Middleware (미들웨어
GraphQL은 API를 위한 쿼리 언어(Query Language)이자, 해당 쿼리를 실행하기 위한 서버 측 런타임입니다. 페이스북(현 메타)에서 개발했습니다.REST API의 문제점:Over-fetching: 특정 엔드포인트가 항상 정해진 구조의 모든 데이터를 반환
GraphQL은 페이스북(현 메타)에서 개발한, API를 위한 쿼리 언어(Query Language)이자 해당 쿼리를 실행하기 위한 런타임입니다. REST API의 몇 가지 문제점을 해결하기 위해 등장했습니다.REST API의 문제점:Over-fetching: 특정 엔
인증이란 사용자가 "누구인지"를 확인하는 과정입니다. 웹 애플리케이션에서는 일반적으로 아이디/비밀번호를 통해 인증을 수행합니다.핵심 과제: 사용자의 비밀번호를 어떻게 안전하게 저장하고, 로그인 상태를 어떻게 유지할 것인가?비밀번호 암호화:사용자의 비밀번호를 절대 평문으
이 두 가지 개념을 명확히 구분하는 것이 보안의 첫걸음입니다.어제까지 구현한 JWT 시스템은 인증에 해당합니다. 오늘은 인증된 사용자가 어떤 역할(Role)을 가졌는지에 따라 특정 기능의 실행을 허용하거나 막는 인가를 구현합니다.사용자에게 역할을 부여하고, 특정 기능(
E2E 테스트는 개별적인 코드 단위(단위 테스트)나 모듈 간의 연동(통합 테스트)을 넘어, 실제 사용자의 시나리오와 동일한 조건에서 애플리케이션의 전체 흐름을 처음부터 끝까지 테스트하는 방법입니다.NestJS에서의 E2E 테스트:실제 HTTP 요청을 보내고, 미들웨어,
지난 시간 동안 학습한 NestJS의 모든 구성 요소는 계층형 아키텍처(Layered Architecture)와 의존성 주입(DI)이라는 두 가지 핵심 원리를 기반으로 유기적으로 동작합니다.요청 처리 흐름 (복습):Request → Middleware → Guard →
이전에는 단일 엔티티만 다루었지만, 실제 애플리케이션에서는 여러 엔티티가 서로 관계를 맺습니다. TypeORM은 데코레이터를 사용하여 이러한 관계를 객체 지향적으로 쉽게 정의할 수 있게 해줍니다.하나의 User가 하나의 Profile을 가지는 경우.@OneToOne 데
이전에 구현한 JWT 인증 방식은 Access Token만 사용했습니다. 이 방식은 몇 가지 한계점을 가집니다.Access Token의 딜레마:만료 시간을 길게 설정하면?: 한 번 토큰이 탈취되면, 만료될 때까지 공격자가 계속해서 악용할 수 있어 보안에 취약합니다.만료
NestJS에서 클라이언트가 업로드하는 파일(이미지, 문서 등)을 처리하는 방법은 크게 두 가지로 나뉩니다: 로컬 서버에 저장하는 방식과, 클라우드 스토리지(AWS S3 등)에 저장하는 방식.NestJS는 Express.js에서 널리 사용되는 Multer 미들웨어를 파
로깅은 애플리케이션이 실행되는 동안 발생하는 이벤트나 상태를 기록하는 것입니다. 단순한 console.log를 넘어, 체계적인 로깅은 디버깅, 성능 모니터링, 오류 추적에 필수적인 요소입니다.NestJS의 내장 로거 (Logger):NestJS는 @nestjs/comm
캐싱은 자주 사용되지만 잘 변하지 않는 데이터나, 계산 비용이 비싼 작업의 결과를 메모리와 같은 빠른 저장소에 임시로 저장해두고, 다음 요청 시에는 실제 작업을 다시 수행하는 대신 저장된 결과를 즉시 반환하는 기술입니다.핵심 목표: 데이터베이스나 외부 API에 대한 반
Swagger는 OpenAPI Specification(OAS) 표준을 기반으로, REST API의 명세를 자동으로 생성하고, 시각적인 UI로 문서화하며, 해당 UI에서 직접 API를 테스트해볼 수 있는 강력한 도구입니다.문제점: API를 개발한 후, API 명세서를
지금까지 학습한 Java, 객체 지향, 데이터베이스, Spring의 핵심 원리(IoC/DI, AOP) 등의 이론을 바탕으로, 이제 실제 동작하는 웹 애플리케이션을 만들어보는 첫 단계입니다.Spring Boot는 복잡한 초기 설정을 자동화하여, 개발자가 빠르게 비즈니스
Spring Boot 애플리케이션이 데이터베이스와 통신하기 위해서는 몇 가지 핵심 라이브러리(의존성)가 필요합니다. 이들은 build.gradle 파일에 추가합니다.Spring Data JPA (spring-boot-starter-data-jpa):JPA(Java Pe
Spring 애플리케이션은 일반적으로 계층형 아키텍처를 따릅니다. 이는 각 부분이 특정 책임만 갖도록 코드를 구성하여, 시스템의 유지보수성과 확장성을 높이는 설계 방식입니다.주요 계층:Controller (Presentation Layer):책임: HTTP 요청을 받고
클라이언트로부터 받은 데이터(DTO)가 비즈니스 규칙에 맞는지(e.g., null이 아닌지, 이메일 형식인지) 검증하는 것은 시스템의 안정성과 데이터 무결성을 위해 필수적입니다. Spring Boot는 Bean Validation 표준을 통해 이를 선언적으로 처리할 수
Spring Security는 Spring 기반 애플리케이션의 인증(Authentication)과 인가(Authorization)를 담당하는 강력한 프레임워크입니다. 서블릿 필터(Filter) 체인을 기반으로 동작하여, 요청이 컨트롤러에 도달하기 전에 다양한 보안 검사
Swagger는 OpenAPI Specification(OAS) 표준을 기반으로, REST API의 명세를 자동으로 생성하고, 시각적인 UI로 문서화하며, 해당 UI에서 직접 API를 테스트해볼 수 있는 강력한 도구입니다.문제점: API를 개발한 후, API 명세서를
CI/CD는 "지속적인 통합(Continuous Integration)"과 "지속적인 배포(Continuous Deployment/Delivery)"를 의미하며, 애플리케이션 개발부터 배포까지의 전체 과정을 자동화하여, 빠르고 안정적으로 서비스를 제공하는 것을 목표로
리버스 프록시는 클라이언트의 요청을 대신 받아서 내부망에 있는 실제 서버(WAS)로 전달하고, 그 응답을 다시 클라이언트에게 전달하는 중개 서버입니다.클라이언트는 자신이 실제 WAS가 아닌 리버스 프록시 서버와 통신하고 있음을 알지 못합니다.왜 필요한가?:보안: 실제
테스트 코드는 내가 작성한 코드가 의도한 대로 정확하게 동작하는지를 검증하는 코드로, 소프트웨어의 안정성을 보장하고, 리팩토링 시 자신감을 주며, 코드 자체를 설명하는 살아있는 문서의 역할을 합니다.테스트 피라미드: 안정적이고 효율적인 테스트 전략을 수립하기 위한 모델
이전까지의 데이터베이스 테스트 방식들은 각각 명확한 한계점을 가지고 있었습니다.@DataJpaTest (인메모리 DB, e.g., H2):장점: 빠르고, 설정이 간편하며, 테스트 간 격리를 보장합니다.한계점:SQL 방언(Dialect)의 차이: H2의 SQL 문법과 실
오늘의 학습은 개발이 완료된 Spring Boot 애플리케이션을 AWS 클라우드 환경에 배포하여, 실제 운영 환경과 같이 안정적이고 확장 가능하며, 안전하게 서비스하는 전체 아키텍처를 종합적으로 이해하는 것입니다.핵심 원칙:분리 (Decoupling): 애플리케이션 서
전통적인 웹 개발(Vanilla JavaScript, jQuery)에서는 데이터가 변경될 때마다, 개발자가 직접 어떤 DOM 요소를 찾아 어떻게 변경할지를 코드로 작성해야 했습니다. 이는 UI가 복잡해질수록 코드를 관리하기 매우 어렵게 만듭니다.React는 이러한 문제
Props가 부모로부터 받은 "외부 데이터"라면, State(상태)는 컴포넌트가 내부적으로 소유하고 관리하는 "내부 데이터"입니다. 사용자의 인터랙션 등으로 인해 변경될 수 있는 모든 값은 State로 관리해야 합니다.React의 핵심 원리: State가 변경되면, R
React의 기본 데이터 흐름은 하향식(Top-Down)입니다 (부모 → 자식, via Props). 하지만 자식 컴포넌트에서 발생한 데이터를 부모 컴포넌트로 전달해야 할 때가 많습니다. (e.g., 자식의 폼에서 입력한 데이터를 부모의 목록 상태에 추가)핵심 원리:
React에서 컴포넌트에 스타일을 적용하는 방법은 여러 가지가 있으며, 각 방식의 장단점을 이해하고 상황에 맞게 사용하는 것이 중요합니다.동적 클래스 적용: 상태에 따라 클래스 이름을 조건부로 부여하는 것은 매우 일반적인 패턴입니다.Side Effect (부수 효과)란
useState, useEffect 외에도, 특정 상황에서 유용하게 사용되는 여러 내장 Hook들이 있습니다.useRef는 두 가지 주요 목적을 위해 사용되는 Hook입니다.DOM 요소에 대한 직접적인 접근: ref 속성을 통해 특정 JSX 엘리먼트를 직접 참조할 수
IoC(제어의 역전)는 Spring 프레임워크의 가장 근본적인 설계 철학입니다.전통적인 방식: 개발자가 직접 객체를 생성(new MyService())하고, 의존성을 연결하며 프로그램의 흐름을 제어합니다. (제어권이 개발자에게 있음)IoC 방식: 객체의 생성, 생명주기
Spring MVC는 Spring 프레임워크에서 제공하는 웹(Web) 애플리케이션 개발 모듈입니다. 웹 개발의 표준적인 디자인 패턴인 MVC(Model-View-Controller) 패턴을 기반으로, 웹 계층의 역할을 명확하게 분리하여 유연하고 확장성 있는 웹 애플리케
AWS Solutions Architect 시험은 단순히 개별 서비스의 기능을 묻는 것을 넘어, 아래의 5가지 원칙에 기반하여 "어떻게 아키텍처를 잘 설계할 것인가"를 묻습니다. 모든 문제의 기저에는 이 철학이 깔려있습니다.운영 우수성 (Operational Excel
AWS는 다양한 스토리지 서비스를 제공하며, 각 서비스의 특징과 용도를 명확히 구분하여 시나리오에 맞는 최적의 솔루션을 선택하는 능력이 중요합니다.개념: EC2 인스턴스에 연결하여 사용하는 블록 수준의 영구 스토리지 볼륨.핵심 특징:영속성 (Persistence): E
ELB는 들어오는 애플리케이션 트래픽을 등록된 여러 대상(e.g., EC2 인스턴스)에 자동으로 분산시켜주는 "트래픽 분산기"입니다.부하 분산 (Load Balancing): 여러 인스턴스에 트래픽을 고르게 분산하여 단일 서버의 과부하를 방지합니다.고가용성 (High
서버리스는 개발자가 서버를 직접 프로비저닝하거나 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 컴퓨팅 실행 모델입니다. 서버 관리에 대한 모든 책임을 AWS에게 위임하고, 개발자는 오직 비즈니스 로직(코드) 작성에만 집중할 수 있습니다.Lam
DynamoDB는 어떤 규모에서든 빠르고 예측 가능한 성능을 제공하는 완전 관리형 키-값(Key-Value) 및 문서(Document) 데이터베이스입니다.RDS(관계형) vs DynamoDB(NoSQL):RDS: 정해진 스키마(테이블 구조)가 필요하며, 복잡한 JOIN
IAM은 AWS 리소스에 대한 접근을 안전하게 제어하는 서비스로, "누가(Who) 무엇을(What) 할 수 있는지"를 정의합니다.Organizations는 여러 AWS 계정을 중앙에서 통합 관리하고 제어할 수 있는 서비스입니다.핵심 특징:통합 결제 (Consolidat
IaC는 서버, 데이터베이스, 네트워크 등 모든 인프라를 코드를 통해 정의하고 관리하는 방식입니다. 수동 작업을 자동화하고, 일관성을 유지하며, 변경 이력을 추적할 수 있게 해줍니다.CloudFormation은 AWS 리소스를 모델링하고 설정하는 데 사용할 수 있는 A
개념: 전 세계에 분산된 엣지 로케이션(Edge Location)이라는 캐시 서버에 콘텐츠(이미지, 동영상, 정적 파일 등)를 미리 복사해두고, 사용자와 가장 가까운 위치에서 콘텐츠를 전송하는 CDN(Content Delivery Network) 서비스입니다.핵심 역할
목표: 장애에 견디고, 자동으로 복구되며, 변화에 유연하게 대응하는 아키텍처를 설계하는 능력. 고가용성(High Availability)과 느슨한 결합(Decoupling)이 핵심 키워드입니다.목표: 워크로드의 요구사항에 맞춰 최적의 성능을 내면서도, 효율적으로 리소스
특징: 단순히 서비스의 기능을 암기하는 것을 넘어, 주어진 비즈니스 요구사항(시나리오)에 맞춰 여러 서비스를 조합하여 최적의 아키텍처를 설계하는 능력을 평가합니다. 정답은 하나일 수 있지만, "가장" 효율적인(비용, 성능, 보안 등) 솔루션을 찾는 것이 중요합니다.접근
HTML은 웹 페이지의 구조와 콘텐츠를 정의하는 마크업 언어입니다. 프로그래밍 언어처럼 로직을 가지는 것이 아니라, 텍스트, 이미지, 링크 등의 콘텐츠가 어떤 의미를 가지는지(제목, 단락, 목록 등)를 태그(Tag)를 통해 표시(Mark up)합니다.모든 HTML 문서