728x90
반응형

웹 개발에서 클라이언트와 서버 간 통신은 대부분 HTTP 메서드를 통해 이루어집니다.
특히 GET, POST, PUT, PATCH, DELETEREST API 설계의 핵심이라고도 할 수 있죠.

이 글에서는 각 메서드의 역할, 차이점, 사용 시 주의사항을 모두 정리해드립니다.


✅ GET

  • 목적: 데이터 조회
  • 특징:
    • URL 쿼리 파라미터 사용 (/users?name=kim)
    • 데이터 변경 없음
    • 캐시 가능, 브라우저 주소창에서 사용 가능
  • 사용 예시: 게시글 목록 조회, 유저 정보 조회 등

✅ POST

  • 목적: 데이터 생성 (Create)
  • 특징:
    • Body에 JSON, form 데이터 전송
    • 서버 상태를 변경함
    • 재요청 시 중복 생성 주의
  • 사용 예시: 회원가입, 글 작성, 댓글 등록

✅ PUT

  • 목적: 리소스 전체 수정 (Update All)
  • 특징:
    • 존재하지 않는 리소스는 새로 생성할 수도 있음
    • 전송 시 전체 필드 필요
  • 사용 예시: 게시글 전체 수정

✅ PATCH

  • 목적: 리소스 일부 수정 (Update Partial)
  • 특징:
    • 변경되는 필드만 Body에 포함
    • 서버 상태를 부분적으로 변경
  • 사용 예시: 유저 닉네임만 변경, 게시글 제목만 수정

✅ DELETE

  • 목적: 리소스 삭제
  • 특징:
    • 지정된 리소스를 제거
    • 요청 본문은 일반적으로 사용하지 않음
  • 사용 예시: 게시글 삭제, 회원 탈퇴

🧠 전체 요약 비교표

메서드목적요청 본문데이터 변경재요청 시 영향
GET 조회 없음 없음 영향 없음
POST 생성 있음 있음 중복 생성 주의
PUT 전체 수정 있음 있음 같은 결과 유지
PATCH 일부 수정 있음 있음 같은 결과 유지
DELETE 삭제 없음 있음 이미 삭제됨

 

728x90
반응형
728x90
반응형

웹사이트 주소 앞에 붙는 http://https://의 차이, 알고 계신가요?
둘 다 인터넷 통신 규약이지만, 보안 측면에서 큰 차이가 있습니다.


🔍 HTTP란?

  • HTTP는 HyperText Transfer Protocol의 약자입니다.
  • 인터넷에서 데이터를 주고받는 기본적인 프로토콜입니다.
  • 하지만 암호화되지 않기 때문에 보안에 취약합니다.
  • 예: http://example.com

🔒 HTTPS란?

  • HTTPS는 HTTP + SSL(Secure Socket Layer) 혹은 TLS(Transport Layer Security)입니다.
  • 모든 데이터를 암호화해서 주고받기 때문에 도청, 변조, 스니핑 방지에 탁월합니다.
  • 예: https://example.com

✅ HTTP vs HTTPS 차이점 정리

구분 HTTP HTTPS
보안 ❌ 암호화 없음 ✅ SSL/TLS로 암호화
주소창 표시 일반 텍스트 🔒 자물쇠 아이콘 표시
속도 약간 빠름 초기 연결 시 느림 (하지만 최신 기술로 거의 차이 없음)
SEO 영향 없음 ✅ 구글은 HTTPS를 랭킹 요소로 사용
데이터 보호 취약 ✅ 개인 정보 보호에 강함

🛡 HTTPS의 보안 원리 간단 설명

  1. 클라이언트가 서버에게 접속 요청
  2. 서버가 공개키 포함된 인증서 전송
  3. 클라이언트가 공개키로 세션키 암호화 후 전송
  4. 서버가 비공개키로 복호화해 세션키 획득
  5. 이후부터는 세션키 기반 대칭키 암호화 통신

