※ 필수 Git 명령어 정리 (CLI(Command Line Interface) 기준)

 

> 로컬 저장소 관련

명령어 설명
git init 현재 폴더를 Git 저장소로 초기화
git clone 원격저장소url 원격 저장소를 복제
git status 변경 사항 확인
git add 확장자포함파일명 특정 파일 스테이징
git add . 모든 변경 사항 스테이징
git commit -m "커밋메세지" 스테이징된 파일을 커밋

 

> 브랜치 관련

명령어 설명
git branch 브랜치 목록 확인
git branch 브랜치명 새 브랜치 생성
git checkout 브랜치명 특정 브랜치로 이동
git switch 브랜치명 브랜치 이동(새로운 방식)
git checkout -b 브랜치명 브랜치 생성 + 이동
git merge 브랜치명 현재 브랜치에 다른 브랜치를 병합
git branch -d 브랜치명 브랜치 삭제

 

> 원격 저장소 관련

명령어 설명
git remote -v 원격 저장소 확인
git remote add origin 원격저장소url 원격 저장소 추가
git push origin 브랜치명 원격 저장소로 푸시
git pull origin 브랜치명 원격 저장소에서 가져오기(merge 포함)
git fetch 원격 저장소 변경 사항 가져오기(병합X)

 

> 되돌리기 / 정리

명령어 설명
git log 커밋 로그 확인
git diff 변경 내용 비교
git reset --hard 커밋해시값 특정 커밋으로 되돌리기(작업 내역 삭제)
git revert 커밋해시값 특정 커밋을 되돌리는 새 커밋 생성
git stash 작업 중인 변경 사항 임시 저장
git stash pop 임시 저장된 변경 사항 복원

 

git push --set-upstream origin master 의미 : 최초 1회에 한해서, 로컬 브랜치와 원격 브랜치를 연결 해 주는 명령어

이후, git push 또는 git pull 만 입력해도 자동으로 origin master로 연결

※ Git & GitHub

구분 Git GitHub
정의 코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 Git으로 관리되는 프로젝트의 코드가 저장되는 저장소
설치 여부 로컬 PC에 직접 설치 필요 웹/클라우드 서비스로 설치 불필요
저장소 위치 개발자 PC(로컬 저장소)와 원격 저장소(서버) 원격 저장소 제공 (github.com)
주요 기능 버전 관리, 브랜치 관리, 협업을 위한 merge/rebase 코드 공유, Pull Request(PR), 이슈 관리, CI/CD, 협업 도구
사용 목적 코드 변경 이력 관리, 되돌리기, 브랜치 기반 개발 오픈소스 프로젝트 협업, 팀 프로젝트 관리, 포트폴리오 공개
오프라인 사용 가능 (네트워크 없이도 커밋 가능) 불가능 (인터넷 필요)
예시 git init, git commit, git merge Pull Request, Issue, Actions

 

※ Git vs SVN 비교

> Git

장점

  · 분산 버전 관리(DVCS)라서 로컬에서도 작업 가능

  · 브랜치 생성/병합이 가볍고 유연함

  · 속도가 빠름 (커밋, 브랜치, 되돌리기 등)

  · 오픈소스 커뮤니티와 툴(GitHub, GitLab 등) 지원이 풍부

단점

  · 개념이 다소 복잡하여 초보자가 배우기 어려움

  · 프로젝트 규모가 크면 로컬 저장소 용량이 커질 수 있음

> SVN

장점

  · 중앙 집중식 관리라 구조가 단순하고 이해하기 쉬움

  · 서버에서 버전 관리가 일원화되어 보안/권한 관리가 용이

  · 대규모 기업/문서 관리에 적합

단점

  · 서버 접속이 반드시 필요 (오프라인 작업 불가)

  · 브랜치/머지 작업이 무겁고 불편

  · 서버 장애 시 개발이 중단될 수 있음

> Git vs SVN

구분 Git SVN
관리 방식 분산 버전 관리 (로컬+원격) 중앙 집중식 버전 관리
오프라인 작업 가능 불가능
속도 빠름 (로컬 처리) 느림 (항상 서버 의존)
브랜치 관리 가볍고 유연 무겁고 불편
안정성 서버 장애에도 로컬에서 복구 가능 서버 장애 시 전체 작업 중단
난이도 초보자에겐 다소 어렵다 비교적 직관적이고 단순

 

