인터넷, 웹 인터넷: 통신 기반망 웹(WWW): 인터넷 위에서 동작하는 서비스 URI, URL URI: 인터넷 자원 식별자 전체 URL: URI에 포함되는 개념, 자원의 위치 및 접근 방법을 나타냄 사전적인 의미일 뿐, 실질적으로 두 용어를 엄격히 구분하여
Java는 JVM 위에서 돌아가므로 하나의 코드로 어디서든 실행할 수 있다. (Write Once, Run Anywhere!)public static void main(String\[] args): Java 프로그램의 시작점이다.System.out.println():

기본 개념 Git은 버전관리(형상관리)를 위한 분산형 버전 관리 시스템이다. GitHub은 Git을 기반으로 한 원격 저장소 플랫폼 중 하나이다. git config는 특정 버전을
클래스는 설계도, 객체는 설계도를 따라 만든 완성품이다.new 키워드를 통해 런타임에 객체를 생성할 수 있다.예시생성자는 클래스를 만드는 방법을 정의한다.예시Java의 메서드는 클래스 내부에만 존재한다.디폴트 파라미터는 지원하지 않는다.예시
대상이 어디까지 접근할 수 있는지를 정하는 키워드이다.OOP의 핵심 개념 중 하나접근 제어자를 통해 외부에서 객체 내부를 함부로 변경하지 못하게 보호할 수 있다이 Student 클래스는 모든 필드가 private이므로, 한 번 생성된 객체에 대해 외부에서 필드 값을 수
기본 타입(Primitive Type): 값 자체참조 타입(Reference Type): 값을 가리키는 참조값== 연산에 대해, 기본 타입은 값이 같은지 확인하고, 참조 타입은 같은 객체인지를 확인한다.예시Java에는 포인터가 없으며, 주소를 직접 조작하지 못한다.자주
extend 키워드를 통해 클래스를 상속할 수 있다.부모 클래스를 Super class, 자식 클래스를 Sub class라고 부른다.부모에 접근할 때는 super 키워드를 사용한다. 예를 들어 부모 생성자는 super()로 호출한다.final 키워드를 통해 동일한 이름
인터페이스 인터페이스는 명세를 정의하고, 구현체는 명세를 구현한다. 사용자의 입장에선 세부 구현을 몰라도, 인터페이스만 알면 사용할 수 있다. 인터페이스 구현은 implements 키워드를 사용한다. 추상 클래스 추상 클래스는 자식 클래스가 반드시 구현해야 할 메
값의 목록을 정의할 수 있다. 상태를 관리할 때 유용하다.String으로 상태를 관리하면 오타나 Case-sensetive 문제가 발생할 수 있다.enum은 문자열로 의미를 이해할 수 있으면서, 목록에 있는 값만을 허용할 수 있다.java의 enum은 클래스이다. 각
예외 상황에 프로그램이 종료되지 않도록 에러를 '받아줄' 코드를 작성할 수 있다.try 구문이 없다면 Integer.parseInt(input)에서 정수가 아닌 값을 입력할 경우 런타임 에러가 발생하며 프로그램이 종료되지만, try로 감쌌으므로 catch 안의 로직이
Lambda (익명 함수) 람다 함수는 한 번 쓰고 말 함수를 편리하게 사용할 수 있도록 해준다. 다음과 같은 함수를 생각해보자. 이름과 타입을 빼고, 매개변수와 결과만 남겨 다음과 같이 사용할 수 있다. Stream Stream을 사용하면 배열이나 컬렉션 등의
Spring: Java 기반 웹 애플리케이션 프레임워크Spring Boot: 복잡한 설정 없이 빠르게 애플리케이션을 만들 수 있게 해주는 도구kebab-case: 문자 사이를 -(대시)로 연결, 소문자PascalCase: 첫 시작 대문자, 문자와 문자 사이를 대문자로
HTTP의 특징: Stateless 서버는 클라이언트의 상태를 보존하지 않고, 모든 요청을 독립적으로 처리한다. 장점: 수평 확장성이 높다. 서버는 사용자를 추적하지 않고 요청 내용만 보고 응답한다. 클라이언트는 어느 서버에 요청을 하든 똑같은 결과를 얻을

