Poostman
개발자들이 HTTP 요청을 만들고, 서버로부터의 응답을 확인하며, API의 기능을 테스트하고 디버깅할 수 있게 해준다.
Postman은 RESTful API뿐만 아니라 GraphQL, SOAP 등 다양한 API 유형을 테스트할 수 있고 Postman 공유를 통한 팀 간의 협업도 가능하다.
Postman UI
Postman 설치하기
https://www.postman.com/downloads/
Download Postman | Get Started for Free
Try Postman for free! Join 35 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.
www.postman.com
설치 후 내 워크스페이스에 API 테스트 준비하기
Git Clone
Git Clone은 원격 저장소(repository)의 전체 내용을 로컬 컴퓨터로 복사하는 Git 명령어이다. 프로젝트의 코드를 내려받아 로컬 환경에서 작업할 수 있게 된다.
저장소의 전체 이력(history)과 파일을 모두 복사하며, 이후에는 로컬에서 변경한 내용을 원격 저장소에 Push할 수 있다.
1. Github Repository 이동(아래 모두 클론)
- MVC 패턴이 적용된 JSP
- https://github.com/UK-spring/spring-basic-jsp
- Controller Interface, View Resolver
- https://github.com/UK-spring/spring-basic-mvc-v1
- Spring Annotation
- https://github.com/UK-spring/spring-basic-mvc-v2
- CRUD 실습
- https://github.com/UK-spring/spring-basic-crud
- 메모장 프로젝트
- https://github.com/UK-spring/spring-basic-inmemory
- Layered Architecture
- https://github.com/UK-spring/spring-baisc-layered
- 데이터베이스 접근 기술 적용
- https://github.com/UK-spring/spring-basic-db
2. Git clone 명령어 복사하기

3. Local 환경에 프로젝트를 보관할 디렉토리 생성
원하는 위치(바탕화면 등)에 workspace 폴더 생성
4. workspace 폴더 이동 후 Git clone 명령어 실행
git clone 명령어
git clone (여기 붙여넣기 앞에 공백하나 있습니다!)