> 정리

  · Git은 현대 개발 표준(특히 오픈소스 & 협업 중심)

  · SVN은 단순 관리가 필요한 기업 환경에 적합

  · Git ↔ GitHub

  · SVN ↔ SVN 서버 (자체 구축 or 호스팅 서비스)

 

※ GitHub vs GitLab 비교

구분 GitHub GitLab
소유 Microsoft GitLab Inc.
철학 오픈소스 중심 협업 DevOps 올인원 플랫폼
CI/CD GitHub Actions GitLab CI/CD (강력)
설치 방식 클라우드(기본) 클라우드 + 자체 서버 설치 가능
커뮤니티 세계 최대 오픈소스 커뮤니티 상대적으로 규모 작음
적합한 대상 오픈소스, 스타트업, 개인 개발자 기업, 보안 중요 환경

 

> 정리

  · GitHub : 오픈소스 협업에 최적화된 세계 최대 개발자 플랫폼

  · GitLab : 기업용 DevOps 올인원 솔루션 (특히 자체 서버 운영에 강점)

※ JPA vs Spring Data JPA

// 순수 JPA
Optional<Member> m1 = memberJpaRepository.findById(1L); // 1L은 ID가 1, 타입은 Long을 의미
List<Member> actives1 = memberJpaRepository.findAllByStatus(Member.Status.ACTIVE);

// Spring Data JPA
Member m2 = memberRepository.findById(1L) // 1L은 ID가 1, 타입은 Long을 의미
              .orElseThrow(() -> new IllegalArgumentException("not found"));
List<Member> actives2 = memberRepository.findAllByStatus(Member.Status.ACTIVE);

 

※ JPA vs Spring Data JPA 비교 표

구분 순수 JPA (EntityManager) Spring Data JPA
소속 JPA 표준 API (자바 ORM 표준) JPA 기반의 스프링 모듈 (확장/편의 기능 제공)
단건 조회 메서드 em.find(Entity.class, pk) findById(pk)
반환 타입 엔티티 객체 (없으면 null) Optional<T> (없으면 Optional.empty())
null 처리 개발자가 직접 null 체크 Optional API로 null-safe 처리
쿼리 작성 방식 JPQL 직접 작성 필요 메서드 이름 기반 자동 생성 or @Query 사용
CRUD 기본 제공 없음 (직접 구현) save, findAll, deleteById 등 기본 CRUD 제공
페이징/정렬 JPQL로 직접 구현 Pageable, Sort 등 내장 지원
트랜잭션 관리 직접 제어 or 스프링 @Transactional 사용 동일 (스프링 @Transactional 사용)
코드량 비교적 많음 (보일러플레이트 존재) 간결 (리포지토리 인터페이스만 선언해도 사용 가능)
유연성 매우 높음 (JPA 모든 기능 직접 제어 가능) 편의성 높음, 하지만 일부 세밀 제어는 한계
학습 난이도 다소 높음 (JPA 문법과 JPQL 숙지 필요) 상대적으로 낮음 (자동화된 기능 덕분)

* 보일러플레이트 : 필수지만 매번 반복적으로 작성해야 하는 형식적인 코드

 

※ Spring Data JPA가 생산성을 높이는 3가지 핵심 이유

1) 트랜잭션과 EntityManager 자동 관리

· 순수 JPA에서는 EntityManager 생성, 트랜잭션 시작·종료, 예외 처리 등을 매번 작성해야 함
· Spring Data JPA는 스프링이 자동으로 주입하고, @Transactional로 트랜잭션을 간단하게 처리


2) 쿼리 자동 생성
· 순수 JPA는 JPQL을 직접 작성해야 함

· Spring Data JPA는 메서드 이름 기반으로 쿼리를 자동 생성

    · 예 : findAllByStatus(Status.ACTIVE) → select m from Member m where m.status = ? 자동 생성
· 필요하면 @Query로 직접 JPQL 또는 네이티브 쿼리 작성도 가능


