자바

💻 1. Java (자바)

자바는 객체 지향 언어로, 백엔드 시스템의 논리를 구현하는 핵심 도구입니다.

1.1 객체 지향 프로그래밍 (OOP - Object-Oriented Programming)

소프트웨어를 '객체'들의 집합으로 보고, 이 객체들이 서로 상호작용하도록 설계하는 방식입니다.

  • 캡슐화 (Encapsulation):

    • 정의: 관련된 데이터(속성)와 기능(메소드)을 하나의 '캡슐'(클래스)로 묶는 것.
    • 특징: 외부에서 객체 내부의 데이터를 직접 접근하지 못하게 숨기고(private), 오직 클래스가 제공하는 메소드(public getter/setter)를 통해서만 접근을 허용합니다.
    • 장점: 데이터 보호(무결성 유지)가 가능하고, 내부 구현이 변경되어도 외부에 영향을 주지 않습니다.
  • 상속 (Inheritance):

    • 정의: 부모 클래스의 속성과 메소드를 자식 클래스가 물려받아 사용하는 것 (IS-A 관계).
    • 장점: 코드의 재사용성을 높여 중복을 줄이고, 클래스 간의 계층 구조를 만들 수 있습니다.
  • 다형성 (Polymorphism):

    • 정의: '여러 가지 형태를 가질 수 있는 능력'입니다. 하나의 인터페이스나 부모 클래스 타입으로, 여러 가지 다른 자식 클래스 객체를 참조할 수 있습니다.
    • 구현:
      • 오버라이딩(Overriding): 자식 클래스가 부모 클래스의 메소드를 재정의하는 것.
      • 오버로딩(Overloading): 한 클래스 내에서 이름은 같지만 매개변수가 다른 메소드를 여러 개 정의하는 것.
    • 장점: 코드가 유연해지고, 확장성이 높아집니다. (예: List<String> list = new ArrayList<>(); 또는 new LinkedList<>();)
  • 추상화 (Abstraction):

    • 정의: 객체의 공통적인 속성과 기능(핵심)을 추출하고, 불필요한 세부 사항은 숨기는 것.
    • 구현: abstract 키워드(추상 클래스)나 interface(인터페이스)를 통해 구현합니다.
    • 장점: 복잡성을 낮추고, 설계에 집중할 수 있게 합니다.

1.2 Java 8+ (Stream & Lambda)

현대 Java 개발에서 데이터를 효율적으로 다루기 위한 필수 기능입니다.

  • 람다 (Lambda):
    • 정의: 이름이 없는 익명 함수입니다. (매개변수) -> { 실행 코드 } 형태로 작성됩니다.
    • 장점: 코드를 매우 간결하게 만들며, 함수를 변수처럼 전달할 수 있게 해줍니다.
  • 스트림 (Stream API):
    • 정의: 컬렉션(List, Set 등)의 요소들을 하나씩 순회하면서 처리(필터링, 매핑, 정렬 등)할 수 있도록 하는 '데이터의 흐름'입니다.
    • 특징: 원본 데이터를 변경하지 않고, 선언형(SQL과 유사한) 방식으로 데이터를 가공할 수 있습니다.
    • 예시: list.stream().filter(s -> s.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList());

1.3 컬렉션 프레임워크 (Collection Framework)

데이터 그룹을 저장하고 관리하는 표준화된 방식입니다.

  • List (인터페이스): 순서가 있고, 데이터 중복을 허용합니다.
    • ArrayList: 내부적으로 '배열'을 사용합니다. 특정 인덱스의 데이터를 조회(get)할 때 빠릅니다. 하지만 중간에 데이터를 삽입/삭제할 때 느립니다.
    • LinkedList: 내부적으로 '노드 연결'을 사용합니다. 중간에 데이터를 삽입/삭제할 때 빠릅니다. 하지만 특정 데이터를 조회할 때 느립니다.
  • Set (인터페이스): 순서가 없고, 데이터 중복을 허용하지 않습니다.
    • HashSet: HashMap을 기반으로 만들어져, 가장 빠른 성능(검색, 삽입)을 보입니다.
  • Map (인터페이스): Key-Value 쌍으로 데이터를 저장합니다. Key는 중복될 수 없습니다.
    • HashMap: Set과 마찬가지로 해싱(Hashing)을 사용하여 데이터를 저장하므로 검색/삽입 속도가 매우 빠릅니다. (Key의 hashCode(), equals()가 중요)

1.4 JVM (Java Virtual Machine)