프레임워크(Framework)
소프트웨어 개발을 간편하게 만들기 위한 소프트웨어 개발 환경이다. 프레임워크는 frame(틀) work(일하다)의 합성어로 일하기 위한 틀을 제공한다. 개발자는 해당 틀에서 일을 해야 한다.
ex) 붕어빵을 만들기 위해서 붕어빵 틀을 사용해야 한다.
장점
- 개발 프로젝트에 일관된 구조를 제공하여 코드의 일관성과 가독성을 높여주며 팀 협업이 편해진다.
- 기본적으로 필요한 기능과 도구를 제공하여 개발자들이 핵심 비즈니스 로직에 집중할 수 있다.
- 보안 관련 기능을 기본적으로 제공하여, 보안 취약점을 방지하는 데 도움을 준다.
- 통합된 테스트 환경과 도구를 제공하여 테스트를 쉽게 작성하고 실행할 수 있다.
- 인기 있는 프레임워크는 방대한 커뮤니티 지원을 받으며, 다양한 문서를 활용할 수 있다.
단점
- 프레임워크는 굉장히 복잡한 구조를 가지기 때문에, 처음 익히는 데 시간이 많이 소요된다.
- 프레임워크의 새로운 버전이 기존 코드와 호환되지 않을 수 있다.
- 정해진 규칙과 구조를 따르게 강제하여 자유롭게 변경하기 어려울 수 있다.
라이브러리(Library)
애플리케이션 개발에 필요한 클래스, 함수 등을 모아 놓은 코드의 모음을 의미한다. 마치 도서관에 있는 책처럼 개발자가 소프트웨어를 만들 때 필요에 따라 원하는 기능을 구현하기 위해 가져다 쓸 수 있는 일종의 도구 역할을 수행한다.
ex) 자동차의 바퀴는 다양한 브랜드가 존재하고, 필요한 타이어를 사용할 수 있다.
장점
- 개발자가 복잡한 코드를 직접 작성하지 않아서 개발 생산성이 높아진다.
- 검증된 라이브러리는 테스트와 커뮤니티 지원을 통해 안정성과 품질이 보장된다.
단점
- 라이브러리가 업데이트 되거나 지원이 중단될 경우 문제가 발생할 수 있다.
- 버전 호환성 문제로 인해 다른 라이브러리나 기존 코드와 충돌이 발생할 수 있습니다.
- 생각보다 빈번하게 발생하는 문제
- 불필요한 기능을 포함한 라이브러리를 사용하면 비효율적이다.
- 라이브러리의 내부 구현을 직접 수정하기 어려워, 특정 요구 사항에 맞게 조정하기 힘들 수 있다.
정리
- 프레임워크
- 애플리케이션을 개발할 때 전체적인 구조(frame)를 잡기 위해 사용하는 것
- 기본적으로 프레임워크 내에서 사용하는 라이브러리들이 존재한다.
- 라이브러리
- 개발을 진행하는 과정에서 필요한 기능을 구현하기 위해 사용하는 것
Annotation
코드에 메타데이터를 추가할 수 있는 기능을 제공하며 주로 코드에 특별한 의미를 부여하거나, 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용된다.
* 컴파일 : 자바언어를 컴퓨터가 읽을 수 있도록 변환하는 과정
* 런타임 : 컴파일로 변환된 코드가 실행되는 시점
🥝 주석은 사람에게 정보를 제공하는 것이라면, 어노테이션은 특정 코드를 사용하는 프로그램에게 정보를 전달하는 것이다.
어노테이션 정의
어노테이션은 @ 기호로 시작하며, 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가할 수 있다.
내장 어노테이션
- @Override
- 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다.
- 이때 컴파일러는 메서드가 실제로 오버라이드하고 있는지 확인한다.
- 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타낸다.
- @Deprecated
- 해당 요소가 더 이상 사용되지 않음을 나타낸다.
- 해당 어노테이션이 붙은 코드를 사용하면 컴파일 경고가 발생한다.
- @SuppressWarnings
- 컴파일러 경고를 억제한다.
- 사용되지 않는 변수에 대한 경고를 무시할 수 있다.
- 컴파일러 경고를 억제한다.
사용자 정의 어노테이션
- 개발자가 필요에 따라 직접 어노테이션을 정의할 수 있다.
- 사용자 정의 어노테이션은 특정 메타데이터를 추가하거나,
- AOP(Aspect-Oriented Programming) 같은 기술과 결합하여 다양한 기능을 구현할 수 있다.
- AOP는 심화 주차에 배울 내용
각 어노테이션의 역할 : 추후 학습 예정
Lombok
보일러 플레이트 코드를 줄여주는 라이브러리로 자동으로 보일러 플레이트 코드를 생성하여 코드의 가독성과 유지보수성을 높여준다. Lombok은 어노테이션 기반으로 동작하며, 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동으로 생성한다.
🍉 보일러 플레이트 코드(Boilerplate code)란?
getter/setter 메서드, 생성자, toString 메서드 등과 같이 반복적으로 작성되는 코드를 뜻한다.
Lombok 설치하기
1. IntelliJ 실행하기 (프로젝트 생성 or 실행 모두 가능)
2. 환경 설정 (macOS: command + ,)
3. 검색창에 "Annotation Processors" 입력 후, 우측 "Enable annotation Processing" 체크하고 OK 클릭
4. Shift 두 번 누르고 plugins 입력 후 엔터
(위 Shift를 두 번 눌러도 실행되지 않는다면, 환경설정 창에서 plugins 클릭 후 lombok 검색(아래 이미지는 lombok이 설치 완료된 상태입니다))
5. Lombok이 installed가 되지 않은 상태라면 아래처럼 생긴 아이콘의 우측 Install 버튼 클릭 → Intellij 재시작