3) 기본 CRUD와 페이징·정렬 내장

· save, findById, findAll, deleteById 같은 CRUD 메서드가 기본 제공
· Pageable, Sort를 활용한 페이징과 정렬 기능도 내장되어 있어 추가 구현이 필요 없음

 

※ 결론

Spring Data JPA는 순수 JPA의 복잡한 보일러플레이트 코드를 최소화하여, 개발자가 비즈니스 로직에만 집중할 수 있도록 도와줌

· 순수 JPA → 유연하지만 반복 코드 많음

· Spring Data JPA → 생산성 높고 유지보수성 향상

※ IPv4 vs IPv6 간단 비교

항목 IPv4 IPv6
정식 명칭 Internet Protocol version 4 Internet Protocol version 6
주소 길이 32비트 128비트
주소 수 약 42억 개 무한에 가까움 (3.4 x 10³⁸ 개)
형식 예시 192.168.0.1 2001:0db8:85a3:0000:0000:8a2e:0370:7334
도입 시기 1981년 1998년
사용 현황 아직 가장 널리 사용됨 점점 더 많이 도입 중

 

> 왜 IPv6가 나왔을까?

IPv4는 주소 수가 약 42억 개뿐이라서, 전 세계적으로 IP가 부족해진 상황, 그래서 더 많은 IP를 만들 수 있도록 나온 게 IPv6

 

상황 필요한 버전
일반 웹 개발 / API 통신 대부분 IPv4 기반
글로벌 서비스를 만들거나, IoT 등 수십억 개 장비 연결 IPv6 고려 필요
방화벽, 서버 보안 설정 시 IPv4, IPv6 모두 고려해야 할 수도 있음

 

※ 서브넷 마스크 (Subnet Mask)

서브넷 마스크는 IP 주소를 네트워크 부분과 호스트 부분으로 나누는 기준
즉, 내가 속한 네트워크의 범위가 어디까지인지 알려주는 값

 

> 예시

  · IP 주소 : 192.168.1.10

  · 서브넷 마스크 : 255.255.255.0

이 설정은 192.168.1.0 ~ 192.168.1.255 범위의 IP끼리 같은 네트워크로 간주된다는 뜻

 

> 잠깐 ! 왜 192.168.1.10 / 255.255.255.0이면, 192.168.1.0 ~ 192.168.1.255끼리 같은 네트워크로 간주되는지 알아보자

 

> IP 주소와 서브넷 마스크는 비트 단위 연산으로 비교

항목 10진수 2진수
IP 192.168.1.10 11000000.10101000.00000001.00001010
서브넷 마스크 255.255.255.0 11111111.11111111.11111111.00000000

 

> IP 주소 & 서브넷 마스크를 AND 연산 (AND 연산 : 둘 다 1일 때만 1)

즉, 이 IP(192.168.1.10)는 192.168.1.0 네트워크에 속해 있다는 뜻

그래서 이 범위 안의 IP (192.168.1.1 ~ 192.168.1.254)는 같은 서브넷에 속한 컴퓨터들이라고 간주되는 것

 

쉽게 비유하면,

IP 주소 : 내가 사는 집 주소 (예 : 서울시 강남구 101동 201호)

서브넷 마스크 : 어느 동네까지가 우리 '이웃'인지 정하는 기준 (예 : 강남구까지만 이웃)

그래서 서브넷 마스크는 내부 통신 가능한 컴퓨터들의 범위를 정의

(내부 통신이 가능하다 : 같은 네트워크에 속한 컴퓨터끼리는 '라우터나 게이트웨이 없이도' 바로 데이터를 주고받을 수 있다는 뜻)

 

같은 사무실의 개발자 두 명
개발자 A의 PC IP : 192.168.1.10
개발자 B의 PC IP : 192.168.1.20
서브넷 마스크 : 255.255.255.0
이 둘은 같은 네트워크 (192.168.1.0)에 속하므로 파일 공유, 서버 접속, 핑(Ping) 테스트가 라우터 없이도 바로 가능

