전체 글 38

[MySQL] 인덱스를 사용하는 이유, B-Tree 구조 및 동작 방식

개요MySQL InnoDB 엔진이 데이터를 디스크에 읽고 쓰는 방식을 알아보고, 인덱스를 적용하면 왜 성능이 개선되는 것인지 살펴보고자 합니다. 1. 데이터 읽기/쓰기와 디스크 드라이브 데이터베이스에서 작성한 데이터는 디스크 드라이브에 저장되어 영속됩니다. 컴퓨터에서 CPU나 메모리 등의 주요 장치는 전자식 장치지만, HDD는 기계식 장치입니다. 디스크에 데이터를 쓰고 읽는 데 걸리는 시간은 디스크 헤더를 물리적으로 움직이는 단계에서 결정됩니다. 때문에 데이터베이스 서버에서는 데이터를 읽어올 때 하드 디스크 드라이브가 병목지점이 됩니다. 이러한 단점을 개선하기 위해 SSD가 출시되었습니다. 솔리드 스테이트 드라이브는 기존의 HDD에서 플래터(원판)를 제거하고 그 대신 플래시 메모리를 장착하고 있습니다. ..

이론 2024.07.18

[네트워크] 쿠키와 세션이란? + 스프링 MVC에서 사용법

1. 쿠키 (Cookie)쿠키란?쿠키는 사용자의 브라우저에 저장되는 데이터입니다. 웹사이트는 쿠키를 사용해 사용자가 이전에 방문했을 때의 정보를 유지할 수 있습니다.장단점장점상태 유지: 사용자가 웹 사이트를 다시 방문할 때 이전 상태를 유지할 수 있습니다.간편한 구현: 브라우저에서 쿠키를 관리하기 때문에 서버 측에서 쿠키를 지정하기만 하면 되어 간단합니다.클라이언트에 저장: 서버 자원을 절약할 수 있습니다.단점보안: 쿠키는 클라이언트 측에 저장되므로 민감한 정보를 암호화하지 않으면 보안 취약점이 생길 수 있습니다.저장 용량 제한: 각 쿠키의 크기는 4KB로 제한되며, 브라우저 당 저장 가능한 쿠키 수에도 제한이 있습니다.브라우저 종속적: 브라우저 설정에 따라 쿠키 사용이 제한될 수 있습니다.사용방법서버에..

이론 2024.07.01

[MySQL] 서버 구조와 동작 원리 - MySQL 엔진, 스토리지 엔진

1. MySQL 서버 전체 구조MySQL 엔진MySQL 엔진은 커넥션 관리, SQL 명령어 처리, 캐시 & 버퍼 관리, 스레드 관리 등을 담당합니다.커넥션 핸들러: MySQL 서버 사용자인 응용 프로그램과 커넥션을 체결합니다.SQL 인터페이스: 사용자가 작성한 SQL 명령어를 DBMS 서버 내부로 전달합니다.SQL 파서: SQL 명령어를 분석해 Syntax Tree를 형성한 뒤 옵티마이저에게 전달합니다.SQL 옵티마이저: SQL 명령어를 최적화해 실행 계획을 세웁니다.캐시 & 버퍼: 데이터를 메모리에 저장하여 성능을 향상시킵니다. 스토리지 엔진데이터 저장 방식을 관리하고 실제 물리적 디스크에 접근합니다.InnoDB와 MyISAM 등이 대표적인 스토리지 엔진입니다. 핸들러 APIMySQL 엔진과 스토리지 ..

이론 2024.06.27

[Java] 자바 입출력 - 바이트 스트림과 문자 스트림이란?

1. 바이트 스트림 & 문자 스트림바이트 스트림Byte Stream은 데이터를 Byte 단위로 처리합니다.모든 종류의 파일 (텍스트, 이미지, 비디오 등) 데이터를 처리합니다.InputStream, OutputStream 클래스는 모든 바이트 기반 입출력 스트림의 최상위 추상 클래스입니다.문자 스트림Character Stream은 데이터를 Character 단위로 처리합니다.주로 텍스트 파일 데이터를 처리합니다.Reader, Writer 클래스는 모든 문자 기반 입출력 스트림의 최상위 추상 클래스입니다. 2. InputStreamReader & OutputStreamWriterInputStreamReader는 바이트 입력 스트림을 문자 입력 스트림으로 변환합니다.OutputStreamWriter는 바이트..

Java 2024.06.25

[Java] 익명 클래스, 익명 객체란?