6. 다시 Shift 두 번 누르고 plugins 입력 후 Enter
7. Lombok을 검색했을 때 installed 상태라면 설치 완료
IntelliJ IDEA와 같은 IDE에서는 Lombok의 기능을 제대로 활용할 수 있도록 플러그인을 제공하고 있다. 이 플러그인을 설치하면, IDE에서 Lombok 어노테이션을 인식하고, 해당 어노테이션에 의해 생성되는 메서드나 필드들을 자동으로 처리해 준다.
주요 Lombok Annotation
@Getter, @Setter
- 클래스의 모든 필드에 대한 getter와 setter 메서드를 자동으로 생성한다.
@Getter
@Setter
public class User {
private String name;
private int age;
/** 아래 코드를 @Getter, @Setter 어노테이션이 생성해준다.
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
**/
}
@ToString
- 객체의 toString() 메서드를 자동으로 생성한다.
- 기본적으로 클래스의 모든 필드를 포함하며, 특정 필드를 제외하거나 포맷을 지정할 수도 있다.
@ToString
public class User {
private String name;
private int age;
}
- toString() 메서드는 객체를 String으로 변환해주는 역할을 수행한다.
@EqualsAndHashCode
- equals() 와 hashCode() 메서드를 자동으로 생성한다.
- 객체의 동일성과 해시 코드를 정의하는데 사용된다.
📌 equals()와 hashCode() 메서드란?
자바에서 equals()와 hashCode() 메서드는 객체의 동등성(Equality)과 해시(Hash)값을 비교하는 역할을 함.
1️⃣ equals() 메서드란? (객체의 비교)
• 두 객체가 같은지 비교할 때 사용해.
• 기본적으로 객체의 메모리 주소를 비교하지만, 직접 원하는 비교 로직을 만들 수도 있음.
✔ equals() 기본 예제
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person("Sunyoung");
Person p2 = new Person("Sunyoung");
System.out.println(p1.equals(p2)); // false (기본 equals()는 주소 비교)
}
}
🔹 equals() 메서드를 오버라이드(재정의)하지 않으면, p1과 p2는 다른 객체(다른 메모리 주소를 가짐) 이므로 false가 나옴.
2️⃣ hashCode() 메서드란? (객체의 해시값)
• 객체를 숫자로 변환하는 해시값을 반환함.
• HashMap, HashSet 같은 자료구조에서 객체를 찾을 때 사용됨.
• hashCode() 값이 같으면 같은 객체일 가능성이 높지만, 반드시 같다는 보장은 없음(충돌 가능).
✔ hashCode() 기본 예제
public class HashCodeExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1.hashCode()); // 같은 문자열이면 같은 해시값
System.out.println(str2.hashCode()); // 같은 해시값 출력됨
}
}
✔ 같은 문자열 "Hello" 는 같은 hashCode() 값을 반환함.
3️⃣ @EqualsAndHashCode 어노테이션이 하는 일
위에서 equals()와 hashCode()를 직접 작성했지만,
Lombok의 @EqualsAndHashCode를 사용하면 자동으로 만들어줌! 🎉
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
String name;
public Person(String name) {
this.name = name;
}
public static void main(String[] args) {
Person p1 = new Person("Sunyoung");
Person p2 = new Person("Sunyoung");
System.out.println(p1.equals(p2)); // true (자동 생성된 equals 사용)
System.out.println(p1.hashCode()); // 같은 해시코드
System.out.println(p2.hashCode()); // 같은 해시코드
}
}
✔ @EqualsAndHashCode를 사용하면 equals()와 hashCode()를 자동으로 생성해줌.
✔ Lombok 덕분에 코드를 짧고 깔끔하게 유지할 수 있음.
@EqualsAndHashCode
public class User {
private String name;
private int age;
}
@NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor
- 기본 생성자를 생성한다. @NoArgsConstructor
- 모든 필드를 매개변수로 하는 생성자를 생성한다. @AllArgsConstructor
- 필수(final) 필드만을 매개변수로 하는 생성자를 자동으로 생성한다. @RequiredArgsConstructor
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
@Data
- @Getter, @Setter, @ToString, @EqualsAndHashCode, RequiredArgsConstructor를 한꺼번에 적용하는 어노테이션이다.
- 주로 테스트 용도로 사용한다.
@Data
public class User {
private String name;
private int age;
}
@Builder
- 빌더 패턴을 적용해 객체를 생성할 수 있게 합니다. 복잡한 객체 생성에 유용하며, 필드 이름을 명시적으로 지정하면서 객체를 생성할 수 있다.
* 객체를 생성할 때 new 해서 생성하는게 아니라 User.builder() 형식으로 사용하는 방식
@Builder
public class User {
private String name;
private int age;
}
User user = User.builder()
.name("John")
.age(30)
.build();
@Slf4j
- 클래스에 로그를 남기기 위한 Logger 객체를 자동으로 생성한다.
@Slf4j
public class UserService {
public void logMessage() {
log.info("This is a log message");
}
}
Spring Framework
Java Application Framework로 엔터프라이즈 애플리케이션 개발에 주로 사용된다.
엔터프라이즈 애플리케이션은 대규모로 복잡한 비즈니스 프로세스와 데이터를 처리하는 애플리케이션을 뜻한다.
Spring Framework 등장 배경
- 대형 쇼핑몰 시스템(엔터프라이즈 애플리케이션)
- 수백만 명의 고객이 동시에 상품을 검색하고, 장바구니에 담고, 결제를 시도한다.
- 이러한 시스템은 많은 사용자의 요청을 한꺼번에 처리해야 한다.
- 서버의 성능, 신뢰성, 보안이 아주 중요하다.
- 하지만 이러한 요소들을 모두 고려하면서 비즈니스 로직을 개발하는 것은 쉽지 않다.
- 만약 누군가가 이러한 복잡한 부분을 해결해 주는 개발 환경을 제공해준다면, 개발자는 비즈니스 로직에만 집중할 수 있게 된다.
- 이때 등장한 것이 바로 Spring Framework 이다.
- Spring Framework는 서버 성능, 안정성, 보안 문제를 고도화된 수준으로 해결해준다.
- 개발자들은 복잡한 문제를 해결하는 대신, 비즈니스 로직 개발에 집중할 수 있게 되었다.
Spring Framework 특징
- 애플리케이션의 다양한 구성 요소를 유연하게 연결하고 관리할 수 있도록 해준다.
- Spring Framework는 누구나 사용할 수 있는 오픈소스 이다.
- 모듈화되어 있어 필요에 따라 특정 기능만 선택적으로 사용할 수 있다.
- Java언어의 가장 큰 특징인 객체 지향 언어의 특징을 살려낸 프레임워크이다.
- 캡슐화
- 상속
- 추상화
- 다형성
- Spring Framework로 만드는 Web Application
Spring Boot
Spring Framework를 기반으로 하여 간편하고 신속하게 애플리케이션을 개발할 수 있도록 도와주는 도구이다.
Spring Boot의 등장 배경
- 스프링 프레임워크는 초기 설정과 구성 파일이 복잡하고 방대했다.
- 스프링 애플리케이션을 개발하고 배포하기 위해서는 여러 가지 의존성 관리와 서버 설정이 필요하다.
- 최소한의 노력으로 스프링 애플리케이션을 쉽게 개발하고 배포할 수 있는 방법이 필요했다.
Spring Boot의 특징
- 자동 구성(Auto-configuration) 기능을 제공하여, 개발자가 복잡한 설정을 직접 처리할 필요 없이 기본 설정으로도 비즈니스 로직에 집중할 수 있게 해준다.
- 내장 WAS(Tomcat)를 제공하여, 애플리케이션을 별도의 서버 설정 없이 바로 실행할 수 있다.
- spring-boot-starter-web를 빌드 관리 도구에 추가하면 웹 애플리케이션에 필요한 모든 종속성과 설정이 자동으로 구성된다.
- 라이브러리들의 버전을 명시하지 않아도 호환 가능한 버전들을 찾아 자동으로 설정해준다.
- 주의! 버전 관련 문제를 100% 해결해 주는 것은 아니다.
- Spring Boot로 만드는 Web Application
Gradle
Java와 유사한 문법 구조를 가진 Groovy기반의 스크립트 언어를 사용하며 다양한 소프트웨어를 빌드(Build)할 수 있는 유연한 빌드 자동화 도구이다.
빌드(Build) 🐧
소스 코드를 컴퓨터가 실행 가능한 파일로 변환해주는 작업
빌드에 필요한 과정
빌드 자동화 도구
빌드, 라이브러리 관리, 테스트, 배포 등을 자동화 하여 수행한다.
Gradle 특징
1. 유연성
- 복잡한 빌드 시나리오를 처리할 수 있는 유연한 시스템을 제공한다.
- 빌드 스크립트를 통해 다양한 빌드 작업을 정의하고, 필요한 경우 커스터마이징할 수 있다.
2. 성능
- Build Cache
- 빌드 결과물을 캐싱하여 재사용한다.
- 라이브러리 의존성을 캐싱하여 재사용한다.
- 점진적 빌드
- 마지막 빌드 호출 이후 변경된 부분만 빌드한다.
- 변경되지 않은 부분은 캐시 결과를 검색해 재사용한다.
- 데몬 프로세스
- 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
- 초기 빌드 이후부터는 빌드 실행 시 초기화 작업을 거치지 않는다.
3. 멀티 프로젝트 빌드 지원
- 공통으로 사용하는 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용할 수 있도록 한다.
4. 설정 주입 방식
- 필요한 설정을 직접 프로젝트에 주입하는 방식이다.
- 공통되는 정보는 묶어서 한번에 주입이 가능하다.
- 프로젝트별로 설정을 다르게 주입할 수 있다.
build.gradle
Groovy 기반 언어의 빌드 스크립트로 스크립트를 작성하면 소스 코드를 빌드하고, 라이브러리들의 의존성을 관리할 수 있다.
build.gradle 전체 구조
1. 플러그인
- 특정 작업을 위해 모아 놓은 task들의 모음집
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.5'
id 'io.spring.dependency-management' version '1.1.3'
}
- java plugin
- 아래 task들이 추가되어 실행할 수 있게 된다.
2. 의존성 관리
- 프로젝트에서 사용하는 라이브러리나 패키지를 관리한다.
dependencies {
// JPA
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// SECURITY
implementation 'org.springframework.boot:spring-boot-starter-security'
// WEB
implementation 'org.springframework.boot:spring-boot-starter-web'
// LOMBOK
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// MySQL
runtimeOnly 'com.mysql:mysql-connector-j'
// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
// JWT
compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
// DEV_TOOL
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// TEST
testRuntimeOnly 'com.h2database:h2'
testCompileOnly 'org.projectlombok:lombok'
testCompileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
}
- 의존성 설정
- 라이브러리를 추가하는 시점을 설정할 수 있다.
- Implementation
- 컴파일, 런타임 시점 모두에서 사용한다.
- compileOnly
- 컴파일할 때만 사용되고 런타임 때에는 사용하지 않는다.
- runtimeOnly
- 런타임 때만 사용한다.
- testImplementation
- 테스트할 때만 사용한다.
3. repositories
- 라이브러리가 저장된 위치를 정의하고 저장소에서 라이브러리를 가져온다.
repositories {
mavenCentral() // 중앙 저장소
}
JAVA 웹 기술의 역사
Java 웹 기술은 서블릿과 JSP로 시작해 MVC 패턴을 거쳐 MVC 프레임워크의 도입으로 구조화되었으며, 이후 어노테이션 기반의 Spring MVC와 비동기 처리에 최적화된 Spring WebFlux로 발전해왔다.
- Servlet의 등장 (1997)
- 개요
- Java를 사용한 웹 개발의 시초로, 서버에서 동적으로 콘텐츠를 생성하기 위해 사용되었다. 클라이언트의 요청을 받고, 그에 대한 응답을 생성하는 기본적인 구조를 제공했다.
- 단점
- 코드의 복잡성이 증가하고 유지보수가 어려워졌다.
- 개요
- JSP (JavaServer Pages) 도입 (1999)
- 개요
- JSP는 HTML 내에 Java 코드를 삽입할 수 있는 기술로, 웹 페이지를 더 쉽게 동적으로 생성할 수 있도록 도와주었다.
- 단점
- JSP 내에 비즈니스 로직을 분리할 수 없다.
- 개요
- Servlet, JSP 기반의 MVC 패턴 도입
- 개요
- MVC 패턴이 도입되면서, UI, 비지니스 로직, 데이터를 분리하여 개발하는 방식이 등장했다.
- Servlet은 주로 컨트롤러(비지니스 로직)로 사용되었고, JSP는 뷰(UI)를 담당하게 되었다.
- 장점
- MVC 패턴은 웹 애플리케이션의 유지보수성과 확장성을 크게 향상시켰다.
- 단점
- 개발자가 중복적으로 설정해줘야 하는 부분들이 다수 발생했다.
- 개요
- MVC 프레임워크의 등장과 발전 (2000~2010)
- 개요
- Struts, Spring 등의 MVC 프레임워크가 등장하며, 웹 애플리케이션 개발이 더욱 구조화되고 효율적으로 변했다.
- 그중 Spring MVC는 단순하면서도 강력한 기능을 제공하여, Java 웹 개발의 표준으로 자리 잡게 되었다.
- 중복적으로 설정해야 하는 부분들을 프레임워크로 자동화 했다.
- 단점
- 여전히 애플리케이션 개발 관련 설정이 복잡했다.
- 개요
- Annotation 기반의 Spring MVC(2007~현재)
- 개요
- Annotation을 통해 애플리케이션 설정의 복잡함을 줄여주었다.
- 장점
- 더 직관적이고 간결한 방식으로 웹 애플리케이션을 개발할 수 있게 되었다.
- 개요
- Spring Boot의 등장(2014~현재)
- 개요
- Spring 프레임워크를 보다 쉽게 사용하도록 만든 도구로, 설정과 복잡한 초기 설정 작업을 자동화했다.
- 내장 Tomcat을 가지고 있다.
- 장점
- 개발자들이 빠르게 애플리케이션을 개발할 수 있도록 도와준다.
- 개요
- 최신 기술 동향
- Web Servlet
- Spring MVC
- 안정적이고 동기식 프로그래밍 모델을 기반으로 한 웹 애플리케이션 개발에 널리 사용된다.
- Spring MVC
- Web Reactive
- Spring WebFlux
- 비동기 및 넌블로킹 모델을 기반으로 한 웹 프레임워크로, 높은 동시성을 요구하는 애플리케이션에서 효율적인 성능을 제공한다. 함수형 프로그래밍 스타일을 지원하며, 서블릿 기술 대신 Netty 등의 비동기 서버를 사용한다.
- 서블릿 기술을 사용하지 않으며, 실시간 데이터를 처리하거나 높은 동시성을 요구하는 애플리케이션에 적합하다.
- RDBMS 지원 부족과 높은 기술적 난이도 등으로 인해, 아직은 MVC 모델이 많은 실무에서 더 많이 사용되고 있다.
- Spring WebFlux
- Web Servlet
'코딩 > sparta TIL' 카테고리의 다른 글
TIL 22 : Spring Annotation, Request Mapping (0) | 2025.03.19 |
---|---|
TIL 21 : MVC 패턴 (0) | 2025.03.19 |
TIL 19 : Web Application (1) | 2025.03.18 |
TIL 18 : HTTP 개념 (0) | 2025.03.18 |
TIL 17 : 인터넷 용어 기초 (0) | 2025.03.17 |