상황 설명
A가 B의 로컬 개발 서버 접속 (http://192.168.1.20:3000) 개발 중 실시간 결과 공유
A가 B 컴퓨터로 파일 공유 윈도우 공유 폴더, FTP 등
ping 192.168.1.20 A가 B가 살아있는지 확인 가능
서로 다른 네트워크일 경우 라우터가 필요 (라우터로 나가기 위한 출입구가 기본 게이트웨이)

 

> 서브넷 마스크 예시

서브넷 마스크 CIDR 표기 가능한 호스트 수 의미
255.0.0.0 /8 약 1,670만 개 굉장히 큰 네트워크
255.255.0.0 /16 약 6.5만 개 중간 규모 네트워크
255.255.255.0 /24 254개 가장 흔한, 소규모 LAN
255.255.255.128 /25 126개 절반으로 쪼갬
255.255.255.192 /26 62개 더 쪼갬
255.255.255.252 /30 2개 거의 포인트투포인트 통신용

 

정리 : 서브넷 마스크는 IP 주소와 비트 AND 연산을 통해 "너와 나는, 같은 동네야"를 판단하는 기준

 

※ 기본 게이트웨이 (Default Gateway)

기본 게이트웨이는 내부 네트워크에서 외부 네트워크로 나갈 때 통로 역할을 하는 장치

용어 비유 설명
게이트웨이 출입구라는 개념 전체 아파트 단지의 모든 정문, 후문 포함
기본 게이트웨이 내가 늘 사용하는 정문 내비게이션에 기본 설정된 출구처럼, 내가 외부로 나갈 때 항상 쓰는 정문

(보통은 라우터의 IP 주소가 기본 게이트웨이가 됨)

참고 : 모든 라우터는 게이트웨이 역할을 할 수 있지만, 모든 게이트웨이가 꼭 라우터는 아니다.

 

> 예시

기본 게이트웨이 : 192.168.1.1 (이 주소는 내가 인터넷에 접속하려 할 때 패킷을 먼저 전달하는 대상)

 

> 비유

내가 집(내부 네트워크)에 있고, 택배를 외국(인터넷)에 보내고 싶다고 해보자, 이때 기본 게이트웨이는 우체국 역할을 한다.

집 밖으로 나가는 건 무조건 우체국(게이트웨이)을 거쳐야 한다.

 

> 게이트웨이를 통한 통신 절차 (요약) - A의 서브넷 : 192.168.1.0/24, B의 서브넷 : 192.168.2.0/24

1. A(192.168.1.10)는 B(192.168.2.20)가 '다른 네트워크'라는 걸 서브넷 마스크로 판단
2. A는 기본 게이트웨이의 IP로 데이터를 보냄 (A 컴퓨터는 기본 게이트웨이 주소(192.168.1.1)를 알고 있음)
3. 게이트웨이(라우터)가 B의 위치를 확인하고, 패킷을 전달 (게이트웨이는 192.168.2.0/24 네트워크에 접근할 수 있는 경로를 알거나 외부 네트워크로 NAT를 통해 전송할 수도 있음)

4. B가 응답을 보내면, 그 응답도 게이트웨이를 거쳐 A에게 도착

 

> 게이트웨이 / 라우터 / 패킷

구분 개념 설명 우편 시스템 비유 네트워크 상의 역할
게이트웨이 다른 네트워크와 내부 네트워크를
연결하는 입구/출구
아파트 관리실/정문
(택배/우편이 들어오고 나가는 곳)
외부로 나갈 때는 출구, 외부에서 들어올 땐 입구 역할
(내부와 외부를 잇는 관문)
라우터 여러 네트워크 사이에서 데이터가 갈
방향을 결정
우체국 분류기
(어느 동, 호수로 보낼지 판단)
네트워크 경로를 계산하고, 데이터가 어느 방향으로 가야 하는지 결정
패킷 전송되는 데이터의 최소 단위
(쪼개진 데이터 덩어리)
실제 편지 봉투
(주소와 내용물이 있음)
컴퓨터 간 전송되는 실제 정보로, 게이트웨이/라우터를 거쳐 이동

현실에서 게이트웨이로 설정된 주소가 바로 라우터의 IP 주소인 경우가 많아서, '라우터가 게이트웨이 역할을 한다'고 말하는 것

 

정리 : 게이트웨이는 내 컴퓨터(내부 네트워크)가 외부(외부 네트워크)와 통신할 때 반드시 거쳐야 하는 관문

 

※ NAT (Network Address Translation)

사설 IP를 공인 IP로 바꿔주는 기술

즉, 집 안의 여러 기기가 하나의 공인 IP를 공유해 외부와 통신할 수 있게 해주는 것

 

> 왜 NAT가 필요한지?

우리 집에 노트북, 스마트폰, TV 등 여러 기기가 있다고 했을 때, 이들은 각각 192.168.x.x 같은 사설 IP를 사용한다.

하지만 인터넷은 공인 IP만 알기 때문이다. (사설 IP는 인터넷에서 직접 쓸 수 없음)

 

> 개발자에게 NAT가 중요한 이유?

집이나 회사에서 서버를 열었는데 외부에서 접속 안 되는 경우 : NAT를 거쳐야 하므로 포트포워딩 필요

Docker, 가상머신 등의 통신 문제 : Docker가 자체 NAT 네트워크를 사용함

사설망끼리 VPN 연결 : NAT 트래버설, 터널링 같은 기술이 필요

 

정리 : NAT는 사설 네트워크와 외부 네트워크 간의 통역사 역할

  · 외부로 나갈 때는 사설 IP -> 공인 IP

  · 내부로 들어올 때는 공인 IP -> 사설 IP

 

포트포워딩 (Port Forwarding)

외부에서 공유기(공인 IP)로 들어온 요청을, 내부 네트워크의 특정 컴퓨터와 포트로 전달해주는 기능

즉, 공유기는 어느 기기로 데이터를 보내야 할지 모르니까 ' 이 포트로 들어오면 이 내부 IP로 보내줘' 하고 길을 지정해주는 설정

※ 사용 환경

·  IDE : IntelliJ IDEA
·  DBMS : MySQL
·  GUI 클라이언트 : HeidiSQL
·  빌드 도구 : Gradle
·  프레임워크 : Spring Boot

 

1) Gradle에 MySQL 커넥터 추가