즉, 누구도 중간에서 내용을 훔쳐볼 수 없도록 안전한 터널을 만드는 것이 HTTPS입니다.


📌 결론

  • HTTP는 보안이 없다.
  • HTTPS는 정보를 암호화하여 안전하게 만든다.
  • 웹사이트를 운영하거나 이용하는 사람 모두 HTTPS를 사용하는 것이 현대 웹의 기본 상식입니다.
728x90
반응형
728x90
반응형

JVM은 자바(Java)의 핵심이라 해도 과언이 아닙니다.
우리가 작성한 자바 코드가 어떻게 실행되는지,
플랫폼 독립성이 어떻게 보장되는지,
모든 답은 JVM에 있습니다.

이 글에서는 JVM이 무엇인지, 내부 구성 요소는 무엇이며,
왜 Java가 JVM 덕분에 강력한 언어인지 쉽게 정리해드립니다.

☕ JVM이란?

JVM (Java Virtual Machine) = 자바 가상 머신

자바 프로그램을 실행하는 엔진이자,
"한 번 작성하면 어디서나 실행된다 (Write Once, Run Anywhere)"라는 자바 철학을 실현해주는 핵심 기술입니다.


🔧 무슨 일을 할까?

JVM의 핵심 역할은 딱 하나:

컴파일된 .class 바이트코드 파일을 실행하는 것

즉, 우리가 작성한 .java 소스 코드는 **JDK의 컴파일러(javac)**에 의해 .class라는 바이트코드로 바뀌고,
이 바이트코드를 운영체제에 맞게 해석해서 실행하는 주체가 바로 JVM입니다.


🔍 JVM 내부 동작 구조 요약

[.class 파일]
      ↓
 Class Loader → 메모리에 로딩
      ↓
 Bytecode Verifier → 유효성 검사
      ↓
 Execution Engine → 실행 (JIT 컴파일 포함)
      ↓
 Native Code → 실제 OS에서 동작

📦 구성 요소 간단 설명

구성 요소역할
Class Loader 클래스 파일 메모리에 로드
Execution Engine 바이트코드 해석 & 실행
JIT Compiler 바이트코드를 네이티브 코드로 동적 변환
GC (Garbage Collector) 불필요한 객체 메모리 자동 정리
Runtime Data Area 메모리 공간 (Heap, Stack 등)
 

🤔 JVM이 왜 중요한가요?

  • 플랫폼 독립성: 같은 자바 프로그램이 Windows, Linux, macOS에서 실행 가능
  • 메모리 관리 자동화: GC 덕분에 개발자가 직접 메모리 해제할 필요 없음
  • 보안성: 바이트코드 검사 및 제한된 실행 환경 제공

📌 용어 간 관계 정리

용어설명
JDK 자바 개발 도구 세트 (JRE + 컴파일러 포함)
JRE 실행 환경 (JVM + 라이브러리)
JVM 실제 실행기 (JRE 내부에 있음)

 

728x90
반응형
728x90
반응형

✅ 한눈에 보는 차이표

구성 요소설명포함 관계주요 역할
JDK (Java Development Kit) 자바 개발 도구 전체 세트 JDK ⊃ JRE ⊃ JVM 개발 + 실행
JRE (Java Runtime Environment) 자바 실행 환경 JRE ⊃ JVM 실행만 가능
JVM (Java Virtual Machine) 자바 가상 머신 (실행 엔진) JRE ⊃ JVM 바이트코드 실행
 

🔍 1. JVM (Java Virtual Machine)

“Write once, run anywhere”를 실현시키는 핵심”

  • 역할: .class 파일(바이트코드)을 실행
  • 동작:
    1. Class Loader: 클래스를 메모리에 로딩
    2. Bytecode Verifier: 코드 검증
    3. Execution Engine: 코드 실행 (JIT 컴파일 포함)
  • OS/환경별로 다름: 각 OS에 맞는 JVM이 존재

