이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.
개발 학습 실습실
물음을 고르고 실행을 눌러, 개념이 어떻게 움직이는지 직접 봅니다.
물음을 하나씩 골라 실행해 보며 자바, 스프링, JPA, 데이터베이스, 네트워크, 보안의 개념을 익히는 무료 실습실
개념의 세부 동작을 보기 전에, 그 개념이 코드에서 어떻게 생긴 것인지와 없으면 어떻게 되는지를 봅니다.
Java
- 변수와 타입 — 변수는 무엇이고, 타입은 무엇을 정하는가
- 메서드 — 메서드는 무엇이고, 선언하는 것과 부르는 것은 어떻게 다른가
- 클래스와 객체 — 클래스와 객체는 어떻게 다른가
- 참조 — 변수에 객체를 담는다는 것은 무슨 뜻인가
- null — null은 무엇이고, 왜 NullPointerException이 나는가
- 생성자 — 생성자는 무엇이고, 언제 실행되는가
- static — static은 무엇이고, 붙이면 무엇이 달라지는가
- 상속 — extends는 무엇을 물려주는가
- 인터페이스 — 인터페이스는 코드에서 어떻게 생겼고 무엇을 정하는가
- 예외 — 예외는 무엇이고, try-catch는 무엇을 해 주는가
- 제네릭 — List<String>의 <String>은 무엇을 해 주는가
- List와 Map — List와 Map은 무엇을 담고, 어떻게 꺼내는가
- 람다 — 람다는 무엇을 줄여 쓴 것인가
- 스트림 — 스트림은 무엇이고, for 문과 무엇이 다른가
- 애너테이션 — 애너테이션은 무엇이고, 붙이면 무슨 일이 생기는가
- 스레드 — 스레드는 무엇이고, start()는 무엇을 하는가
- 락(synchronized) — 락은 무엇이고, 없으면 무슨 일이 생기는가
- 스레드 풀 — 스레드 풀은 무엇이고, 스레드를 매번 만드는 것과 무엇이 다른가
- 컴파일과 JVM — 자바 코드는 어떻게 실행되는가
- 파일 입출력 — 파일에 쓰고 읽는다는 것은 무엇을 주고받는 것인가
- 라이브러리와 의존성 — 라이브러리는 무엇이고, 없으면 어떻게 되는가
Spring
- 빈 — 빈은 무엇이고, 그냥 만든 객체와 무엇이 다른가
- 의존성 주입 — 의존성 주입은 무엇을 대신해 주는가
- AOP와 프록시 — 프록시는 무엇이고, 스프링은 어떻게 내 메서드 앞뒤에 끼어드는가
- 서블릿 — 어떤 클래스를 서블릿이라고 부르는가
- 컨트롤러 — 어떤 클래스를 컨트롤러라고 부르는가
- 설정 파일 — 설정 파일은 무엇이고, 코드에 적는 것과 무엇이 다른가
- JDBC — 자바 코드는 어떻게 DB에 SQL을 보내는가
- @Transactional — @Transactional은 무엇을 묶어 주는가
- 스프링 부트 — 스프링 부트는 무엇을 대신해 주는가
- 테스트 코드 — 테스트 코드는 무엇이고, 통과와 실패는 누가 정하는가
JPA
- 엔티티 — 엔티티는 무엇이고, 일반 클래스와 무엇이 다른가
- 영속성 컨텍스트 — 영속성 컨텍스트는 무엇이고, 무엇을 해 주는가
- 리포지토리 — 리포지토리는 무엇이고, 구현은 누가 만드는가
- 연관관계 — 연관관계는 무엇이고, @ManyToOne은 무엇을 해 주는가
- 지연 로딩 — 연관된 객체는 언제 DB에서 읽어 오는가
- JPQL — JPQL은 무엇이고, SQL과 무엇이 다른가
DB
- 테이블, 행, 열 — 테이블은 어떻게 생겼고, 행과 열은 무엇인가
- 기본 키 — 기본 키는 무엇이고, 없으면 무엇이 달라지는가
- 외래 키 — 외래 키는 무엇이고, 없으면 무엇이 달라지는가
- WHERE — WHERE는 무엇을 정하고, 없으면 어떻게 되는가
- 조인 — 조인은 무엇을 이어 붙이고, ON은 무엇을 정하는가
- GROUP BY와 집계 — GROUP BY는 무엇을 묶고, COUNT와 SUM은 무엇을 세는가
- 인덱스 — 인덱스는 무엇이고, 없으면 무엇이 달라지는가
- 트랜잭션 — 트랜잭션은 무엇을 묶고, COMMIT과 ROLLBACK은 무엇을 하는가
- 행 잠금 — 두 트랜잭션이 같은 행을 고치려 하면 무슨 일이 생기는가
- 저장과 지속성 — 커밋한 데이터는 서버가 꺼져도 남는가
네트워크
- IP 주소와 포트 — IP 주소와 포트는 각각 무엇을 가리키는가
- TCP 연결 — 연결을 맺는다는 것은 무엇이고, 연결 없이 보내면 어떻게 되는가
- URL — URL은 어떤 부분들로 이루어져 있는가
- DNS — DNS는 무엇을 무엇으로 바꿔 주는가
- HTTP 요청 — HTTP 요청은 어떻게 생긴 글인가
- HTTP 메서드 — GET과 POST는 무엇이 다른가
- HTTP 응답 — HTTP 응답은 어떻게 생긴 글인가
- 쿠키 — 쿠키는 무엇이고, 누가 저장하고 누가 보내는가
- JSON — JSON은 어떻게 생긴 글이고, 무엇이 틀리면 읽히지 않는가
- HTTPS — HTTPS는 HTTP와 무엇이 다른가
- 프록시 서버 — 프록시 서버는 무엇이고, 사이에 끼면 무엇이 달라지는가
보안
- 인증과 인가 — 인증과 인가는 어떻게 다른가
- 세션 — 세션은 무엇이고, 로그인한 상태는 어디에 기억되는가
- 토큰 — 토큰은 무엇이고, 서버는 무엇을 보고 믿는가
- 해시 — 해시는 무엇이고, 비밀번호를 왜 해시로 저장하는가
- 암호화 — 암호화는 무엇이고, 열쇠가 없으면 어떻게 되는가
- 출처(origin) — 출처는 무엇이고, 브라우저는 왜 다른 출처를 가르는가
- 입력과 인젝션 — 사용자가 입력한 글이 코드로 읽히면 무슨 일이 생기는가
구조와 운영
- 프로세스 — 프로세스는 무엇이고, 프로그램을 두 번 실행하면 무엇이 따로인가
- 다른 서버 부르기 — 서버가 다른 서버를 부르는 것은 메서드를 부르는 것과 무엇이 다른가
- 로드 밸런서 — 서버를 여러 대 두면 요청은 어느 서버로 가는가
- 캐시 — 캐시는 무엇이고, 쓰면 무엇을 얻고 무엇을 잃는가
- 메시지 큐 — 메시지 큐는 무엇이고, 직접 부르는 것과 무엇이 다른가
- 배포 — 코드를 고치면 실행 중인 서버는 언제 바뀌는가
- Git 커밋과 브랜치 — 커밋은 무엇이고, 브랜치는 무엇을 가리키는가
문법부터 객체 지향, 컬렉션, 스레드, JVM까지. 코드가 실행될 때 안에서 무슨 일이 일어나는지를 봅니다.
기본 문법
- 변수와 타입 — 변수를 다른 변수에 대입하면 무엇이 복사되나
- 연산자와 형변환 — 7 / 2는 왜 3.5가 아니라 3이 나오나
- 조건문과 반복문 — 반복문은 몇 번 돌고, 어디에서 멈추나
- 배열 — 배열 변수를 대입하면 배열이 복사되나
클래스와 객체
자주 쓰는 클래스
예외
제네릭, 열거형, 애너테이션
- 제네릭 — List<Integer>의 <Integer>는 무엇을 막아 주나
- 열거형(enum) — enum을 숫자로 저장해 두면 왜 다른 상수가 되어 돌아오나
- 애너테이션 — @를 붙이기만 하면 정말 무슨 일이 일어나나
컬렉션
람다와 스트림
스레드와 동시성
JVM
입출력
컨테이너와 의존성 주입, AOP와 트랜잭션, 웹 요청이 처리되는 길, 스프링 부트가 대신 해 주는 일을 봅니다.
IoC 컨테이너와 DI
AOP와 프록시
데이터 접근과 트랜잭션
웹 MVC
스프링 부트
그 밖의 기능
- 테스트 — 테스트를 실행할 때 스프링 컨텍스트에는 무엇이 들어가고, 몇 번 만들어지나
- 외부 API 호출과 타임아웃 — 다른 서버를 호출했는데 답이 오지 않으면 언제까지 기다리나
- 캐시 추상화 — @Cacheable을 붙이면 메서드 본문은 언제 실행되지 않나
- 시큐리티 필터 체인 — 401과 403은 어디에서 갈리나
객체를 테이블에 저장한다는 것이 무엇인지, 영속성 컨텍스트와 연관관계, 지연 로딩, 쿼리가 언제 몇 번 나가는지를 봅니다.
시작
영속성 관리
엔티티 매핑
연관관계
프록시와 로딩
- 프록시와 지연 로딩 — 지연 로딩으로 받은 객체는 진짜 엔티티인가
- N+1 — 주문 목록 한 번 조회했는데 쿼리는 왜 여러 번 나가나
쿼리
웹 애플리케이션과 성능
테이블 설계와 SQL, 인덱스와 실행 계획, 트랜잭션과 잠금, 복제와 분산까지. 데이터가 저장되고 조회되는 과정을 봅니다.
관계형 모델과 설계
SQL
인덱스와 실행 계획
트랜잭션과 잠금
저장과 복구
확장과 분산
주소를 입력한 뒤 응답이 오기까지. DNS, TCP, HTTP, TLS와 그 사이에 놓인 장비들을 봅니다.
큰 그림
주소와 이름
- URL의 구조 — 검색어 "A&B"를 주소에 붙였더니 서버에는 "A"만 도착했다
- DNS — 도메인 이름의 주소는 누가 알고 있고, 바꾸면 언제 반영될까
- IP 주소와 서브넷 — 앞의 세 숫자가 같은 두 IP 주소는 같은 네트워크일까
- 스위치와 라우터 — 받는 IP는 서버인데 왜 라우터의 MAC 주소로 보내나
전송 계층
HTTP
보안 연결
웹 서버 앞의 장비
누구인지 확인하는 인증, 무엇을 할 수 있는지 정하는 인가, 웹 공격과 방어, 암호 기술을 봅니다.
인증
인가
- 시큐리티 필터 체인 — 401과 403은 어디에서 갈리나
- 접근 제어 — 로그인한 사용자가 주소의 번호만 바꾸면 남의 주문이 보이나
- 메서드 보안 — 메서드에 붙인 권한 검사는 언제 실행되고 언제 빠지나
웹 공격과 방어
- 웹 공격 세 가지 — 입력값을 그대로 믿으면 생기는 일
- CORS — Postman에서는 되는데 브라우저에서만 막히는 이유
- 클릭재킹과 오픈 리다이렉트 — 내 화면이 남의 페이지에 숨겨지거나, 내 주소가 사용자를 남의 사이트로 넘겨주는 일을 어떻게 막나
- 정보 누출 — 오류 응답과 로그인 실패 글귀는 무엇을 밖으로 알려 주나
- 요청 수 제한 — 초당 5건까지만 받는다는 것의 세 가지 의미
- 의존성과 공급망 — 내가 적지 않은 라이브러리는 어떻게 내 프로그램에 들어오고, 그 버전은 누가 정하나
암호 기술
트래픽이 늘 때, 서비스를 나눌 때, 배포하고 지켜볼 때의 주제입니다.
대용량 트래픽
메시지와 비동기
서비스 분리
배포와 운영
관측
- 평균과 백분위 — 평균 응답 시간은 멀쩡한데 왜 느리다는 불만이 오나
- 분산 추적 — 요청 하나가 느린데 어느 서비스 탓인가
협업