build.gradle 파일 내 dependencies 부분에 다음과 같이 현재 MySQL 서버 버전과 호환되는 JDBC 드라이버를 추가

dependencies {
	// 8.0.33은 JDBC 드라이버 버전을 의미하며, MySQL 서버 버전과 일치할 필요는 없지만, 호환되는 범위 내에서 선택하여 입력
	implementation 'com.mysql:mysql-connector-j:8.0.33'
}

 

2) application.yml 설정

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/library
    username: 입력
    password: 입력
    driver-class-name: com.mysql.cj.jdbc.Driver

library : 사용할 데이터베이스 이름
localhost : 로컬 서버를 의미하며, 외부 DB를 사용할 경우 해당 주소로 변경
포트 번호는 MySQL 기본 포트인 3306

 

3) HeidiSQL 설정

HeidiSQL에서 다음과 같이 접속 정보를 설정

네트워크 유형 : MySQL (TCP/IP)
호스트명 / IP : 127.0.0.1 ( 127.0.0.1은 루프백(loopback) 주소라고 불리며, 현재 자기 자신의 컴퓨터를 가리키는 IP 주소, 즉, localhost와 127.0.0.1은 기능적으로 완전히 동일)
포트 : 3306
사용자 : 위에서 설정한 username

암호 : 위에서 설정한 password
데이터베이스 : library (아래 이미지)

※ 대표적인 DB 서버

구분 DB 서버 (Server) 설명
관계형 MySQL, MariaDB, PostgreSQL, Oracle DB, MS SQL Server, SQLite 일반적으로 설치형 서버
비관계형 MongoDB, Redis, Cassandra, etc Key-Value / Document 기반 등

 

 

※ 대표적인 DB 클라이언트

구분 DB 클라이언트 (Client) 설명
GUI HeidiSQL, DBeaver, DataGrip, MySQL Workbench, pgAdmin, TablePlus 시각적 인터페이스 제공
CLI mysql, psql, sqlcmd 터미널 기반 접속 도구