🔸 JVM만으로는 자바 코드 작성 불가


🔍 2. JRE (Java Runtime Environment)

“자바 프로그램을 실행할 수 있는 환경”

  • 구성:
    • JVM
    • 자바 클래스 라이브러리(rt.jar)
    • 필요한 기타 실행파일 (예: java 명령어)
  • 목적: 자바 프로그램 실행만 가능 (컴파일 ×)
  • 대상: 자바 개발이 아닌 실행만 필요한 사용자 (예: 서버 운영자)

🔸 개발 도구 없음 (javac X)


🔍 3. JDK (Java Development Kit)

“자바를 개발하기 위한 모든 도구 포함”

  • 구성:
    • JRE
    • 개발 툴 (javac, javadoc, jar 등)
  • 역할: 자바 소스 코드를 작성, 컴파일, 디버깅 가능
  • 대상: 자바 개발자

🔸 JDK 설치하면 JRE, JVM 포함

[JDK]
 └── [JRE]
       └── [JVM]

🧠 쉽게 외우는 포인트

외우는 방법
JVM은 바이트코드를 실행하는 엔진
JRE는 JVM + 실행 라이브러리 = 실행 환경
JDK는 JRE + 개발 도구 = 개발 키트
 

🎯 개발자 입장에서 요약

  • 자바 코드 작성 ➡️ JDK 필수
  • 자바 앱 실행만 ➡️ JRE만 설치해도 가능
  • 바이트코드 실행 책임자 ➡️ JVM

 

728x90
반응형
728x90
반응형

1. 스프링의 시작은 책 한 권에서

스프링(Spring)은 단순한 프레임워크 그 이상입니다. 그 시작은 2002년, Rod Johnson이 집필한 『Expert One-on-One J2EE Design and Development』라는 책에서 등장한 소스 코드에서 비롯됩니다. 당시 **EJB(Enterprise JavaBean)**는 무거운 구조와 복잡성으로 인해 '겨울'과도 같았죠. Rod는 이를 비판하며 '단순함'을 추구했고, 그 철학이 '봄(Spring)'이라는 이름으로 이어진 것입니다.

❝ EJB의 겨울을 지나, 스프링의 봄이 온다 ❞

스프링은 2003년 6월에 처음 세상에 공개되었고, 오픈소스 프로젝트로서 Apache License 2.0을 따릅니다. 2022년 11월 기준으로는 6.0.0 버전까지 출시되어 있으며, 주요 기능은 이제 Spring Boot를 중심으로 구현되고 있습니다.

2. 왜 스프링이 중요한가?

  • POJO 기반: 복잡한 컴포넌트 없이 순수한 Java 객체로 개발이 가능.
  • DI/IoC 컨테이너: 객체의 생성과 의존성 관리를 프레임워크가 자동으로 처리.
  • 모듈화: AOP(Aspect-Oriented Programming)를 통해 핵심 로직과 부가 기능을 깔끔히 분리.
  • JVM 기반 호환성: Java는 물론 Kotlin 등 다양한 언어와도 호환.
  • 강력한 생태계: Spring MVC, Spring Data, Spring Security, Spring Cloud 등 수많은 확장 가능성.
  • 전자정부 프레임워크 기반: 국내 공공기관 시스템의 표준으로도 사용.

3. 스프링을 제대로 활용하려면?

  • Spring Boot로 시작하면 빠르고 간단한 설정이 가능
  • IntelliJ IDEA는 Spring에 최적화된 대표 IDE (JetBrains 공식 지원)
  • 테스트/배포 자동화까지 생각한다면 Swagger, Docker, GitHub Actions와 연동 추천

✍️ 요약문