자바 코드를 실행하는 '가상 머신'입니다. "Write Once, Run Anywhere (한 번 작성하면, 어디서든 실행된다)"를 가능하게 합니다.

  • JVM 메모리 구조:
    • Stack Area: 메소드 호출 정보, 지역 변수, 기본(primitive) 타입 변수가 저장됩니다. 스레드마다 개별적으로 생성됩니다.
    • Heap Area: new 키워드로 생성된 객체(인스턴스)가 저장되는 공간입니다. 모든 스레드가 공유합니다.
    • Method Area (Static Area): 클래스 정보, static 변수, 상수 등이 저장됩니다. 모든 스레드가 공유합니다.
  • GC (Garbage Collection):
    • 정의: Heap 영역에서 더 이상 참조되지 않는 객체(쓰레기)를 자동으로 찾아내어 메모리를 해제(정리)하는 작업입니다.

🏗️ 2. Spring / Spring Boot (스프링 부트)

Java를 이용한 웹 애플리케이션 개발을 쉽고 빠르며 강력하게 만들어주는 '프레임워크'입니다.

2.1 Spring Core (IoC / DI)

스프링의 가장 핵심적인 철학이자 기능입니다.

  • IoC (제어의 역전, Inversion of Control):
    • 정의: 객체의 생성, 관리, 생명주기를 개발자(내 코드)가 아닌 Spring Container(IoC 컨테이너)가 대신 해주는 것입니다.
    • 예시: 예전에는 Car car = new KoreaTire(); 처럼 개발자가 직접 객체를 생성했지만, 이제는 스프링이 객체를 생성하고 관리합니다.
  • DI (의존성 주입, Dependency Injection):
    • 정의: IoC 컨테이너가 관리하는 객체들 간의 의존관계(필요한 부품)를 컨테이너가 알아서 '주입'(연결)해주는 것입니다.
    • 방식: @Autowired (필드 주입), 생성자 주입, Setter 주입 등이 있습니다. (생성자 주입이 가장 권장됩니다.)
    • 장점: 결합도(Coupling)가 낮아집니다. 즉, Car 클래스가 KoreaTire라는 구체적인 구현을 몰라도 Tire라는 인터페이스만 알면 되므로, 코드가 유연해지고 테스트하기 쉬워집니다.

2.2 Spring MVC

웹 애플리케이션을 만들 때 사용하는 'Model-View-Controller' 디자인 패턴 기반의 프레임워크입니다.

  • 동작 흐름 (중요):
    1. Client 요청: 사용자가 URL을 요청합니다.
    2. DispatcherServlet (중앙 관제소): 모든 요청을 가장 먼저 받아서 처리할 컨트롤러를 찾습니다.
    3. HandlerMapping: 요청된 URL에 매핑되는 @Controller를 찾아냅니다.
    4. @Controller (컨트롤러): 실제 비즈니스 로직을 처리하고, 데이터를 가공(Model)한 뒤, 어떤 화면(View 이름)을 보여줄지 DispatcherServlet에 반환합니다.
    5. ViewResolver: 컨트롤러가 반환한 View 이름을 기반으로 실제 View 파일을 찾습니다.
    6. View (응답): 데이터를 HTML(JSP, Thymeleaf)이나 JSON(Rest API) 형태로 렌더링하여 Client에게 최종 응답을 보냅니다.

2.3 RESTful API

API를 설계하는 스타일 중 하나로, '자원(Resource)'을 'URI'로 표현하고 '행위(Verb)'를 'HTTP Method'로 정의하는 방식입니다.

  • 자원 (URI): /users/1 (1번 유저)
  • 행위 (HTTP Method):
    • GET (조회): /users/1 (1번 유저 정보 조회)
    • POST (생성): /users (새로운 유저 생성)
    • PUT / PATCH (수정): /users/1 (1번 유저 정보 수정)
    • DELETE (삭제): /users/1 (1번 유저 삭제)

2.4 Spring Data JPA (ORM)