프로그램 간 어떤 요청, 응답을 주고받을 수 있는지 정의하는 명세각 프로그램은 상대의 내부 구현을 알 필요 없이, 인터페이스를 통해 통신할 수 있다API를 구현하는 데 있어 '권장'되는 규칙 (필수나 표준이 아님)클라이언트가 서버의 구현을 모르는 상황에서, 소통의 리소
Java 코드에서 추가할 수 있는 메타데이터컴파일러나 런타임에 필요한 추가 정보를 전달@Override가 대표적인 어노테이션이다.어노테이션을 붙이지 않아도 오버라이딩은 가능하다.어노테이션을 붙이면, 존재하지 않는 메서드를 오버라이딩 하는 등 잘못된 사용을 사전에 검사하

Spring Boot 프로젝트의 기본 구조 및 의존성을 쉽게 생성해주는 도구IntelliJ Ultimate 사용 시 프로그램 내장 기능IntelliJ Community 사용 시 위 주소를 통해 웹 기반으로 생성 가능빌드 자동화 도구Maven(이전 세대, xml 기반)에
Servlet(서블릿) 클라이언트 요청에 따라 동적 웹페이지나 데이터를 반환하는 자바 프로그램 클라이언트의 요청(HTTP Request) 해석 조회, 계산 등 비즈니스 로직 수행 결과 생성 후 클라이언트에게 응답 jakarta.servlet.http.Htt
MVC 패턴 SoC(Separation of Concerns, 관심사의 분리) 원칙에 따른 역할 분담 > Model: 데이터와 비즈니스 로직 View: 사용자에게 보여지는 화면(UI) Controller: 요청을 받아 Model과 View를 연결 Controller URL 매핑: 어떤 요청이 들어왔을 때 어떤 메서드를 실행할지 결정 로직 호출, 데...

모든 요청이 단 하나의 진입점을 가짐모든 요청에 적용될 공통 로직의 중앙화공통 로직: 인증, 로깅, 인코딩 등중앙화된 컨트롤러가 있으니 새로운 기능 추가 시에도 자동 적용요청에 따라 적절한 세부 컨트롤러로 위임 (공통 로직을 제외한 추가적인 처리)일관된 처리 흐름, 유

전통적인 MVC 컨트롤러컨트롤러의 메서드는 View 이름을 반환할 것으로 기대됨반환한 문제열은 ViewResolver를 통해 View 객체를 조회하는 데 사용(이 글의 DispatcherServlet 파트 참고)@Controller + @ResponseBody@Resp