스프링은 복잡했던 Java EE의 시대에 ‘단순함’이라는 가치를 제시하며 등장한 웹 프레임워크입니다. Rod Johnson의 철학에서 출발한 이 프로젝트는 이제 전 세계 수많은 기업과 공공기관이 사용하는 강력한 인프라가 되었습니다. 만약 Java 기반 백엔드를 시작하고 싶다면, Spring은 그 자체로도 가장 강력한 출발점입니다.

728x90
반응형
728x90
반응형

자바 개발자라면 꼭 알고 있어야 하는 GC(Garbage Collector)!
객체는 언제 메모리에서 사라지고, 애플리케이션이 왜 가끔씩 멈추는지 궁금하셨나요?
아래 이미지와 함께 GC의 작동 구조를 쉽게 설명해드립니다.


🔍 GC 개념 요약

**Garbage Collector(GC)**는 사용하지 않는 객체를 힙 메모리에서 자동으로 제거하는 JVM의 기능입니다.
메모리 누수를 방지하고 개발자가 직접 메모리를 관리하지 않아도 되게 해주는 아주 고마운 기능이죠.


🧠 Java 힙 메모리 구조

아래 이미지는 자바 힙(Heap) 메모리의 구성과 객체 이동 과정을 시각적으로 표현한 구조입니다.

✅ 설명:

  • 객체는 먼저 Eden 영역에 생성됩니다.
  • GC(Minor GC)가 발생하면 Eden → Survivor1 → Survivor2를 오가며 살아남습니다.
  • 여러 번 살아남으면 Old 영역으로 이동합니다.
  • Old가 꽉 차면 **Major GC (또는 Full GC)**가 발생합니다.
  • Permanent(또는 Java 8 이후 MetaSpace)는 클래스 정보 등 JVM 메타데이터를 저장하는 공간입니다.

💥 GC의 종류

GC 종류대상 영역특징
🧹 Minor GC Young Generation (Eden + Survivor) 빠르고 자주 발생함
🧹 Major GC Old Generation 느리고 멈춤(STW)이 발생함
🧹 Full GC 전체 힙 영역 Major GC 포함 + 기타 리소스 정리
 

🛑 STW(Stop The World)란?

GC를 수행하는 동안 JVM의 모든 스레드가 멈추는 현상입니다.
특히 Major GC나 Full GC 시 STW가 발생하며 사용자 체감 지연이 생길 수 있습니다.

📌 GC 튜닝의 핵심: STW 시간을 최소화하는 것!


⚙ 대표적인 GC 알고리즘

GC 종류특징적합 환경
Serial GC 단일 스레드, 기본 구조 저사양/테스트용
Parallel GC 멀티스레드 병렬 처리 일반 서버, 병렬 CPU
Parallel Old GC Old까지 병렬 처리 고사양 서버
G1 GC Region 단위 처리, STW 최소화 Java 9 이상 대규모 앱
ZGC/Shenandoah 실시간 GC, STW 거의 없음 실시간 처리 시스템
 

🧰 개발 팁 요약

  • 객체는 가능한 빨리 Eden에서 제거되도록 설계하자
  • Old로 가는 객체는 재사용하거나 Pool 처리가 바람직
  • GC 튜닝 시에는 G1 GC, ZGC 등 최신 GC 전략 고려

✅ 마무리

GC는 Java의 강력한 장점 중 하나지만,
그 내부 동작을 모르면 애플리케이션 지연이나 STW 문제를 겪기 쉽습니다.
이제 GC 동작 구조를 알았으니, 메모리 튜닝과 성능 최적화에 자신감이 붙으실 겁니다!

728x90
반응형
728x90
반응형

🗃️ 1. DAO란?

DAO (Data Access Object)
→ 데이터베이스에 접근하는 역할

  • DB와 직접 통신하는 클래스
  • SQL, JPA, Mapper 등을 통해 DB 데이터를 가져오거나 넣는 책임을 가짐
  • 비즈니스 로직과 분리되어 코드의 책임이 명확해짐
public class UserDao {
    public void save(User user) {
        // DB insert 로직
    }