GUI : 그래픽 사용자 인터페이스 (Graphical User Interface)

CLI : 명령줄 사용자 인터페이스 (Command Line Interface)

 

 

※ DB 서버별 호환 클라이언트 정리

DB 서버 주요 GUI 클라이언트 주요 CLI 클라이언트
MySQL HeidiSQL, DBeaver, MySQL Workbench, TablePlus mysql
MariaDB HeidiSQL, DBeaver, TablePlus mysql, mariadb (CLI)
PostgreSQL DBeaver, DataGrip, pgAdmin, TablePlus psql
Oracle DB DBeaver, DataGrip, SQL Developer sqlplus
MS SQL DBeaver, DataGrip, SSMS (SQL Server Mgmt Studio) sqlcmd
SQLite DBeaver, DB Browser for SQLite, TablePlus sqlite3
MongoDB MongoDB Compass, NoSQLBooster mongosh
Redis RedisInsight redis-cli

 

항목 32비트 (x86) 64비트 (x64)
처리 능력 (CPU) 한 번에 32비트 데이터 처리 한 번에 64비트 데이터 처리
운영체제 및 구조 32비트 운영체제 설치 가능32비트 프로그램만 실행 가능 64비트 운영체제 설치 가능32비트와 64비트 프로그램 모두 실행 가능
RAM 인식 한계 최대 4GB까지만 인식 가능 128GB 이상도 인식 가능 (운영체제와 하드웨어에 따라 다름)
멀티태스킹/고사양 작업 제한적 성능 - 가벼운 용도(인터넷, 문서작업 등)에 적합 고성능 - 영상 편집, 게임, 개발, 디자인 등 고사양 작업에 적합
프로그램 호환성 32비트 프로그램만 설치 및 실행 가능 32비트 및 64비트 프로그램 대부분 호환 가능
보안 기능 일부 최신 보안 기능 미지원 최신 보안 기술 지원 (예: 하드웨어 기반 보안, 주소 공간 배치 난수화 등)
대표 폴더 구조 C:\Program Files만 존재 C:\Program Files (64비트) + C:\Program Files (x86) (32비트) 모두 존재
요즘 PC 기준 구형 기기 또는 저사양 용도에만 일부 사용 대부분의 최신 PC/노트북은 64비트 운영체제와 CPU가 기본

 

<DDL vs DML 개념 정리>

구분 의미 목적 데이터 영향 COMMIT 필요 여부
DDL
(Data Definition Language)
데이터 정의어 DB 구조를 정의하거나 수정함 테이블/스키마 등
구조 변경
자동 COMMIT
DML
(Data Manipulation Language)
데이터 조작어 데이터를 조회·추가·수정·삭제함 실제 데이터 변경 수동 COMMIT 필요
(AUTOCOMMIT OFF 시)

 

★ 수동 COMMIT 필요 여부 확인 방법

MySQL : SELECT @@AUTOCOMMIT; (1이면 ON, 0이면 OFF)

Oracle : 사용 도구에 따라 달라짐

 

<DDL>

명령어 설명
CREATE 데이터베이스, 테이블, 뷰 등 생성
ALTER 테이블 구조 변경 (컬럼 추가/삭제 등)
DROP 테이블이나 데이터베이스 삭제
TRUNCATE 테이블 내용 전체 삭제 (초기화, 빠름)
RENAME 테이블 이름 변경
COMMENT 테이블, 컬럼 등에 주석 추가
CREATE TABLE USERS (
    ID INT PRIMARY KEY,
    NAME VARCHAR(50)
);

ALTER TABLE USERS ADD EMAIL VARCHAR(100);

DROP TABLE USERS;

TRUNCATE TABLE USERS;

 

<DML>

명령어 설명
SELECT 데이터 조회
INSERT 데이터 삽입
UPDATE 데이터 수정
DELETE 데이터 삭제
INSERT INTO USERS (ID, NAME) VALUES (1, 'LEE');

SELECT * FROM USERS;

UPDATE USERS SET NAME = 'KIM' WHERE ID = 1;

DELETE FROM USERS WHERE ID = 1;

+ Recent posts