애플리케이션과 실행 환경(라이브러리, 설정 등)을 함께 패키징하는 컨테이너 기술어디서든 동일하게 실행될 수 있도록 해줌: 일관성, 이식성, 확장성이미지: 애플리케이션과 그 환경을 정의한 파일, 변경 불가능, Dockerfile에 정의됨컨테이너: 이미지의 인스턴스(이미지
DB의 종류 1. 관계형 DB (RDBMS) 테이블 형태로 데이터를 저장 테이블 간의 관계를 이용해 데이터 연결 가장 많이 쓰이는 데이터베이스 안정성 중심 개념적으로 DB는 데이터의 집합, DBMS는 그걸 관리하는 시스템을 의미하지만, 실무적으로

자바에서 직접 SQL을 실행해 DB와 통신하는 저수준 APISQL 중심ORM객체 중심내부적으로 JDBC 사용Spring Data JPA: JPA를 편하게 사용할 수 있게 해주는 라이브러리Hibernate: JPA 인터페이스의 구현체, 다양한 DB와 통신할 수 있음 (D

DB의 테이블과 1:1로 대응되는 자바 클래스ORM의 핵심행을 객체로 매핑클래스가 JPA 엔티티임을 선언기본적으로 클래스와 동일한 이름의 테이블과 매핑엔티티와 매핑할 테이블 정보 지정보통 클래스명의 복수형으로 테이블 이름을 지정user, like 등은 DB에서 예약어로

분리 설계의 목적은 다음과 같다. 꼭 3-Layer Architecture만의 이야기는 아니고, 디자인패턴의 일반적인 목적과 일맥상통하는 면이 있다.관심사의 분리유지 보수성 향상재사용성 증대확장성 개선3-Tier Architecture라고도 부른다.각 계층의 명칭도 아
JPA에서 엔티티 객체를 영구 저장, 관리하는 환경앱과 DB 사이에 존재하는 논리적인 가상 데이터베이스1차 캐시 역할트랜잭션 내에서 DB를 한 번이라도 다녀온 엔티티를 관리엔티티를 임시 보관변경사항 추적 (Dirty Checking)DB와 동기화비영속영속성 컨텍스트와

트랜잭션: 논리적으로 하나의 작업 단위(원자성)예: A가 B에게 10000원을 송금하는 작업이라면A의 계좌에서 10000원 차감B의 계좌에 10000원 추가장부에 송금 내역 기록비즈니스 로직이므로 Service 계층에서 처리@Transactional을 붙여주면 해당 메

엔티티의 생성 및 수정 시 생성일, 수정일, 생성자, 수정자를 자동으로 DB에 기록해주는 기능1\. @EnableJpaAuditing으로 Auditing 활성화2\. 엔티티에 리스너 연결 @EntityListeners(AuditingEntityListener.class

제어의 역전프로그램의 제어 흐름을 개발자가 아닌 외부 프레임워크나 컨테이너가 대신 관리의존성 감소 (코드의 결합도 감소)재사용성 좋아짐유지보수 용이코드양 감소의존성이란?클래스 A가 클래스 B를 사용하고 있다면, A는 B에 의존적이다.의존성 주입IoC를 구현하기 위한 구

기존 실습에서, 잘못된 요청(존재하지 않는 유저에 대한 GET 요청)을 보내면 다음과 같은 응답이 온다.참고로, 브라우저에서 동일한 요청을 보내면 다음과 같은 화면이 나타난다.500은 서버의 잘못으로 응답에 실패했음을 의미한다. 잘못된 요청은 클라이언트의 잘못이므로 적

Key 값이 Cookie 혹은 Set-Cookie인 헤더이다.Value 값은 그 안에 key=value 형태로 존재하며, ;를 구분자로 사용한다.쿠키는 사용자를 식별하는 정보이기에, 보안 설정이 적용되어야 한다.Set-Cookie의 보안 설정1\. Secure쿠키가 H

컨트롤러의 메서드 파라미터로 들어오는 데이터를 자동으로 가공하고 바인딩해주는 도구@RequestParam, @RequestBody, @RequestHeader, @PathVariable 등 어노테이션이 내부적으로 ArgumentResolver를 통해 동작한다.다음의 절

개념적으론 엔티티를 영속적으로 저장하는 환경JPA에선 엔티티의 생명주기 관리, 앱과 DB 사이의 여러 최적화 작업을 해주는 논리적 공간Map 형태의 캐시 저장소먼저 1차 캐시를 확인동일한 ID의 엔티티 객체가 있으면 DB 조회 없이 즉시 반환동일성(Identity) 보
JPA 연관관계 매핑 @OneToOne 1:1 대응 관계 회원 멤버와 프로필 사진 어느 쪽이 주도 테이블이 될지 정해야 함 (둘 중 어느 쪽에 FK를 둘까?) 멤버-프로필 사진이라면, 멤버 쪽 테이블에 프로필 사진을 FK로 두는 것이 자연스럽다 @JoinCo
부모 엔티티의 영속성 상태 변화를 자식 엔티티에게 그대로 전파하는 기능@OneToMany(cascade=CascadeType.XXX)와 같이 사용기본값은 '사용 안함' (아무 전이도 없음)CascadeType.ALL: 모든 옵션을 적용 (PERSIST+REMOVE+ME
JPQL (Java Persistence Query Language) > 자바 엔티티 객체와 그 필드를 기준으로 작성하는 쿼리 SQL 예: SELECT * FROM members WHERE team_id = 1 JPQL 예: SELECT m.username FROM
컨테이너가 빈을 만들고, 의존성을 넣고, 초기화하고, 종료 시 정리하는 정해진 순서생성주입초기화(@PostConstruct 실행)사용소멸(직전 @PreDestroy 실행)생성자 주입 방식에선 생성과 주입이 동시에 일어난다. 이전에 컨트롤러와 서비스 구현 시 자주 사용한

AOP: 여러 곳에 반복되는 공통 기능을 핵심 비즈니스 로직과 분리해 적용하는 프로그래밍 방식Aspect: AOP에서 공통 기능과 기능이 적용될 대상, 시점을 묶은 모듈AOP는 개념, Aspect는 그 개념의 구현체JoinPoint: 부가 기능을 끼워넣을 수 있는 실행

설정 파일이나 환경 변수에서 읽은 값을 자바 객체에 맞춰 연결하는 것예: application.properties설정값 하나를 생성자에게 전달{설정키:기본값} 형식을 통해 해당 키가 없을 때 기본값을 적용할 수 있음기본값은 설정이 없어도 안전하게 동작하는 경우에만 사용

HTTP 요청이 DispatcherServlet 전과 후 실행되는 기능요청 전에만 실행되지 않고, 후에도 실행될 수 있다같은 요청에서 필터가 중복 실행되지 않게 관리하는 클래스OncePerRequestFilter를 상속받아 필터를 구현할 수 있다.원래 필터를 구현하는
정해진 간격이나 시각에 자동으로 로직을 실행아래와 같은 설정 클래스를 만들어 스케줄링을 활성화할 수 있다.필요할 때 그때그때 찾아서 쓰기5초마다 실행되는 로직특정 시각에 실행되는 로직6개 자리를 공백으로 구분, 실행 시점 지정\*: 모든 값 (매 초, 매 분, 매 시
HTTP 요청을 보내는 Spring 도구서버가 클라이언트의 입장에서 다른 서버로 요청을 보낼 때 사용다음 의존성이 필요하다.타임아웃 설정재시도(실패시 재호출)@EnableResilientMethods 필요메서드에 @Retryable을 붙여 재시도 설정

인증: 누구인지 확인하는 절차인가: 특정 행위를 할 수 있는지 확인하는 절차인증을 먼저 하고, 그 다음에 인가 (누구인지 알아야 권한이 있는지를 확인 가능)인증 실패 시 401 Unauthorized인가 실패 시 403 Forbidden사용자의 로그인 정보를 서버가 보

JWT(JSON Web Token) > 정보를 JSON으로 표현해 전달하는 토큰 형식. Access Token이라고도 한다. 서버가 클라이언트의 세션 정보를 저장할 필요 없이(Stateless) 인증을 수행할 수 있는 방법의 필요성에 의해 제안됨 Header: 토
입문 프로젝트 과제 도전 항목(https://velog.io/@gwangmin-kim/Spring-%EC%9E%85%EB%AC%B8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%B6%89%EC%9D%80-%EB%8B%AC%EC%9D
목록을 정해진 개수씩 나눠 조회하는 방식게시판이든, 이메일이든, 쇼핑 페이지든, 한 번에 특정 개수만큼만 불러오게 구현된다.대량의 데이터를 한 번에 전부 불러오는 것은 성능 부하도 크고, 실효성도 낮다. (게시판에 수 천 개의 게시글 목록이 한 번에 보여지더라도 사용자

Remote Dictionary Server메모리에 데이터 저장: 매우 빠른 RWKey-Value 기반: NoSQL인메모리디스크가 아닌 메모리(램)에 데이터 저장디스크보다 훨씬 빠른 읽고 쓰기모든 데이터를 담지 않고 자주 쓰는 데이터만(램은 디스크보다 작고 비싸다)Ke

HTTP 요청으로 연결을 시작, 이후 WebSocket 프로토콜(ws/wss)로 전환하여 연결을 유지하는 실시간 통신 방식서버와 클라이언트가 자유롭게 메시지를 주고받을 수 있는 양방향 통신채팅, 실시간 게임, 협업 기능 등에 사용됨WebSocket도 핸드셰이크를 통해

세션 레지스트리 > 연결된 클라이언트의 WebSocketSession을 보관 및 조회하는 클래스 앞서 배웠던 세션에서의 세션 저장소와 사실상 동일하다. 거대한 Map 예제 RoomSessionRegistry 브로드캐스트 > 하나의 메시지를 여러 연결에 보내는

Redis에서 사용하는 언어MySQL이 SQL을 실행하듯, Redis에서는 Lua Script를 실행한다.Redis에서는 @Transactional을 사용할 수 없다. (@Transactional은 RDB를 기준으로 작동)DB 단에서 실행되는 코드는 원자적이다.MySQ

회사가 직접 자체적인 서버를 운영하는 방식직접 서버 설치 및 관리, 네트워크 구축을 해야 함전기/냉방비 등 유지 비용 소모AWS, GCP, Azure 등의 업체에서 서버를 빌려 사용하는 방식수많은 서버가 이미 준비되어 있음원할 때 서버를 할당/반납할 수 있음초기 투자
보안 그룹 > AWS 리소스의 가상 방화벽 개별 리소스마다 리소스에 대한 네트워크 트래픽 제어 명단에 없으면 무조건 차단 (Whitelist) 누가 들어오고 나가는지 확인 가능(Stateful) 보통 들어올 때 규칙으로 걸러내고, 나갈 때는 검사하지 않는다 >

AWS의 클라우드 컴퓨팅 서비스쉽게 말해 마음대로 세팅 가능한 컴퓨터를 제공해주는 서비스이다.EC2 인스턴스는 개별 컴퓨터 1대가 아닌, 물리적 서버 1대를 여러 작은 가상 서버로 나눠 사용모든 AWS 서비스는 실제 물리적 하드웨어 1개가 아니라, 논리적으로 분리된 가