    public User findById(Long id) {
        // DB select 로직
    }
}

📦 2. DTO란?

DTO (Data Transfer Object)
→ 계층 간 데이터 전달용 객체

  • 컨트롤러 ↔ 서비스 ↔ DAO 사이에서 데이터를 전달함
  • 순수 데이터만 포함 (로직 없음)
  • Getter/Setter만 있는 클래스
public class UserDto {
    private String name;
    private String email;
    // getter / setter
}

🧾 실무 예시:

  1. 사용자가 입력한 데이터를 UserDto에 담아 서버로 전송
  2. 서버는 DTO를 받아 DAO를 통해 DB에 저장

🔐 3. VO란?

VO (Value Object)
불변의 값을 나타내는 객체

  • DTO와 비슷하지만 값이 한 번 생성되면 변경 불가
  • setter()가 없고, 생성자로만 값 설정
  • 주로 equals(), hashCode()가 중요
public class Money {
    private final int amount;

    public Money(int amount) {
        this.amount = amount;
    }

    public int getAmount() {
        return amount;
    }
}

🔍 DAO / DTO / VO 차이 비교표

항목DAODTOVO
역할 DB 접근 담당 계층 간 데이터 전달 불변 값 표현
포함 내용 DB 로직 순수 데이터 불변 데이터
메서드 쿼리/비즈니스 연동 getter/setter getter only
변경 가능성 O O
 

✅ 마무리 요약

  • DAO: DB와 대화하는 친구
  • DTO: 데이터를 옮겨주는 메신저
  • VO: 한 번 정해지면 변하지 않는 값 객체
728x90
반응형
728x90
반응형

🔷 Forward 방식이란?

Web Container 내부에서 요청을 다음 페이지로 전달하는 방식

  • 브라우저는 이동했음을 인지하지 못함
  • URL은 바뀌지 않음
  • Request와 Response 객체를 공유
  • 서버 내부에서 페이지 이동만 발생
  • 대표 사용 예: 글 목록, 검색 결과 등 조회용 요청

📌 예시 상황

게시글 작성 완료 후 forward로 응답 페이지를 호출했을 때, 새로고침 시 동일 게시물이 여러 번 등록될 수 있음.
➡️ 왜냐하면 이전 요청 정보가 그대로 유지되기 때문!


🔷 Redirect 방식이란?

서버가 브라우저에게 다른 URL로 이동하라고 지시하는 방식

  • 브라우저가 새로운 URL로 이동
  • Request/Response 객체는 새로 생성
  • URL이 변경됨
  • 다른 서버나 컨텍스트로도 이동 가능
  • 대표 사용 예: 회원가입, 게시글 등록 등 데이터 변경 요청

📌 예시 상황

게시글 등록 후 redirect를 사용하면, 새로고침해도 중복 등록이 발생하지 않음.
➡️ 왜냐하면 이전 요청 정보가 사라지기 때문!


🔷 Forward vs Redirect 비교 정리

항목ForwardRedirect
URL 변경 ❌ 변경 없음 ✅ 변경됨
브라우저 인식 ❌ 이동 모름 ✅ 이동함
Request 공유 ✅ 동일 객체 ❌ 새 객체
사용 위치 조회 등록/삭제
새로고침 시 요청 유지 요청 초기화
 

🔷 Spring에서 Redirect 사용 예시

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @GetMapping("/signup")
    public String joinForm() {
        return "users/createMember";
    }

    @PostMapping("/signup")
    public String joinForm(@ModelAttribute UserDto.Request userDto) {
        userService.saveUser(userDto);
        return "redirect:/"; // 리다이렉트 처리
    }
}

✅ 마무리

  • 단순 조회는 Forward
  • DB에 변화를 주는 요청은 Redirect

이 원칙만 기억하면 안정적인 웹 흐름을 구성할 수 있습니다!

728x90
반응형

+ Recent posts