DB 작업을 SQL 쿼리 없이 '자바 객체'로 처리할 수 있게 해주는 기술입니다.

  • ORM (Object-Relational Mapping):
    • 정의: 객체(Object, Java Class)와 관계형 DB(Relational, Table)를 자동으로 매핑(연결)해주는 기술입니다.
    • JPA: ORM의 '표준 명세(인터페이스)'이며, Hibernate는 이 명세를 구현한 '구현체'입니다.
  • 핵심 개념:
    • @Entity: 이 자바 클래스가 DB 테이블과 매핑된다고 알려줍니다.
    • Repository: JpaRepository 인터페이스를 상속받으면, save(), findById(), findAll(), delete() 등 기본적인 CRUD 쿼리를 메소드 호출만으로 실행할 수 있습니다.
  • N+1 문제 (면접 단골):
    • 현상: 1개의 쿼리로 N개의 데이터를 가져왔는데(예: 게시글 10개 조회), 이 N개의 데이터가 각각 연관된 데이터를(예: 각 게시글의 댓글) 참조할 때 N개의 추가 쿼리가 발생하는 문제입니다. (총 1 + N개의 쿼리 실행)
    • 해결: Fetch Join (JPQL)을 사용하거나 엔티티의 fetch 전략을 EAGER 대신 LAZY + BatchSize 설정 등으로 해결합니다.

2.5 Spring Security

스프링 기반 애플리케이션의 '보안(인증, 인가)'을 담당하는 강력한 프레임워크입니다.

  • 인증 (Authentication): "당신은 누구입니까?" (로그인). 사용자의 신원을 확인하는 절차.
  • 인가 (Authorization): "당신은 무엇을 할 수 있습니까?" (권한). 인증된 사용자가 특정 자원에 접근할 수 있는지 권한(ADMIN, USER 등)을 확인하는 절차.
  • JWT (JSON Web Token):
    • 정의: 인증 정보를 담은 암호화된 '토큰'입니다.
    • 동작: 사용자가 로그인하면 서버가 JWT 토큰을 발급 -> 클라이언트는 이 토큰을 저장했다가 매 요청마다 헤더에 담아 보냄 -> 서버는 토큰을 검증하여 사용자를 인증합니다. (서버가 세션을 저장할 필요가 없어 Stateless 구조에 유리)

💾 3. Database (데이터베이스)

데이터를 체계적으로 저장, 관리, 검색하는 시스템입니다.

3.1 RDBMS (관계형 데이터베이스)

데이터를 정해진 스키마(구조)에 따라 '테이블' 형태로 저장하며, 테이블 간의 '관계'를 통해 데이터를 관리합니다. (예: MySQL, PostgreSQL)

3.2 SQL (JOIN)

여러 테이블에 흩어져 있는 데이터를 '관계'를 이용해 하나로 합쳐서 가져오는 SQL 명령어입니다.

  • INNER JOIN (내부 조인): 두 테이블에 모두 공통적으로 존재하는 데이터(교집합)만 가져옵니다.
  • OUTER JOIN (외부 조인):
    • LEFT JOIN: 왼쪽 테이블의 데이터는 모두 가져오고, 오른쪽 테이블은 매칭되는 데이터만 가져옵니다. (매칭 안 되면 NULL)
    • RIGHT JOIN: 오른쪽 테이블의 데이터는 모두 가져오고, 왼쪽 테이블은 매칭되는 데이터만 가져옵니다.

3.3 인덱스 (Index)

데이터베이스의 검색(SELECT) 속도를 획기적으로 향상시키는 자료 구조입니다. (책의 '찾아보기'와 동일)

  • 원리: 데이터가 저장된 물리적 주소를, 특정 컬럼(값)을 기준으로 정렬하여 별도의 공간에 저장해 둡니다. (주로 B-Tree 자료 구조 사용)
  • 장점: WHERE 절이나 ORDER BY 절을 사용한 검색 시 매우 빠릅니다.
  • 단점:
    • INSERT, UPDATE, DELETE 시 인덱스 테이블도 함께 수정해야 하므로 쓰기 속도는 느려집니다.
    • 인덱스를 저장할 추가적인 저장 공간이 필요합니다.

3.4 트랜잭션 (Transaction)

'전부 성공하거나, 전부 실패해야 하는' 쪼갤 수 없는 논리적인 작업 단위입니다. (예: 계좌 이체 - A 출금, B 입금)

  • ACID (트랜잭션의 4가지 특성):
    • 원자성 (Atomicity): 작업이 전부 실행되거나(Commit), 전부 실행되지 않아야(Rollback) 합니다.
    • 일관성 (Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
    • 고립성 (Isolation): 여러 트랜잭션이 동시에 실행될 때, 서로의 작업에 영향을 주지 않아야 합니다. (마치 혼자 실행되는 것처럼)
    • 지속성 (Durability): 성공적으로 완료된 트랜잭션의 결과는 시스템에 영구적으로 저장되어야 합니다.

0개의 댓글