1. 익명 클래스란익명 클래스란, 이름이 없는 클래스입니다.이름이 없는 이유는 클래스의 정의(선언)과 인스턴스화가 동시에 진행 되기 때문입니다.public class People { ...} 우리가 일반적으로 선언하는 명명 클래스는 위과 같은 .java 파일을 별도로 작성합니다.아래 클래스의 경우 People이 클래스 이름이 됩니다. 그렇다면, 익명 클래스는 왜 이름이 없는지 사용법을 통해 알아보겠습니다. 2. 어떻게 사용하는가익명 클래스는 선언과 동시에 인스턴스화 된다고 말씀 드렸는데요, 그렇기에 익명 객체라고도 불립니다.익명 객체가 구현할 수 있는 대상은 추상 클래스 또는 인터페이스입니다.AbstractClass extendedObj = new AbstractClass() { @Override ..

Java 2024.06.18

[Spring] Spring Data JPA OSIV와 지연 로딩

개요 Todo 어플리케이션에서 마감 시간 1시간 전인 Todo에 대해 사용자에게 알림을 발송하는 기능을 구현 했습니다. 매 분 0초 마다 스케줄러가 데이터베이스에서 1시간 뒤 종료되는 Todo를 조회하도록 했고, 반환된 Todo의 사용자에게 SSE 알림을 발송하도록 했습니다.   그런데 Controller에서 응답을 위해 Todo 엔티티를 DTO로 변환하는 과정에서 문제가 발생했습니다. 문제 발생 원인은 다음과 같습니다. OSIV 설정을 false로 지정했다.Todo에서 User 매핑을 설정할 때 fetchType.LAZY를 적용했다.@Transactional 범위를 넘어가는 Controller에서 Todo가 참조하는 User Proxy 객체에 접근 하니 LazyInitializationException..

Spring 2024.06.11

[Java] 자바 배열 원소를 이어 붙여서 출력하는 4가지 방법

개요 BOJ와 같은 알고리즘 문제 풀이를 하다 보면 위와 같이 일정한 패턴에 맞춰 배열 원소들을 출력해야 할 때가 있습니다. 자바에서 배열에 담긴 원소들을 형태에 맞춰 출력하는 방법 4가지를 알아보겠습니다. 1. for 문 + StringBuilderString[] arr = {"a", "b", "c", "d", "e"};StringBuilder sb = new StringBuilder();for(String str : arr) sb.append(str).append(", ");System.out.println(sb);a, b, c, d, e, 각 배열 원소를 순회하며 StringBuilder의 append를 호출해 합칠 수 있습니다. 각 원소 사이 구분자가 필요할 경우, append(구분자)를 한..

Java 2024.05.31

[디자인 패턴] Adapter 패턴 구성 요소 및 Spring Security 사례

개요 스프링 시큐리티 6.x 버전 출시 이후로 더이상 사용되지 않는 deprecated된 클래스들이 생겨났습니다. 그에 따라 기존 프로젝트에 적용했던 코드들은 직접적으로 활용하지 않을 것이 권장되었습니다. Spring Security 측이 제공한 해결책 코드에 어댑터 패턴이 적용됨을 발견했고, 해당 코드로 변경하며 공부한 내용을 정리하겠습니다. 1. 어댑터 패턴 어댑터 패턴이란 클라이언트가 호출하는 인터페이스는 정해져 있지만, 실제로 활용할 코드의 인터페이스가 일치하지 않을 때 활용하는 패턴을 말합니다. 클라이언트가 호출할 API와 무관하게 기존의 클래스를 변경하지 않고도 재활용할 수 있도록 하기 때문입니다. 이미 구현이 완료된 클래스를 재사용하고 싶은데 클라이언트가 호출할 API가 클래스의 API와 다..

이론 2024.05.30

[Java] Map을 순회하는 3가지 방법

1. entrySet() + IteratorMap은 Collection 인터페이스를 상속하지 않았기 때문에 Iterator를 갖지 않습니다.따라서 entrySet() 메서드 호출을 통해 Collection 인터페이스를 상속한 Set을 리턴한 후 Iterator로 순회하면 됩니다.Map map = new HashMap();map.put(1, "1번째 값");map.put(2, "2번째 값");Iterator> it = map.entrySet().iterator();while(it.hasNext()) { Map.Entry entry = it.next(); System.out.println("Key: " + entry.getKey()); System.out.println("Value: " + ..

Java 2024.05.28

[MySQL] 한글 데이터 ? 물음표 깨짐 해결 방법

개요 MySQL 테이블 데이터를 SELECT 했더니 한글 데이터가 ? 물음표로 출력되는 문제가 발생했습니다. 한글 깨짐 현상을 어떻게 해결할 수 있는지 알아보겠습니다. 문제 원인 우선 저는 AWS RDS에 MySQL 서버를 설치해 사용 중입니다. RDS와 동일한 VPC에 위치한 EC2의 Springboot 애플리케이션 API로 데이터를 요청했을 때는 한글이 잘 출력되었습니다.  반면 로컬 컴퓨터에서 Docker로 MySQL 컨테이너를 띄워 RDS에 접속한 상황에서는 한글 데이터가 깨졌습니다. 이를 통해 MySQL 컨테이너의 인코딩 설정이 문제가 있을 것이라 판단했습니다. SHOW variables LIKE 'character%';  위 명령어를 작성해 확인 결과 character_set_results와 ..

트러블 슈팅 2024.05.24